From eccd0543eae33e4abb113e9760f89cde78ff0067 Mon Sep 17 00:00:00 2001 From: zyjiaobj Date: Thu, 19 Dec 2019 13:27:55 +0800 Subject: [PATCH 001/176] [autoscaler] add custom metric support --- .../autoscaler-transform-metric.ts | 10 +- .../autoscaler-transform-policy.ts | 6 +- .../autoscaler-helpers/autoscaler-util.ts | 17 +- .../autoscaler-validation.ts | 5 + .../src/core/autoscaler.module.ts | 2 + .../src/core/autoscaler.routing.ts | 5 + .../autoscaler-tab-extension.component.html | 25 +-- .../autoscaler-tab-extension.component.ts | 27 ++- .../edit-autoscaler-credential.component.html | 64 +++++++ .../edit-autoscaler-credential.component.scss | 22 +++ ...it-autoscaler-credential.component.spec.ts | 50 ++++++ .../edit-autoscaler-credential.component.ts | 160 ++++++++++++++++++ ...dit-autoscaler-policy-step2.component.html | 24 ++- ...dit-autoscaler-policy-step2.component.scss | 11 ++ .../edit-autoscaler-policy-step2.component.ts | 30 +++- .../edit-autoscaler-policy-step3.component.ts | 5 - .../src/store/app-autoscaler.actions.ts | 31 +++- .../src/store/app-autoscaler.types.ts | 13 ++ .../src/store/autoscaler-entity-factory.ts | 7 + .../src/store/autoscaler-entity-generator.ts | 13 +- .../src/store/autoscaler.effects.ts | 60 +++++++ .../plugins/autoscaler/autoscaler.go | 20 +++ src/jetstream/plugins/autoscaler/main.go | 2 + 23 files changed, 567 insertions(+), 42 deletions(-) create mode 100644 src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.html create mode 100644 src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.scss create mode 100644 src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.spec.ts create mode 100644 src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.ts 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..e090b4457a 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 @@ -64,6 +64,10 @@ export class AutoscalerConstants { instance_max_count: 10, initial_min_instance_count: 5 }; + public static CredentialDefault = { + username: 'my-username', + password: 'my-password', + }; public static metricMap: { [metricName: string]: AppAutoscalerMetricMapInfo } = { memoryused: { @@ -88,11 +92,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 +122,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..16e7b2bc38 100644 --- a/src/frontend/packages/cf-autoscaler/src/core/autoscaler.module.ts +++ b/src/frontend/packages/cf-autoscaler/src/core/autoscaler.module.ts @@ -23,6 +23,7 @@ import { EditAutoscalerPolicyStep4Component, } from '../features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component'; import { EditAutoscalerPolicyComponent } from '../features/edit-autoscaler-policy/edit-autoscaler-policy.component'; +import { EditAutoscalerCredentialComponent } from '../features/edit-autoscaler-credential/edit-autoscaler-credential.component'; import { CardAutoscalerDefaultComponent } from '../shared/card-autoscaler-default/card-autoscaler-default.component'; import { TableCellAutoscalerEventChangeIconPipe, @@ -65,6 +66,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-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..cd6dee7a5d 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,11 @@ delete Delete Policy + + + +
+ + + + + +
Custom metrics credential
+
+ + + +
+
+ Create random credential + Create specified + credential + +
+ + + + Username is required + + + + + + Password is required + + +
+
+
+
+
+ + + + +
A new credential generated. Please update the credential setting, and restart your application to + ensure your env variable changes take effect.
+
+ + +
{{ credential | json }}
+
+
+
+
+
+
+
\ 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..6239258751 --- /dev/null +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.scss @@ -0,0 +1,22 @@ +.autoscaler-credential-form { + display: flex; + flex-direction: column; + margin-top: 10px; + max-width: 450px; + mat-form-field { + width: 100%; + } + .autoscaler-credential-toggle { + padding: 1em 0 1em 0; + span { + margin-right: .8em; + } + } +} + +.autoscaler-credential-submit { + margin-top: 1em; + margin-right: 1em; +} + + 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..50682c3a1c --- /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 { CoreModule } from '../../../../core/src/core/core.module'; +import { ApplicationService } from '../../../../core/src/features/applications/application.service'; +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 { createBasicStoreModule } from '../../../../core/test-framework/store-test-helper'; +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..1499f2a13d --- /dev/null +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.ts @@ -0,0 +1,160 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Observable, Subscription } from 'rxjs'; +import { map, publishReplay, refCount, distinctUntilChanged, filter, first, pairwise } from 'rxjs/operators'; +import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material'; +import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material'; + +import { AppState } from '../../../../store/src/app-state'; +import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; +import { AppAutoscalerCredential } from '../../store/app-autoscaler.types'; +import { UpdateAppAutoscalerCredentialAction, DeleteAppAutoscalerCredentialAction } from '../../store/app-autoscaler.actions'; +import { EntityService } from '../../../../core/src/core/entity-service'; +import { EntityServiceFactory } from '../../../../core/src/core/entity-service-factory.service'; +import { entityCatalogue } from '../../../../core/src/core/entity-catalogue/entity-catalogue.service'; +import { safeUnsubscribe } from '../../../../core/src/core/utils.service'; +import { AutoscalerConstants } from '../../core/autoscaler-helpers/autoscaler-util'; +import { ConfirmationDialogConfig } from '../../../../core/src/shared/components/confirmation-dialog.config'; +import { ActionState } from '../../../../store/src/reducers/api-request-reducer/types'; +import { selectDeletionInfo } from '../../../../store/src/selectors/api.selectors'; +import { ConfirmationDialogService } from '../../../../core/src/shared/components/confirmation-dialog.service'; + +@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 randomCredential = true; + public appAutoscalerCredential$: Observable; + + private appAutoscalerCredentialErrorSub: Subscription; + private appAutoscalerCredentialSnackBarRef: MatSnackBarRef; + + constructor( + public applicationService: ApplicationService, + private fb: FormBuilder, + private store: Store, + private entityServiceFactory: EntityServiceFactory, + private appAutoscalerCredentialSnackBar: MatSnackBar, + private confirmDialog: ConfirmationDialogService, + ) { + this.editCredentialForm = this.fb.group({ + acusername: new FormControl({ value: '', disabled: this.randomCredential }, Validators.required), + acpassword: new FormControl({ value: '', disabled: this.randomCredential }, 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() { + this.randomCredential = !this.randomCredential; + if (this.randomCredential) { + 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(AutoscalerConstants.CredentialDefault.username); + this.editCredentialForm.controls.acpassword.setValue(AutoscalerConstants.CredentialDefault.password); + this.editCredentialForm.controls.acusername.enable(); + this.editCredentialForm.controls.acpassword.enable(); + } + } + + createCredential() { + let action: UpdateAppAutoscalerCredentialAction; + if (this.randomCredential) { + 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, + }; + if (!credential.username || !credential.password) { + return; + } + 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( + map(({ entity }) => entity ? entity.entity : null), + publishReplay(1), + refCount() + ); + updateAppAutoscalerCredentialService.entityMonitor.entityRequest$.pipe( + filter(request => !!request.error), + map(request => { + const msg = request.message; + request.error = false; + request.message = ''; + return msg; + }), + distinctUntilChanged(), + ).subscribe(errorMessage => { + if (this.appAutoscalerCredentialSnackBarRef) { + this.appAutoscalerCredentialSnackBarRef.dismiss(); + } + this.appAutoscalerCredentialSnackBarRef = this.appAutoscalerCredentialSnackBar.open(errorMessage, 'Dismiss'); + }); + this.store.dispatch(action); + } + + deleteCredentialConfirm() { + const confirmation = new ConfirmationDialogConfig( + 'Delete Credential', + 'Are you sure you want to delete the credential?', + 'Delete', + true + ); + this.confirmDialog.open(confirmation, () => { + const doUpdate = () => this.deleteCredential(); + doUpdate().pipe( + first(), + ).subscribe(actionState => { + if (actionState.error) { + this.appAutoscalerCredentialSnackBarRef = + this.appAutoscalerCredentialSnackBar.open(`Failed to delete credential: ${actionState.message}`, 'Dismiss'); + } + }); + }); + } + + deleteCredential(): Observable { + const action = new DeleteAppAutoscalerCredentialAction(this.applicationService.appGuid, this.applicationService.cfGuid); + this.store.dispatch(action); + const entityKey = entityCatalogue.getEntityKey(action); + + return this.store.select(selectDeletionInfo(entityKey, this.applicationService.appGuid)).pipe( + pairwise(), + filter(([oldV, newV]) => oldV.busy && !newV.busy), + map(([, newV]) => newV) + ); + } + +} 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..3644b024ca 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,16 +12,18 @@
- 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.
If average - - + + + {{ metricType }} @@ -39,10 +41,10 @@ - - {{metricUnit$ | async}} - - for + + + + {{getMetricUnit(editMetricType)}} for @@ -66,6 +68,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..93413f1bd3 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,14 @@ font-size: 85%; } } + +.autoscaler-edit-select { + input { + background: white; + left: 0em; + position: absolute; + top: .5em; + width: 90%; + z-index: 200; + } +} \ No newline at end of file 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..faef01ecdd 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 @@ -17,6 +17,7 @@ import { getThresholdMax, getThresholdMin, numberWithFractionOrExceedRange, + inValidMetricType, } from '../../../core/autoscaler-helpers/autoscaler-validation'; import { AppAutoscalerInvalidPolicyError, AppAutoscalerPolicyLocal } from '../../../store/app-autoscaler.types'; import { EditAutoscalerPolicy } from '../edit-autoscaler-policy-base-step'; @@ -56,9 +57,11 @@ 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()]], + metric_type_select: [0, this.validateTriggerMetricTypeSelect()], 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), @@ -98,8 +101,10 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp this.editAdjustmentType = getAdjustmentType(this.currentPolicy.scaling_rules_form[index].adjustment); this.editTriggerForm.setValue({ metric_type: this.editMetricType, + metric_type_select: 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 +120,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 = @@ -133,10 +139,24 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp } validateTriggerMetricType(): ValidatorFn { + return (control: AbstractControl): { [key: string]: any } => { + if (!this.editTriggerForm) { + 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; + }; + } + + validateTriggerMetricTypeSelect(): ValidatorFn { return (control: AbstractControl): { [key: string]: any } => { if (this.editTriggerForm) { - this.editMetricType = control.value; - this.editTriggerForm.controls.threshold.updateValueAndValidity(); + this.editTriggerForm.controls.metric_type.setValue(control.value); } return null; }; @@ -196,8 +216,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.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/store/app-autoscaler.actions.ts b/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.actions.ts index 679ec56335..e889929a5c 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 @@ -3,7 +3,7 @@ import { createEntityRelationPaginationKey } from '../../../cloud-foundry/src/en 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 { AppAutoscalerPolicyLocal, AppScalingTrigger, AppAutoscalerCredential } from './app-autoscaler.types'; import { appAutoscalerAppMetricEntityType, appAutoscalerHealthEntityType, @@ -11,6 +11,7 @@ import { appAutoscalerPolicyEntityType, appAutoscalerPolicyTriggerEntityType, appAutoscalerScalingHistoryEntityType, + appAutoscalerCredentialEntityType, AUTOSCALER_ENDPOINT_TYPE, autoscalerEntityFactory, } from './autoscaler-entity-factory'; @@ -45,6 +46,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 +238,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; +} + +export class DeleteAppAutoscalerCredentialAction implements EntityRequestAction { + static updateKey = 'Deleting-Application-Credential'; + 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..bfb1e3c860 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 { @@ -147,6 +148,7 @@ export interface AppAutoscalerFetchPolicyFailedResponse { } export interface AppAutoscalerInvalidPolicyError { + alertInvalidPolicyTriggerMetricName?: AppAutoscalerInvalidPolicyErrorEntity; alertInvalidPolicyTriggerThreshold100?: AppAutoscalerInvalidPolicyErrorEntity; alertInvalidPolicyTriggerThresholdRange?: AppAutoscalerInvalidPolicyErrorEntity; alertInvalidPolicyTriggerStepRange?: AppAutoscalerInvalidPolicyErrorEntity; @@ -162,3 +164,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..714b7523b5 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 @@ -9,6 +9,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 +41,12 @@ entityCache[appAutoscalerInfoEntityType] = new AutoscalerEntitySchema( { idAttribute: getAPIResourceGuid } ); +entityCache[appAutoscalerCredentialEntityType] = new AutoscalerEntitySchema( + appAutoscalerCredentialEntityType, + {}, + { idAttribute: getAPIResourceGuid } +); + entityCache[appAutoscalerPolicyEntityType] = new AutoscalerEntitySchema( appAutoscalerPolicyEntityType, {}, 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..a776780c39 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 @@ -22,6 +22,7 @@ import { appAutoscalerPolicyEntityType, appAutoscalerPolicyTriggerEntityType, appAutoscalerScalingHistoryEntityType, + appAutoscalerCredentialEntityType, AUTOSCALER_ENDPOINT_TYPE, autoscalerEntityFactory, } from './autoscaler-entity-factory'; @@ -44,7 +45,8 @@ export function generateASEntities(): StratosBaseCatalogEntity[] { generateHealthEntity(endpointDefinition), generateScalingEntity(endpointDefinition), generateAppMetricEntity(endpointDefinition), - generateMetricEntity(endpointDefinition) + generateMetricEntity(endpointDefinition), + generateCredentialEntity(endpointDefinition), ]; } @@ -57,6 +59,15 @@ function generatePolicyEntity(endpointDefinition: IStratosEndpointDefinition) { return new StratosCatalogEntity>(definition); } +function generateCredentialEntity(endpointDefinition: IStratosEndpointDefinition) { + const definition = { + type: appAutoscalerCredentialEntityType, + schema: autoscalerEntityFactory(appAutoscalerCredentialEntityType), + endpoint: endpointDefinition + }; + return new StratosCatalogueEntity>(definition); +} + function generateInfoEntity(endpointDefinition: IStratosEndpointDefinition) { const definition = { type: appAutoscalerInfoEntityType, 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..d963b1635b 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts @@ -36,6 +36,8 @@ import { APP_AUTOSCALER_SCALING_HISTORY, AUTOSCALER_INFO, AutoscalerPaginationParams, + UPDATE_APP_AUTOSCALER_CREDENTIAL, + DELETE_APP_AUTOSCALER_CREDENTIAL, AutoscalerQuery, CREATE_APP_AUTOSCALER_POLICY, CreateAppAutoscalerPolicyAction, @@ -50,6 +52,8 @@ import { GetAppAutoscalerScalingHistoryAction, UPDATE_APP_AUTOSCALER_POLICY, UpdateAppAutoscalerPolicyAction, + UpdateAppAutoscalerCredentialAction, + DeleteAppAutoscalerCredentialAction, } from './app-autoscaler.actions'; import { AppAutoscalerEvent, @@ -59,6 +63,7 @@ import { AppAutoscalerPolicy, AppAutoscalerPolicyLocal, AppScalingTrigger, + AppAutoscalerCredential, } from './app-autoscaler.types'; const { proxyAPIVersion } = environment; @@ -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 = entityCatalogue.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 = entityCatalogue.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/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) } From 24ec1c6edebd03379affdcba8c75356c744fec74 Mon Sep 17 00:00:00 2001 From: zyjiaobj Date: Thu, 19 Dec 2019 14:13:54 +0800 Subject: [PATCH 002/176] [autoscaler] fix credential edit pager test error --- .../edit-autoscaler-credential.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 50682c3a1c..67aa232e81 100644 --- 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 @@ -4,7 +4,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../core/src/core/core.module'; -import { ApplicationService } from '../../../../core/src/features/applications/application.service'; +import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; import { SharedModule } from '../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../core/tab-nav.service'; import { ApplicationServiceMock } from '../../../../core/test-framework/application-service-helper'; From 80f5de1661df21b54b6e42b831ff368c3c132012 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Wed, 1 Apr 2020 20:01:10 +0100 Subject: [PATCH 003/176] Remove @nrwl --- angular.json | 2 +- package.json | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/angular.json b/angular.json index 9d29bc4da8..43d24281ff 100644 --- a/angular.json +++ b/angular.json @@ -330,6 +330,6 @@ } }, "cli": { - "defaultCollection": "@nrwl/angular" + "_defaultCollection": "@nrwl/angular" } } \ No newline at end of file diff --git a/package.json b/package.json index b278bf16eb..3c9e3c6a32 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,7 @@ "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", @@ -90,8 +88,7 @@ "web-animations-js": "^2.3.2", "xterm": "^4.0.2", "xterm-addon-fit": "^0.3.0", - "zone.js": "~0.10.2", - "@nrwl/angular": "8.5.2" + "zone.js": "~0.10.2" }, "engines": { "node": "12.13.0" @@ -148,7 +145,6 @@ "tsickle": "^0.37.0", "tslib": "^1.9.0", "tslint": "~5.20.0", - "typescript": "<3.6.0", - "@nrwl/workspace": "8.5.2" + "typescript": "<3.6.0" } } From 02f0e1d8a944f3bbed578ee98deee3b14517e85e Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Wed, 1 Apr 2020 20:03:12 +0100 Subject: [PATCH 004/176] Update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3c9e3c6a32..c9d8de8f45 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@angular/common": "^8.2.9", "@angular/compiler": "^8.2.9", "@angular/core": "^8.2.9", - "@angular/flex-layout": "^8.0.0-beta.27", + "@angular/flex-layout": "^9.0.0-beta.29", "@angular/forms": "^8.2.9", "@angular/material": "^8.2.2", "@angular/material-moment-adapter": "^8.2.2", @@ -144,7 +144,7 @@ "ts-node": "~8.4.1", "tsickle": "^0.37.0", "tslib": "^1.9.0", - "tslint": "~5.20.0", + "tslint": "~6.1.0", "typescript": "<3.6.0" } } From 64ea234651dd14864e282d5a787d37aa262fb12b Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Wed, 1 Apr 2020 20:04:02 +0100 Subject: [PATCH 005/176] Update lock file --- package-lock.json | 5039 ++++++++++++++++++++------------------------- 1 file changed, 2204 insertions(+), 2835 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f145e3968..de9410d41f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } } } @@ -95,10 +95,10 @@ "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": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "glob": { @@ -107,12 +107,12 @@ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } }, "parse5": { @@ -127,7 +127,7 @@ "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "semver": { @@ -160,7 +160,7 @@ "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } } } @@ -210,7 +210,7 @@ "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } } } @@ -234,10 +234,10 @@ "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": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "rxjs": { @@ -246,7 +246,7 @@ "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "source-map": { @@ -273,7 +273,7 @@ "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } } } @@ -283,7 +283,7 @@ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.9.tgz", "integrity": "sha512-l30AF0d9P5okTPM1wieUHgcnDyGSNvyaBcxXSOkT790wAP2v5zs7VrKq9Lm+ICu4Nkx07KrOr5XLUHhqsg3VXA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@angular/cdk": { @@ -291,8 +291,8 @@ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.2.tgz", "integrity": "sha512-e+BtFab0Vd1q/ZVu6l850Q4vvgyVYiugSX31oMRlp86fKHPowlAO7jL3z5JcAG7TybpLIqd7oqF8XQBR/yw83w==", "requires": { - "parse5": "5.1.0", - "tslib": "1.10.0" + "parse5": "^5.0.0", + "tslib": "^1.7.1" } }, "@angular/cli": { @@ -308,7 +308,7 @@ "@schematics/update": "0.803.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", @@ -318,8 +318,8 @@ "read-package-tree": "5.3.1", "semver": "6.3.0", "symbol-observable": "1.2.0", - "universal-analytics": "0.4.20", - "uuid": "3.3.3" + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" }, "dependencies": { "ansi-colors": { @@ -334,7 +334,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -356,7 +356,7 @@ "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.9.tgz", "integrity": "sha512-76WDU1USlI5vAzqCJ3gxCQGuu57aJEggNk/xoWmQEXipiFTFBh2wSKn/dE6Txr/q3COTPIcrmb9OCeal5kQPIA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@angular/compiler": { @@ -364,7 +364,7 @@ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.9.tgz", "integrity": "sha512-oQho19DnOhEDNerCOGuGK95tcZ2oy4dSA5SykJmmniRnZzPM2++bJD32qJehXHy1K+3hv2zN9x7HPhqT3ljT6g==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@angular/compiler-cli": { @@ -374,14 +374,14 @@ "dev": true, "requires": { "canonical-path": "1.0.0", - "chokidar": "2.1.8", - "convert-source-map": "1.6.0", - "dependency-graph": "0.7.2", - "magic-string": "0.25.3", - "minimist": "1.2.0", - "reflect-metadata": "0.1.13", - "source-map": "0.6.1", - "tslib": "1.10.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", "yargs": "13.1.0" }, "dependencies": { @@ -397,18 +397,18 @@ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.3", - "braces": "2.3.2", - "fsevents": "1.2.9", - "glob-parent": "3.1.0", - "inherits": "2.0.4", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.2.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" } }, "cliui": { @@ -417,9 +417,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -428,8 +428,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } } } @@ -464,7 +464,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "mem": { @@ -473,9 +473,9 @@ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, "normalize-path": { @@ -490,9 +490,9 @@ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.3.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "require-main-filename": { @@ -513,9 +513,9 @@ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { @@ -530,7 +530,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } } } @@ -541,7 +541,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "which-module": { @@ -556,17 +556,17 @@ "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", "dev": true, "requires": { - "cliui": "4.1.0", - "find-up": "3.0.0", - "get-caller-file": "2.0.5", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "2.0.0", - "set-blocking": "2.0.0", - "string-width": "3.1.0", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "13.1.1" + "cliui": "^4.0.0", + "find-up": "^3.0.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", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" } }, "yargs-parser": { @@ -575,8 +575,8 @@ "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -586,23 +586,20 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.9.tgz", "integrity": "sha512-GpHAuLOlN9iioELCQBmAsjETTUCyFgVUI3LXwh3e63jnpd+ZuuZcZbjfTYhtgYVNMetn7cVEO6p88eb7qvpUWQ==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@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.10.0" - } + "version": "9.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-9.0.0-beta.29.tgz", + "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" }, "@angular/forms": { "version": "8.2.9", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.9.tgz", "integrity": "sha512-kAdBuApC9PPOdPI8BmNhxCraAkXGbX/PkVan8pQ5xdumvgGqvVjbJvLaUSbJROPtgCRlQyiEDrHFd4gk/WU76A==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@angular/language-service": { @@ -616,7 +613,7 @@ "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.2.tgz", "integrity": "sha512-mR2ppE+Z1S5As2SUFK8wUH76Fj7YgrefhrwVGaeCLcAen//RHPw043+KL2apPAUaltdIFlGFtUuA6yJN6av0nQ==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.7.1" } }, "@angular/material-moment-adapter": { @@ -624,7 +621,7 @@ "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-8.2.2.tgz", "integrity": "sha512-HZYoVssNh+uon0SszUDtVTWmjah5vtEJOYVYl9BakE6dC+Z4910B+/hVQ1HfOdas5mHpjxVoYpbIoe4QG5sc5A==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.7.1" } }, "@angular/platform-browser": { @@ -632,7 +629,7 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.9.tgz", "integrity": "sha512-k3aNZy0OTqGn7HlHHV52QF6ZAP/VlQhWGD2u5e1dWIWMq39kdkdSCNu5tiuAf5hIzMBiSQ0tjnuVWA4MuDBYIQ==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@angular/platform-browser-dynamic": { @@ -640,7 +637,7 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.9.tgz", "integrity": "sha512-GbE4TUy4n/a8yp8fLWwdG/QnjUPZZ8VufItZ7GvOpoyknzegvka111dLctvMoPzSAsrKyShL6cryuyDC5PShUA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@angular/platform-server": { @@ -648,9 +645,9 @@ "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.2.9.tgz", "integrity": "sha512-rr6h82+DdUGhpsF3WT3eLk5itjZDXe7SiNtRGHkPj+yTyFAxuTKA3cX0N7LWsGGIFax+s1vQhMreV4YcyHKGPQ==", "requires": { - "domino": "2.1.3", - "tslib": "1.10.0", - "xhr2": "0.1.4" + "domino": "^2.1.2", + "tslib": "^1.9.0", + "xhr2": "^0.1.4" } }, "@angular/router": { @@ -658,58 +655,63 @@ "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.9.tgz", "integrity": "sha512-4P60CWNB/jxGjDBEuYN0Jobt76QlebAQeFBTDswRVwRlq/WJT4QhL3a8AVIRsHn9bQII0LUt/ZQBBPxn7h9lSA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, "requires": { - "@babel/highlight": "7.5.0" + "@babel/highlight": "^7.0.0" } }, "@babel/core": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "@babel/generator": "7.6.2", - "@babel/helpers": "7.6.2", - "@babel/parser": "7.6.2", - "@babel/template": "7.6.0", - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1", - "convert-source-map": "1.6.0", - "debug": "4.1.1", - "json5": "2.1.1", - "lodash": "4.17.15", - "resolve": "1.12.0", - "semver": "5.6.0", - "source-map": "0.5.6" + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" }, "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.2" + "ms": "^2.1.1" } }, "json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" } }, "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 } } }, @@ -717,17 +719,19 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "dev": true, "requires": { - "@babel/types": "7.6.1", - "jsesc": "2.5.2", - "lodash": "4.17.15", - "source-map": "0.5.6" + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" }, "dependencies": { "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true } } }, @@ -735,357 +739,397 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, "requires": { - "@babel/types": "7.6.1" + "@babel/types": "^7.0.0" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "7.1.0", - "@babel/types": "7.6.1" + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-call-delegate": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, "requires": { - "@babel/helper-hoist-variables": "7.4.4", - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1" + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/helper-define-map": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/types": "7.6.1", - "lodash": "4.17.15" + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, "requires": { - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1" + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-function-name": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, "requires": { - "@babel/helper-get-function-arity": "7.0.0", - "@babel/template": "7.6.0", - "@babel/types": "7.6.1" + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-get-function-arity": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, "requires": { - "@babel/types": "7.6.1" + "@babel/types": "^7.0.0" } }, "@babel/helper-hoist-variables": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, "requires": { - "@babel/types": "7.6.1" + "@babel/types": "^7.4.4" } }, "@babel/helper-member-expression-to-functions": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, "requires": { - "@babel/types": "7.6.1" + "@babel/types": "^7.5.5" } }, "@babel/helper-module-imports": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, "requires": { - "@babel/types": "7.6.1" + "@babel/types": "^7.0.0" } }, "@babel/helper-module-transforms": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-simple-access": "7.1.0", - "@babel/helper-split-export-declaration": "7.4.4", - "@babel/template": "7.6.0", - "@babel/types": "7.6.1", - "lodash": "4.17.15" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, "requires": { - "@babel/types": "7.6.1" + "@babel/types": "^7.0.0" } }, "@babel/helper-plugin-utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true }, "@babel/helper-regex": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, "requires": { - "lodash": "4.17.15" + "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-wrap-function": "7.2.0", - "@babel/template": "7.6.0", - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-replace-supers": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "7.5.5", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1" + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/helper-simple-access": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, "requires": { - "@babel/template": "7.6.0", - "@babel/types": "7.6.1" + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-split-export-declaration": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, "requires": { - "@babel/types": "7.6.1" + "@babel/types": "^7.4.4" } }, "@babel/helper-wrap-function": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/template": "7.6.0", - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1" + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" } }, "@babel/helpers": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "dev": true, "requires": { - "@babel/template": "7.6.0", - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1" + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.2", + "@babel/types": "^7.6.0" } }, "@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.4.2", - "esutils": "2.0.3", - "js-tokens": "4.0.0" + "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true } } }, "@babel/parser": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==" + "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==", + "dev": true }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0", - "@babel/plugin-syntax-async-generators": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" } }, "@babel/plugin-proposal-dynamic-import": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-dynamic-import": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" } }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-json-strings": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" } }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-object-rest-spread": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" } }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" } }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5", - "regexpu-core": "4.6.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/plugin-syntax-async-generators": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-arrow-functions": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" } }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz", "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "lodash": "4.17.15" + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-define-map": "7.5.5", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.5.5", - "@babel/helper-split-export-declaration": "7.4.4", - "globals": "11.12.0" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true } } }, @@ -1093,1302 +1137,453 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-destructuring": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5", - "regexpu-core": "4.6.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/plugin-transform-duplicate-keys": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-for-of": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-literals": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, "requires": { - "@babel/helper-module-transforms": "7.5.5", - "@babel/helper-plugin-utils": "7.0.0", - "babel-plugin-dynamic-import-node": "2.3.0" + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, "requires": { - "@babel/helper-module-transforms": "7.5.5", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-simple-access": "7.1.0", - "babel-plugin-dynamic-import-node": "2.3.0" + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, "requires": { - "@babel/helper-hoist-variables": "7.4.4", - "@babel/helper-plugin-utils": "7.0.0", - "babel-plugin-dynamic-import-node": "2.3.0" + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, "requires": { - "@babel/helper-module-transforms": "7.5.5", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==", + "dev": true, "requires": { - "regexpu-core": "4.6.0" + "regexpu-core": "^4.6.0" } }, "@babel/plugin-transform-new-target": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.5.5" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" } }, "@babel/plugin-transform-parameters": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, "requires": { - "@babel/helper-call-delegate": "7.4.4", - "@babel/helper-get-function-arity": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-property-literals": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-regenerator": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, "requires": { - "regenerator-transform": "0.14.1" + "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-sticky-regex": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" } }, "@babel/plugin-transform-template-literals": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5", - "regexpu-core": "4.6.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/preset-env": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-proposal-async-generator-functions": "7.2.0", - "@babel/plugin-proposal-dynamic-import": "7.5.0", - "@babel/plugin-proposal-json-strings": "7.2.0", - "@babel/plugin-proposal-object-rest-spread": "7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "7.6.2", - "@babel/plugin-syntax-async-generators": "7.2.0", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/plugin-syntax-json-strings": "7.2.0", - "@babel/plugin-syntax-object-rest-spread": "7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "7.2.0", - "@babel/plugin-transform-arrow-functions": "7.2.0", - "@babel/plugin-transform-async-to-generator": "7.5.0", - "@babel/plugin-transform-block-scoped-functions": "7.2.0", - "@babel/plugin-transform-block-scoping": "7.6.2", - "@babel/plugin-transform-classes": "7.5.5", - "@babel/plugin-transform-computed-properties": "7.2.0", - "@babel/plugin-transform-destructuring": "7.6.0", - "@babel/plugin-transform-dotall-regex": "7.6.2", - "@babel/plugin-transform-duplicate-keys": "7.5.0", - "@babel/plugin-transform-exponentiation-operator": "7.2.0", - "@babel/plugin-transform-for-of": "7.4.4", - "@babel/plugin-transform-function-name": "7.4.4", - "@babel/plugin-transform-literals": "7.2.0", - "@babel/plugin-transform-member-expression-literals": "7.2.0", - "@babel/plugin-transform-modules-amd": "7.5.0", - "@babel/plugin-transform-modules-commonjs": "7.6.0", - "@babel/plugin-transform-modules-systemjs": "7.5.0", - "@babel/plugin-transform-modules-umd": "7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "7.6.2", - "@babel/plugin-transform-new-target": "7.4.4", - "@babel/plugin-transform-object-super": "7.5.5", - "@babel/plugin-transform-parameters": "7.4.4", - "@babel/plugin-transform-property-literals": "7.2.0", - "@babel/plugin-transform-regenerator": "7.4.5", - "@babel/plugin-transform-reserved-words": "7.2.0", - "@babel/plugin-transform-shorthand-properties": "7.2.0", - "@babel/plugin-transform-spread": "7.6.2", - "@babel/plugin-transform-sticky-regex": "7.2.0", - "@babel/plugin-transform-template-literals": "7.4.4", - "@babel/plugin-transform-typeof-symbol": "7.2.0", - "@babel/plugin-transform-unicode-regex": "7.6.2", - "@babel/types": "7.6.1", - "browserslist": "4.6.6", - "core-js-compat": "3.2.1", - "invariant": "2.2.4", - "js-levenshtein": "1.1.6", - "semver": "5.6.0" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" } }, "@babel/template": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "@babel/parser": "7.6.2", - "@babel/types": "7.6.1" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" } }, "@babel/traverse": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "@babel/generator": "7.6.2", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-split-export-declaration": "7.4.4", - "@babel/parser": "7.6.2", - "@babel/types": "7.6.1", - "debug": "4.1.1", - "globals": "11.12.0", - "lodash": "4.17.15" + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.2", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } - }, - "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/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", - "requires": { - "esutils": "2.0.3", - "lodash": "4.17.15", - "to-fast-properties": "2.0.0" - }, - "dependencies": { - "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=" - } - } - }, - "@cypress/webpack-preprocessor": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-4.1.0.tgz", - "integrity": "sha512-LbxsdYVpHGoC2fMOdW0aQvuvVRD7aZx8p8DrP53HISpl7bD1PqLGWKzhHn7cGG24UHycBJrbaEeKEosW29W1dg==", - "requires": { - "@babel/core": "7.5.5", - "@babel/preset-env": "7.5.5", - "babel-loader": "8.0.6", - "bluebird": "3.5.0", - "debug": "3.1.0" - }, - "dependencies": { - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@ngrx/effects": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-8.3.0.tgz", - "integrity": "sha512-/DdBqCFpHOJZUAmIpefQ8EVwmJXXkcEdLhsV8aXncCNWkK61sy/MbZZfDAbee6Cd1is33bVXRUKD49Z+Upvw5A==" - }, - "@ngrx/router-store": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-8.3.0.tgz", - "integrity": "sha512-wIWGW3ZyT9+lJEBXVsPx1/NLFQ8KoCbhlEmpmQHniXE3iIMnK25Or2JCNXfgrndQA9SSVlKIPP3uaDJMyoBotQ==" - }, - "@ngrx/store": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-8.3.0.tgz", - "integrity": "sha512-QtM5T6/wTYqAlqeW60ptqqrsBwYF7jvQHsh0yE3AnwZIQvSbLFM2t5S2kN+753v4rHiXVRrA5pLaLzjGhAKcSg==" - }, - "@ngrx/store-devtools": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-8.3.0.tgz", - "integrity": "sha512-7jsmN8wz6PMKrbqHnUulMvf8OSYUZbXXOwkcXRaGqIjlnEG9RCHQL0cXuF8zB6uX5xencdEXsRVQe3MdZXWQng==" - }, - "@ngtools/webpack": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.7.tgz", - "integrity": "sha512-JPUzw08myovtT/x2dzzWVUNjFq8OHD81bvcBXdqPAQwQvHDSIdo6bKcu2qhakgagtXLJZnglKtefTJFrMG8ciw==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.7", - "enhanced-resolve": "4.1.0", - "rxjs": "6.4.0", - "tree-kill": "1.2.1", - "webpack-sources": "1.4.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.10.0" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.2.tgz", - "integrity": "sha512-wrIBsjA5pl13f0RN4Zx4FNWmU71lv03meGKnqRUoCyan17s4V3WL92f3w3AIuWbNnpcrQyFBU5qMavJoB8d27w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.2", - "run-parallel": "1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.2.tgz", - "integrity": "sha512-z8+wGWV2dgUhLqrtRYa03yDx4HWMvXKi1z8g3m2JyxAx8F7xk74asqPk5LAETjqDSGLFML/6CDl0+yFunSYicw==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.3.tgz", - "integrity": "sha512-l6t8xEhfK9Sa4YO5mIRdau7XSOADfmh3jCr0evNHdY+HNkW6xuQhgMH7D73VV6WpZOagrW0UludvMTiifiwTfA==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.2", - "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" - }, - "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==", - "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" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "1.10.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==" - } - } - }, - "@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.1.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=", - "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==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "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.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - }, - "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.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "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" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.3.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "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=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.3", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "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==", - "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.15", - "tree-kill": "1.2.1", - "ts-loader": "5.3.1", - "tsconfig-paths-webpack-plugin": "3.2.0", - "webpack-node-externals": "1.7.2" - }, - "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==", - "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==", - "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" - } - }, - "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" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "1.10.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==" - } - } - }, - "@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==", - "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==", - "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==", - "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==", - "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" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "1.10.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==" - } - } - }, - "@nrwl/tao": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-8.5.2.tgz", - "integrity": "sha512-nZq9k5YPO6N7uEDEt4T0f0Ai1gI5mWIUOjt5ey8oSKCaac4p8uHloGKbqEGS0zS23hBLOMPgXg+852XSfDW/pw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.803.3", - "@angular-devkit/core": "8.3.3", - "@angular-devkit/schematics": "8.3.3", - "inquirer": "6.5.1", - "minimist": "1.2.0", - "strip-json-comments": "2.0.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==", - "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" - } - }, - "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.10.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "@nrwl/workspace": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-8.5.2.tgz", - "integrity": "sha512-wbwqmVJKWZLsQJyLB6LK6/FVUH/lluFdqF5ULa8BupdV6jVz8htpyeiZn4uka46Y16JrzTyfEs1ihfKRa6tKIA==", - "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.5.0", - "prettier": "1.18.2", - "rxjs": "6.5.3", - "semver": "5.4.1", - "strip-json-comments": "2.0.1", - "tmp": "0.0.33", - "viz.js": "1.8.2", - "yargs": "11.1.0", - "yargs-parser": "10.0.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==", - "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.10.0" - } - } - } - }, - "@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" - }, - "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.10.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" - } - }, - "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==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "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.13.1", - "parse-json": "4.0.0", - "require-from-string": "2.0.2" - } - }, - "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.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - }, - "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.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "fs-extra": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.0.tgz", - "integrity": "sha512-lk2cUCo8QzbiEWEbt7Cw3m27WMiRG321xsssbcIpfMhpRjrlC08WBOVQqj1/nQYYNnPtyIhP1oqLO3QwT2tPCw==", - "dev": true, - "requires": { - "graceful-fs": "4.2.2", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "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 - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "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" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.3.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" + "ms": "^2.1.1" } }, - "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=", + "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 }, - "yallist": { + "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.3", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "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==", + } + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@ngrx/effects": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-8.3.0.tgz", + "integrity": "sha512-/DdBqCFpHOJZUAmIpefQ8EVwmJXXkcEdLhsV8aXncCNWkK61sy/MbZZfDAbee6Cd1is33bVXRUKD49Z+Upvw5A==" + }, + "@ngrx/router-store": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-8.3.0.tgz", + "integrity": "sha512-wIWGW3ZyT9+lJEBXVsPx1/NLFQ8KoCbhlEmpmQHniXE3iIMnK25Or2JCNXfgrndQA9SSVlKIPP3uaDJMyoBotQ==" + }, + "@ngrx/store": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-8.3.0.tgz", + "integrity": "sha512-QtM5T6/wTYqAlqeW60ptqqrsBwYF7jvQHsh0yE3AnwZIQvSbLFM2t5S2kN+753v4rHiXVRrA5pLaLzjGhAKcSg==" + }, + "@ngrx/store-devtools": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-8.3.0.tgz", + "integrity": "sha512-7jsmN8wz6PMKrbqHnUulMvf8OSYUZbXXOwkcXRaGqIjlnEG9RCHQL0cXuF8zB6uX5xencdEXsRVQe3MdZXWQng==" + }, + "@ngtools/webpack": { + "version": "8.3.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.7.tgz", + "integrity": "sha512-JPUzw08myovtT/x2dzzWVUNjFq8OHD81bvcBXdqPAQwQvHDSIdo6bKcu2qhakgagtXLJZnglKtefTJFrMG8ciw==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.7", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.4.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": { - "camelcase": "4.1.0" + "tslib": "^1.9.0" } } } }, + "@nodelib/fs.scandir": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.2.tgz", + "integrity": "sha512-wrIBsjA5pl13f0RN4Zx4FNWmU71lv03meGKnqRUoCyan17s4V3WL92f3w3AIuWbNnpcrQyFBU5qMavJoB8d27w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.2", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.2.tgz", + "integrity": "sha512-z8+wGWV2dgUhLqrtRYa03yDx4HWMvXKi1z8g3m2JyxAx8F7xk74asqPk5LAETjqDSGLFML/6CDl0+yFunSYicw==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.3.tgz", + "integrity": "sha512-l6t8xEhfK9Sa4YO5mIRdau7XSOADfmh3jCr0evNHdY+HNkW6xuQhgMH7D73VV6WpZOagrW0UludvMTiifiwTfA==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.2", + "fastq": "^1.6.0" + } + }, "@schematics/angular": { "version": "8.3.7", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.7.tgz", @@ -2421,7 +1616,7 @@ "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "semver": { @@ -2443,18 +1638,18 @@ "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-12.0.1.tgz", "integrity": "sha512-Dmm46eTtyKtTkku1ZIB39q/AHvUGdGIRJc7jPUucJLoSPWeD7AjvE6OFiIZYP48IkPwV0R3OI/ZmKyNA3DPkRQ==", "requires": { - "d3": "4.13.0", - "d3-array": "1.2.4", - "d3-brush": "1.1.3", - "d3-color": "1.4.0", - "d3-force": "1.2.1", - "d3-format": "1.4.1", - "d3-hierarchy": "1.1.8", - "d3-interpolate": "1.3.2", - "d3-scale": "1.0.7", - "d3-selection": "1.4.0", - "d3-shape": "1.3.5", - "d3-time-format": "2.1.3" + "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" } }, "@szmarczak/http-timer": { @@ -2463,7 +1658,7 @@ "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "requires": { - "defer-to-connect": "1.0.2" + "defer-to-connect": "^1.0.1" } }, "@tootallnate/once": { @@ -2512,9 +1707,9 @@ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { - "@types/events": "3.0.0", - "@types/minimatch": "3.0.3", - "@types/node": "12.7.9" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, "@types/jasmine": { @@ -2529,23 +1724,18 @@ "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", "dev": true, "requires": { - "@types/jasmine": "3.4.2" + "@types/jasmine": "*" } }, - "@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.3", "resolved": "https://registry.npmjs.org/@types/karma/-/karma-3.0.3.tgz", "integrity": "sha512-mkJejrAacgignkBce2+qD9S4VncjEfAT0Dion0fRcqpav3Sd2KiLTHODZOXRP3S8b0ZY5sXr9meDB3P8MSH8Cg==", "dev": true, "requires": { - "@types/bluebird": "3.5.27", - "@types/node": "12.7.9", - "log4js": "3.0.6" + "@types/bluebird": "*", + "@types/node": "*", + "log4js": "^3.0.0" } }, "@types/marked": { @@ -2591,10 +1781,10 @@ "integrity": "sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w==", "dev": true, "requires": { - "@types/caseless": "0.12.2", - "@types/node": "12.7.9", - "@types/tough-cookie": "2.3.5", - "form-data": "2.5.1" + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" }, "dependencies": { "form-data": { @@ -2603,9 +1793,9 @@ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.24" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } } } @@ -2616,7 +1806,7 @@ "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "dev": true, "requires": { - "@types/node": "12.7.9" + "@types/node": "*" } }, "@types/selenium-webdriver": { @@ -2712,7 +1902,7 @@ "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", - "mamacro": "0.0.3" + "mamacro": "^0.0.3" } }, "@webassemblyjs/helper-wasm-bytecode": { @@ -2739,7 +1929,7 @@ "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { - "@xtuc/ieee754": "1.2.0" + "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { @@ -2877,7 +2067,7 @@ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "2.1.24", + "mime-types": "~2.1.24", "negotiator": "0.6.2" } }, @@ -2922,7 +2112,7 @@ "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" } }, "agentkeepalive": { @@ -2969,7 +2159,7 @@ "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.4.0" + "@tweenjs/tween.js": "^17.1.0" } }, "ansi-align": { @@ -2978,7 +2168,7 @@ "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "dev": true, "requires": { - "string-width": "3.1.0" + "string-width": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -3005,9 +2195,9 @@ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { @@ -3016,7 +2206,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } } } @@ -3033,7 +2223,7 @@ "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", "dev": true, "requires": { - "type-fest": "0.5.2" + "type-fest": "^0.5.2" } }, "ansi-gray": { @@ -3054,12 +2244,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "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": { "color-convert": "^1.9.0" } @@ -3074,6 +2266,7 @@ "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" @@ -3100,7 +2293,7 @@ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "aproba": { @@ -3143,13 +2336,14 @@ "dev": true, "requires": { "ast-types-flow": "0.0.7", - "commander": "2.20.0" + "commander": "^2.11.0" } }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-filter": { "version": "1.1.2", @@ -3163,7 +2357,8 @@ "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==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-map": { "version": "2.0.2", @@ -3177,7 +2372,8 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, "array-each": { "version": "1.0.1", @@ -3269,7 +2465,8 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true }, "arraybuffer.slice": { "version": "0.0.7", @@ -3295,7 +2492,7 @@ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "asn1.js": { @@ -3315,7 +2512,7 @@ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "object-assign": "4.1.1", + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -3345,7 +2542,8 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true }, "ast-types-flow": { "version": "0.0.7", @@ -3359,7 +2557,7 @@ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "4.17.15" + "lodash": "^4.17.14" } }, "async-array-reduce": { @@ -3374,16 +2572,17 @@ "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", "dev": true, "requires": { - "end-of-stream": "1.4.3", - "once": "1.4.0", - "process-nextick-args": "2.0.1", - "stream-exhaust": "1.0.2" + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" } }, "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==" + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true }, "async-limiter": { "version": "1.0.1", @@ -3409,7 +2608,8 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, "autoprefixer": { "version": "9.6.1", @@ -3417,13 +2617,13 @@ "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", "dev": true, "requires": { - "browserslist": "4.6.6", - "caniuse-lite": "1.0.30000989", - "chalk": "2.4.2", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "7.0.17", - "postcss-value-parser": "4.0.2" + "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" } }, "aws-sign2": { @@ -3451,6 +2651,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -3460,12 +2661,14 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "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", @@ -3477,12 +2680,14 @@ "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "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=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -3516,37 +2721,6 @@ } } }, - "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.1.0", - "loader-utils": "1.2.3", - "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.1.0", - "pkg-dir": "3.0.0" - } - }, - "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", @@ -3560,8 +2734,9 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, "requires": { - "object.assign": "4.1.0" + "object.assign": "^4.1.0" } }, "babel-runtime": { @@ -3662,12 +2837,14 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -3682,6 +2859,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" } @@ -3690,6 +2868,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" } @@ -3698,6 +2877,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" } @@ -3706,6 +2886,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", @@ -3744,7 +2925,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "better-assert": { @@ -3759,12 +2940,14 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true }, "blob": { "version": "0.0.5", @@ -3800,15 +2983,15 @@ "dev": true, "requires": { "bytes": "3.1.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", + "depd": "~1.1.2", "http-errors": "1.7.2", "iconv-lite": "0.4.24", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.7.0", "raw-body": "2.4.0", - "type-is": "1.6.18" + "type-is": "~1.6.17" }, "dependencies": { "bytes": { @@ -3845,14 +3028,14 @@ "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", "dev": true, "requires": { - "ansi-align": "3.0.0", - "camelcase": "5.3.1", - "chalk": "2.4.2", - "cli-boxes": "2.2.0", - "string-width": "3.1.0", - "term-size": "1.2.0", - "type-fest": "0.3.1", - "widest-line": "2.0.1" + "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" }, "dependencies": { "ansi-regex": { @@ -3879,9 +3062,9 @@ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { @@ -3890,7 +3073,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } }, "type-fest": { @@ -3905,6 +3088,7 @@ "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" @@ -3914,6 +3098,7 @@ "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", @@ -3931,6 +3116,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" } @@ -4018,10 +3204,11 @@ "version": "4.6.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "dev": true, "requires": { - "caniuse-lite": "1.0.30000989", - "electron-to-chromium": "1.3.273", - "node-releases": "1.1.33" + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" } }, "browserstack": { @@ -4039,10 +3226,10 @@ "integrity": "sha512-fRaynjF0MvtyyfPRy2NFnVwxLyNtD28K/v9xRsIjUVf7xLc80NIm7Nfr3KXlFmWizhG91PL/UAOXlHkoxQjaNw==", "dev": true, "requires": { - "https-proxy-agent": "2.2.2", - "is-running": "2.1.0", - "ps-tree": "1.1.1", - "temp-fs": "0.9.9" + "https-proxy-agent": "^2.2.1", + "is-running": "^2.0.0", + "ps-tree": "=1.1.1", + "temp-fs": "^0.9.9" } }, "buffer": { @@ -4138,21 +3325,21 @@ "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", "dev": true, "requires": { - "bluebird": "3.7.0", - "chownr": "1.1.3", - "figgy-pudding": "3.5.1", - "glob": "7.1.4", - "graceful-fs": "4.2.2", - "infer-owner": "1.0.4", - "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.7.1", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "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" }, "dependencies": { "glob": { @@ -4161,12 +3348,12 @@ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } } } @@ -4175,6 +3362,7 @@ "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": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -4193,13 +3381,13 @@ "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { - "clone-response": "1.0.2", - "get-stream": "5.1.0", - "http-cache-semantics": "4.0.3", - "keyv": "3.1.0", - "lowercase-keys": "2.0.0", - "normalize-url": "4.5.0", - "responselike": "1.0.2" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "dependencies": { "get-stream": { @@ -4208,7 +3396,7 @@ "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" } }, "http-cache-semantics": { @@ -4235,8 +3423,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.3", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -4247,7 +3435,7 @@ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "callsites": "2.0.0" + "callsites": "^2.0.0" } }, "caller-path": { @@ -4256,7 +3444,7 @@ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "caller-callsite": "2.0.0" + "caller-callsite": "^2.0.0" } }, "callsite": { @@ -4280,7 +3468,8 @@ "caniuse-lite": { "version": "1.0.30000989", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==" + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "dev": true }, "canonical-path": { "version": "1.0.0", @@ -4298,18 +3487,20 @@ "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.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4324,20 +3515,21 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.3", - "braces": "2.3.2", - "fsevents": "1.2.9", - "glob-parent": "3.1.0", - "inherits": "2.0.4", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.2.0" + "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": { @@ -4352,7 +3544,7 @@ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "ci-info": { @@ -4386,6 +3578,7 @@ "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": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -4397,6 +3590,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" } @@ -4432,7 +3626,7 @@ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "3.1.0" + "restore-cursor": "^3.1.0" } }, "cli-width": { @@ -4447,9 +3641,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -4470,9 +3664,9 @@ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "is-plain-object": "2.0.4", - "kind-of": "6.0.2", - "shallow-clone": "3.0.1" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "clone-response": { @@ -4481,7 +3675,7 @@ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { - "mimic-response": "1.0.1" + "mimic-response": "^1.0.0" } }, "clone-stats": { @@ -4496,9 +3690,9 @@ "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, "requires": { - "inherits": "2.0.4", - "process-nextick-args": "2.0.1", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, "co": { @@ -4543,15 +3737,15 @@ "integrity": "sha512-izfUfhEOOgAizszPlEDxo71DK/C4wprZw0vkY6UWcOSTQvN1JyfXf9DXwaV7WX+/JC+hH0ShXfdtGLA9Rca7LA==", "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.5", - "semver-dsl": "1.0.1", - "source-map": "0.5.7", - "sprintf-js": "1.1.2" + "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": { @@ -4583,6 +3777,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -4592,6 +3787,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -4599,7 +3795,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "color-support": { "version": "1.1.3", @@ -4619,7 +3816,7 @@ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -4630,7 +3827,8 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true }, "compare-versions": { "version": "3.5.1", @@ -4647,7 +3845,8 @@ "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==" + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true }, "component-inherit": { "version": "0.0.3", @@ -4661,7 +3860,7 @@ "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": ">= 1.40.0 < 2" } }, "compression": { @@ -4670,19 +3869,20 @@ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "2.0.17", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "1.0.2", + "on-headers": "~1.0.2", "safe-buffer": "5.1.2", - "vary": "1.1.2" + "vary": "~1.1.2" } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -4702,12 +3902,12 @@ "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.2.2", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.4.3", - "xdg-basedir": "3.0.0" + "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" }, "dependencies": { "make-dir": { @@ -4716,7 +3916,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } } } @@ -4779,8 +3979,9 @@ "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==", + "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.1" } }, "cookie": { @@ -4812,7 +4013,8 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true }, "copy-props": { "version": "2.0.4", @@ -4830,18 +4032,18 @@ "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==", "dev": true, "requires": { - "cacache": "11.3.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": "1.9.1", - "webpack-log": "2.0.0" + "cacache": "^11.3.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.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" }, "dependencies": { "cacache": { @@ -4850,20 +4052,20 @@ "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", "dev": true, "requires": { - "bluebird": "3.7.0", - "chownr": "1.1.3", - "figgy-pudding": "3.5.1", - "glob": "7.1.4", - "graceful-fs": "4.2.2", - "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.7.1", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "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": { @@ -4872,9 +4074,9 @@ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "2.1.0", - "pkg-dir": "3.0.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, "glob": { @@ -4883,12 +4085,12 @@ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } }, "globby": { @@ -4897,12 +4099,12 @@ "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, "requires": { - "array-union": "1.0.2", - "dir-glob": "2.2.2", - "glob": "7.1.4", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" + "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": { @@ -4922,22 +4124,25 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "dev": true, "requires": { - "browserslist": "4.6.6", - "semver": "6.3.0" + "browserslist": "^4.6.6", + "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==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cosmiconfig": { "version": "5.2.1", @@ -4945,10 +4150,10 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "import-fresh": "2.0.0", - "is-directory": "0.3.1", - "js-yaml": "3.13.1", - "parse-json": "4.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": { @@ -4957,8 +4162,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } } } @@ -5006,11 +4211,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.6.0", - "shebang-command": "1.2.0", - "which": "1.3.1" + "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": { @@ -5061,9 +4266,9 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -5078,7 +4283,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } } } @@ -5122,8 +4327,8 @@ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "es5-ext": "0.10.51", - "type": "1.2.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, "d3": { @@ -5252,11 +4457,11 @@ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.3.tgz", "integrity": "sha512-v8bbYyCFKjyCzFk/tdWqXwDykY8YWqhXYjcYxfILIit085VZOpj4XJKOMccTsvWxgzSLMJQg5SiqHjslsipEDg==", "requires": { - "d3-dispatch": "1.0.3", - "d3-drag": "1.2.1", - "d3-interpolate": "1.3.2", - "d3-selection": "1.4.0", - "d3-transition": "1.1.1" + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, "d3-chord": { @@ -5312,10 +4517,10 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", "requires": { - "d3-collection": "1.0.4", - "d3-dispatch": "1.0.3", - "d3-quadtree": "1.0.3", - "d3-timer": "1.0.7" + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" } }, "d3-format": { @@ -5404,7 +4609,7 @@ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", "requires": { - "d3-path": "1.0.5" + "d3-path": "1" } }, "d3-time": { @@ -5486,6 +4691,7 @@ "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" } @@ -5505,7 +4711,8 @@ "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=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "decompress-response": { "version": "3.3.0", @@ -5513,7 +4720,7 @@ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, "requires": { - "mimic-response": "1.0.1" + "mimic-response": "^1.0.0" } }, "deep-equal": { @@ -5522,12 +4729,12 @@ "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", "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" + "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": { @@ -5570,8 +4777,8 @@ "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, "requires": { - "execa": "1.0.0", - "ip-regex": "2.1.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" } }, "default-require-extensions": { @@ -5580,7 +4787,7 @@ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" } }, "default-resolution": { @@ -5599,14 +4806,16 @@ "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.1.1" + "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" @@ -5616,6 +4825,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" } @@ -5624,6 +4834,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" } @@ -5632,6 +4843,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", @@ -5646,13 +4858,13 @@ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { - "@types/glob": "7.1.1", - "globby": "6.1.0", - "is-path-cwd": "2.2.0", - "is-path-in-cwd": "2.1.0", - "p-map": "2.1.0", - "pify": "4.0.1", - "rimraf": "2.7.1" + "@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": { @@ -5661,11 +4873,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.3", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "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": { @@ -5688,7 +4900,7 @@ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { - "is-path-inside": "2.1.0" + "is-path-inside": "^2.1.0" } }, "is-path-inside": { @@ -5697,7 +4909,7 @@ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.2" } }, "pify": { @@ -5720,10 +4932,10 @@ "integrity": "sha512-bdhJatRNYsJnOhSRx9Eej3ABBtxQQw/uz2RprpYL5R3jCC2XMYVBcQWwvQLl+iNDk4LCLEKhdIP3uZSqRWi/tw==", "dev": true, "requires": { - "async-each": "1.0.3", - "extend-shallow": "2.0.1", - "matched": "1.0.2", - "rimraf": "2.7.1" + "async-each": "^1.0.1", + "extend-shallow": "^2.0.1", + "matched": "^1.0.2", + "rimraf": "^2.6.1" }, "dependencies": { "extend-shallow": { @@ -5732,7 +4944,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5792,8 +5004,8 @@ "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "dev": true, "requires": { - "asap": "2.0.6", - "wrappy": "1.0.2" + "asap": "^2.0.0", + "wrappy": "1" } }, "di": { @@ -5825,7 +5037,7 @@ "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "path-type": "3.0.0" + "path-type": "^3.0.0" } }, "dns-equal": { @@ -5913,10 +5125,10 @@ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "end-of-stream": "1.4.3", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "each-props": { @@ -5935,8 +5147,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -5948,7 +5160,8 @@ "electron-to-chromium": { "version": "1.3.273", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.273.tgz", - "integrity": "sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw==" + "integrity": "sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw==", + "dev": true }, "elliptic": { "version": "6.5.1", @@ -5956,13 +5169,13 @@ "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "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" } }, "emoji-regex": { @@ -5974,7 +5187,8 @@ "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true }, "encodeurl": { "version": "1.0.2", @@ -5997,7 +5211,7 @@ "integrity": "sha512-cbNhPFS6MlYlWTGncSiDYbdqKhwWFy7kNeb1YSOG6K65i/wPTkLVCJQj0hXA4j0m5Da+hBWnqopEnu1FFelisQ==", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "engine.io": { @@ -6035,9 +5249,9 @@ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "async-limiter": "1.0.1", - "safe-buffer": "5.1.2", - "ultron": "1.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } @@ -6082,9 +5296,9 @@ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "async-limiter": "1.0.1", - "safe-buffer": "5.1.2", - "ultron": "1.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } @@ -6106,6 +5320,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.4.0", @@ -6128,6 +5343,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, "requires": { "prr": "~1.0.1" } @@ -6138,7 +5354,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "error-stack-parser": { @@ -6146,7 +5362,7 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz", "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==", "requires": { - "stackframe": "1.1.0" + "stackframe": "^1.1.0" } }, "es-abstract": { @@ -6155,16 +5371,16 @@ "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", "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.1.0", - "string.prototype.trimright": "2.1.0" + "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" } }, "es-to-primitive": { @@ -6173,9 +5389,9 @@ "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" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es5-ext": { @@ -6184,9 +5400,9 @@ "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.2", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" } }, "es6-iterator": { @@ -6248,8 +5464,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51" + "d": "1", + "es5-ext": "~0.10.14" } } } @@ -6260,8 +5476,8 @@ "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51" + "d": "^1.0.1", + "es5-ext": "^0.10.51" } }, "es6-weak-map": { @@ -6270,10 +5486,10 @@ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.2" + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -6285,7 +5501,8 @@ "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=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.8.1", @@ -6408,7 +5625,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "figures": { @@ -6417,8 +5634,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "inquirer": { @@ -6427,19 +5644,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.15", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "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": { @@ -6454,8 +5671,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "run-async": { @@ -6464,7 +5681,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.3.0" } }, "shelljs": { @@ -6493,8 +5710,8 @@ "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.3.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "espree": { @@ -6545,7 +5762,8 @@ "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true }, "etag": { "version": "1.8.1", @@ -6615,13 +5833,13 @@ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "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" } }, "exit": { @@ -6640,6 +5858,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -6654,6 +5873,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" } @@ -6662,6 +5882,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" } @@ -6674,7 +5895,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.3" + "homedir-polyfill": "^1.0.1" } }, "express": { @@ -6683,36 +5904,36 @@ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", "content-disposition": "0.5.3", - "content-type": "1.0.4", + "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", + "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", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.5", + "proxy-addr": "~2.0.5", "qs": "6.7.0", - "range-parser": "1.2.1", + "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", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "array-flatten": { @@ -6739,6 +5960,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -6748,6 +5970,7 @@ "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" } @@ -6760,15 +5983,16 @@ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "chardet": "0.7.0", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" } }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -6784,6 +6008,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" } @@ -6792,6 +6017,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" } @@ -6800,6 +6026,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" } @@ -6808,6 +6035,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" } @@ -6816,6 +6044,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", @@ -6845,7 +6074,8 @@ "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=" + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true }, "fast-glob": { "version": "3.0.4", @@ -6853,12 +6083,12 @@ "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.2", - "@nodelib/fs.walk": "1.2.3", - "glob-parent": "5.1.0", - "is-glob": "4.0.1", - "merge2": "1.3.0", - "micromatch": "4.0.2" + "@nodelib/fs.stat": "^2.0.1", + "@nodelib/fs.walk": "^1.2.1", + "glob-parent": "^5.0.0", + "is-glob": "^4.0.1", + "merge2": "^1.2.3", + "micromatch": "^4.0.2" }, "dependencies": { "braces": { @@ -6867,7 +6097,7 @@ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "fill-range": "7.0.1" + "fill-range": "^7.0.1" } }, "fill-range": { @@ -6876,7 +6106,7 @@ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "to-regex-range": "5.0.1" + "to-regex-range": "^5.0.1" } }, "glob-parent": { @@ -6885,7 +6115,7 @@ "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { - "is-glob": "4.0.1" + "is-glob": "^4.0.1" } }, "is-number": { @@ -6900,8 +6130,8 @@ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "braces": "3.0.2", - "picomatch": "2.0.7" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "to-regex-range": { @@ -6910,7 +6140,7 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "7.0.0" + "is-number": "^7.0.0" } } } @@ -6918,7 +6148,8 @@ "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=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -6938,7 +6169,7 @@ "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", "dev": true, "requires": { - "reusify": "1.0.4" + "reusify": "^1.0.0" } }, "faye-websocket": { @@ -6962,7 +6193,7 @@ "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -6981,8 +6212,8 @@ "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", "dev": true, "requires": { - "loader-utils": "1.2.3", - "schema-utils": "2.4.1" + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" }, "dependencies": { "ajv": { @@ -6991,10 +6222,10 @@ "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": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "schema-utils": { @@ -7003,8 +6234,8 @@ "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-keywords": "3.4.1" + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" } } } @@ -7023,6 +6254,7 @@ "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", @@ -7034,6 +6266,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" } @@ -7047,12 +6280,12 @@ "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" + "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" } }, "find-cache-dir": { @@ -7061,9 +6294,9 @@ "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "3.0.0", - "pkg-dir": "4.2.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" }, "dependencies": { "find-up": { @@ -7072,8 +6305,8 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "5.0.0", - "path-exists": "4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { @@ -7082,7 +6315,7 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "4.1.0" + "p-locate": "^4.1.0" } }, "make-dir": { @@ -7091,7 +6324,7 @@ "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", "dev": true, "requires": { - "semver": "6.3.0" + "semver": "^6.0.0" } }, "p-locate": { @@ -7100,7 +6333,7 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "2.2.1" + "p-limit": "^2.2.0" } }, "path-exists": { @@ -7115,7 +6348,7 @@ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "4.1.0" + "find-up": "^4.0.0" } }, "semver": { @@ -7136,8 +6369,9 @@ "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": "^3.0.0" } }, "findup-sync": { @@ -7233,10 +6467,10 @@ "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { - "circular-json": "0.3.3", - "graceful-fs": "4.2.2", - "rimraf": "2.6.3", - "write": "0.2.1" + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" }, "dependencies": { "circular-json": { @@ -7251,7 +6485,7 @@ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } } } @@ -7268,8 +6502,8 @@ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "follow-redirects": { @@ -7278,7 +6512,7 @@ "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", "dev": true, "requires": { - "debug": "3.2.6" + "debug": "^3.0.0" }, "dependencies": { "debug": { @@ -7287,7 +6521,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -7301,7 +6535,8 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "1.0.0", @@ -7318,30 +6553,15 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "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.26.0", - "chalk": "2.4.2", - "chokidar": "2.0.4", - "lodash": "4.17.15", - "micromatch": "3.1.10", - "minimatch": "3.0.4", - "resolve": "1.12.0", - "tapable": "1.1.3" - } - }, "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.8", - "mime-types": "2.1.24" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "forwarded": { @@ -7354,6 +6574,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -7395,9 +6616,9 @@ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-minipass": { @@ -7406,7 +6627,7 @@ "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "requires": { - "minipass": "2.9.0" + "minipass": "^2.6.0" } }, "fs-mkdirp-stream": { @@ -7441,52 +6662,59 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, "optional": true, "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.12.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "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, "optional": true }, "ansi-regex": { "version": "2.1.1", "bundled": true, + "dev": true, "optional": true }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, "optional": 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, "optional": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -7494,203 +6722,229 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, "optional": true }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "optional": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "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, "optional": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, "optional": true }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, "optional": true }, "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, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, "optional": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "optional": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, "optional": true }, "minipass": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, "minizlib": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "optional": true, "requires": { "minimist": "0.0.8" @@ -7700,146 +6954,163 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, "optional": true }, "needle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "dev": true, "optional": true, "requires": { - "debug": "4.1.1", - "iconv-lite": "0.4.24", - "sax": "1.2.4" + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.3.0", - "nopt": "4.0.1", - "npm-packlist": "1.4.1", - "npmlog": "4.1.2", - "rc": "1.2.8", - "rimraf": "2.6.3", - "semver": "5.7.0", - "tar": "4.4.8" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.6" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, "optional": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, "optional": true }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "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, "optional": true }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, "optional": true }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "optional": true, "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, "optional": true } } @@ -7848,133 +7119,150 @@ "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, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, "optional": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, + "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "optional": true }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, "optional": true }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true, "optional": true }, "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, "optional": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, "optional": true }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, + "dev": true, "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, "optional": true }, "tar": { "version": "4.4.8", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, "optional": true, "requires": { - "chownr": "1.1.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.5", - "minizlib": "1.2.1", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, + "dev": true, "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, + "dev": true, "optional": true } } @@ -7982,7 +7270,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "generate-function": { "version": "2.3.1", @@ -7990,7 +7279,7 @@ "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "dev": true, "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.2" } }, "generate-object-property": { @@ -8020,7 +7309,7 @@ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" }, "dependencies": { "pump": { @@ -8029,8 +7318,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.3", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -8038,7 +7327,8 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true }, "getpass": { "version": "0.1.7", @@ -8055,18 +7345,19 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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=", + "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -8076,6 +7367,7 @@ "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" } @@ -8129,9 +7421,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -8140,11 +7432,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.3", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -8159,14 +7451,14 @@ "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", "dev": true, "requires": { - "@types/glob": "7.1.1", - "array-union": "2.1.0", - "dir-glob": "3.0.1", - "fast-glob": "3.0.4", - "glob": "7.1.3", - "ignore": "5.1.4", - "merge2": "1.3.0", - "slash": "3.0.0" + "@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" }, "dependencies": { "array-union": { @@ -8181,7 +7473,7 @@ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "path-type": "4.0.0" + "path-type": "^4.0.0" } }, "ignore": { @@ -8247,32 +7539,24 @@ "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { - "@sindresorhus/is": "0.14.0", - "@szmarczak/http-timer": "1.1.2", - "cacheable-request": "6.1.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.1.0", - "to-readable-stream": "1.0.0", - "url-parse-lax": "3.0.0" + "@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.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" - }, - "graphviz": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.8.tgz", - "integrity": "sha1-5ZnkBzPvgOFlO/6JpfAx7PKqSqo=", - "dev": true, - "requires": { - "temp": "~0.4.0" - } + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true }, "gulp": { "version": "4.0.2", @@ -8292,7 +7576,7 @@ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "ansi-wrap": "^0.1.0" } }, "gulp-cli": { @@ -8329,11 +7613,11 @@ "integrity": "sha512-oR3t8kn+ccHkSyRcBV5kBLPXrhqTh5d6wBAR7r7wqjNQNBhYvOwPedCwlAaGcNl1qSeXNDn6qOk1Qyxvx9Wrow==", "dev": true, "requires": { - "get-stream": "5.1.0", - "plugin-error": "1.0.1", - "through2": "3.0.1", - "vinyl": "2.2.0", - "yazl": "2.5.1" + "get-stream": "^5.1.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" }, "dependencies": { "get-stream": { @@ -8342,7 +7626,7 @@ "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" } }, "pump": { @@ -8351,8 +7635,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.3", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "through2": { @@ -8361,7 +7645,7 @@ "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "2 || 3" } } } @@ -8392,10 +7676,10 @@ "integrity": "sha512-7XlnO8yBXOdi7AzowjZssQr47Ctidqm7GbgARapOaqSN9HQhlClnOkR9HieGauIT3A8MBC6u9wPCXs97PCYpWg==", "dev": true, "requires": { - "neo-async": "2.6.1", - "optimist": "0.6.1", - "source-map": "0.6.1", - "uglify-js": "3.6.0" + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { "source-map": { @@ -8435,6 +7719,7 @@ "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" } @@ -8465,7 +7750,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-glob": { "version": "1.0.0", @@ -8473,7 +7759,7 @@ "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", "dev": true, "requires": { - "is-glob": "3.1.0" + "is-glob": "^3.0.0" }, "dependencies": { "is-glob": { @@ -8482,7 +7768,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -8490,12 +7776,14 @@ "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "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", @@ -8506,6 +7794,7 @@ "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" @@ -8515,6 +7804,7 @@ "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" } @@ -8564,7 +7854,7 @@ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -8609,10 +7899,10 @@ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", - "statuses": "1.5.0", + "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" }, "dependencies": { @@ -8636,9 +7926,9 @@ "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "dev": true, "requires": { - "eventemitter3": "4.0.0", - "follow-redirects": "1.9.0", - "requires-port": "1.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-proxy-agent": { @@ -8668,10 +7958,10 @@ "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "http-proxy": "1.18.0", - "is-glob": "4.0.1", - "lodash": "4.17.15", - "micromatch": "3.1.10" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, "http-signature": { @@ -8697,8 +7987,8 @@ "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", "dev": true, "requires": { - "agent-base": "4.3.0", - "debug": "3.2.6" + "agent-base": "^4.3.0", + "debug": "^3.1.0" }, "dependencies": { "debug": { @@ -8707,7 +7997,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -8732,7 +8022,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { @@ -8759,7 +8049,7 @@ "integrity": "sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==", "dev": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "image-size": { @@ -8795,8 +8085,8 @@ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "caller-path": "2.0.0", - "resolve-from": "3.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, "import-from": { @@ -8855,7 +8145,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "1.3.5", @@ -8875,19 +8166,19 @@ "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", "dev": true, "requires": { - "ansi-escapes": "4.2.1", - "chalk": "2.4.2", - "cli-cursor": "3.1.0", - "cli-width": "2.2.0", - "external-editor": "3.1.0", - "figures": "3.0.0", - "lodash": "4.17.15", + "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.3.0", - "rxjs": "6.5.3", - "string-width": "4.1.0", - "strip-ansi": "5.2.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -8908,9 +8199,9 @@ "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", "dev": true, "requires": { - "emoji-regex": "8.0.0", - "is-fullwidth-code-point": "3.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" } }, "strip-ansi": { @@ -8919,7 +8210,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } } } @@ -8930,8 +8221,8 @@ "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dev": true, "requires": { - "default-gateway": "4.2.0", - "ipaddr.js": "1.9.0" + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" } }, "interpret": { @@ -8949,6 +8240,7 @@ "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" } @@ -8997,6 +8289,7 @@ "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" }, @@ -9005,6 +8298,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" } @@ -9027,6 +8321,7 @@ "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" } @@ -9034,7 +8329,8 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-callable": { "version": "1.1.4", @@ -9048,13 +8344,14 @@ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "ci-info": "2.0.0" + "ci-info": "^2.0.0" } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -9063,6 +8360,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" } @@ -9079,6 +8377,7 @@ "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", @@ -9088,7 +8387,8 @@ "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==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -9101,12 +8401,14 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "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=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-finite": { "version": "1.0.2", @@ -9130,8 +8432,9 @@ "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-extglob": "^2.1.1" } }, "is-installed-globally": { @@ -9162,11 +8465,11 @@ "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", "dev": true, "requires": { - "generate-function": "2.3.1", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.2" + "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": { @@ -9185,6 +8488,7 @@ "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" }, @@ -9193,6 +8497,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" } @@ -9239,6 +8544,7 @@ "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" } @@ -9306,7 +8612,7 @@ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { - "has-symbols": "1.0.0" + "has-symbols": "^1.0.0" } }, "is-typedarray": { @@ -9339,7 +8645,8 @@ "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==" + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "is-wsl": { "version": "1.1.0", @@ -9356,7 +8663,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isbinaryfile": { "version": "3.0.3", @@ -9376,7 +8684,8 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -9466,17 +8775,17 @@ "integrity": "sha512-kH5YRdqdbs5hiH4/Rr1Q0cSAGgjh3jTtg8vu9NLebBAoK3adVO4jk81J+TYOkTr2+Q4NLeb1ACvmEt65iG/Vbw==", "dev": true, "requires": { - "async": "2.6.3", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.1", - "istanbul-lib-hook": "1.2.2", - "istanbul-lib-instrument": "1.10.2", - "istanbul-lib-report": "1.1.5", - "istanbul-lib-source-maps": "1.2.6", - "istanbul-reports": "1.1.4", - "js-yaml": "3.13.1", - "mkdirp": "0.5.1", - "once": "1.4.0" + "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" } }, "istanbul-instrumenter-loader": { @@ -9538,7 +8847,7 @@ "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -9547,13 +8856,13 @@ "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", "dev": true, "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.1", - "semver": "5.6.0" + "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" } }, "istanbul-lib-report": { @@ -9562,10 +8871,10 @@ "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.2.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.6", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "has-flag": { @@ -9580,7 +8889,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -9591,11 +8900,11 @@ "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", "dev": true, "requires": { - "debug": "3.2.6", - "istanbul-lib-coverage": "1.2.1", - "mkdirp": "0.5.1", - "rimraf": "2.7.1", - "source-map": "0.5.6" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -9604,7 +8913,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -9621,7 +8930,7 @@ "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", "dev": true, "requires": { - "handlebars": "4.3.0" + "handlebars": "^4.0.3" } }, "jasmine": { @@ -9649,14 +8958,6 @@ "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", "dev": true }, - "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==", - "requires": { - "lodash": "4.17.15" - } - }, "jasmine-spec-reporter": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", @@ -9678,19 +8979,21 @@ "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dev": true, "requires": { - "merge-stream": "2.0.0", - "supports-color": "6.1.0" + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" } }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "3.13.1", @@ -9711,7 +9014,8 @@ "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 }, "json-buffer": { "version": "3.0.0", @@ -9734,7 +9038,8 @@ "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", @@ -9767,6 +9072,7 @@ "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" } @@ -9777,7 +9083,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.2.2" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -9869,8 +9175,8 @@ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "normalize-path": "3.0.0", - "picomatch": "2.0.7" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "binary-extensions": { @@ -9894,14 +9200,14 @@ "integrity": "sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==", "dev": true, "requires": { - "anymatch": "3.1.1", - "braces": "3.0.2", - "fsevents": "2.1.0", - "glob-parent": "5.1.0", - "is-binary-path": "2.1.0", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "readdirp": "3.1.3" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.0", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.1.3" } }, "date-format": { @@ -9952,7 +9258,7 @@ "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { - "is-glob": "4.0.1" + "is-glob": "^4.0.1" } }, "is-binary-path": { @@ -10007,7 +9313,7 @@ "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", "dev": true, "requires": { - "picomatch": "2.0.7" + "picomatch": "^2.0.4" } }, "source-map": { @@ -10057,7 +9363,7 @@ "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", "dev": true, "requires": { - "which": "1.3.1" + "which": "^1.2.1" } }, "karma-cli": { @@ -10066,7 +9372,7 @@ "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", "dev": true, "requires": { - "resolve": "1.12.0" + "resolve": "^1.3.3" } }, "karma-coverage-istanbul-reporter": { @@ -10075,8 +9381,8 @@ "integrity": "sha512-UH0mXPJFJyK5uiK7EkwGtQ8f30lCBAfqRResnZ4pzLJ04SOp4SPlYkmwbbZ6iVJ6sQFVzlDUXlntBEsLRdgZpg==", "dev": true, "requires": { - "istanbul-api": "2.1.6", - "minimatch": "3.0.4" + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" }, "dependencies": { "append-transform": { @@ -10085,7 +9391,7 @@ "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "default-require-extensions": "2.0.0" + "default-require-extensions": "^2.0.0" } }, "debug": { @@ -10094,7 +9400,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "default-require-extensions": { @@ -10103,7 +9409,7 @@ "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { - "strip-bom": "3.0.0" + "strip-bom": "^3.0.0" } }, "istanbul-api": { @@ -10112,19 +9418,19 @@ "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", "dev": true, "requires": { - "async": "2.6.3", - "compare-versions": "3.5.1", - "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.6", - "js-yaml": "3.13.1", - "make-dir": "2.1.0", - "minimatch": "3.0.4", - "once": "1.4.0" + "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" } }, "istanbul-lib-coverage": { @@ -10139,7 +9445,7 @@ "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, "requires": { - "append-transform": "1.0.0" + "append-transform": "^1.0.0" } }, "istanbul-lib-instrument": { @@ -10148,13 +9454,13 @@ "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "@babel/generator": "7.6.2", - "@babel/parser": "7.6.2", - "@babel/template": "7.6.0", - "@babel/traverse": "7.6.2", - "@babel/types": "7.6.1", - "istanbul-lib-coverage": "2.0.5", - "semver": "6.3.0" + "@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-lib-report": { @@ -10163,9 +9469,9 @@ "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "istanbul-lib-coverage": "2.0.5", - "make-dir": "2.1.0", - "supports-color": "6.1.0" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" } }, "istanbul-lib-source-maps": { @@ -10174,11 +9480,11 @@ "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.7.1", - "source-map": "0.6.1" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" } }, "istanbul-reports": { @@ -10187,7 +9493,7 @@ "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "dev": true, "requires": { - "handlebars": "4.3.0" + "handlebars": "^4.1.2" } }, "ms": { @@ -10237,7 +9543,7 @@ "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, "requires": { - "source-map-support": "0.5.13" + "source-map-support": "^0.5.5" } }, "karma-spec-reporter": { @@ -10246,7 +9552,7 @@ "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", "dev": true, "requires": { - "colors": "1.1.2" + "colors": "^1.1.2" } }, "keyv": { @@ -10267,7 +9573,8 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true }, "klaw-sync": { "version": "2.1.0", @@ -10300,7 +9607,7 @@ "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dev": true, "requires": { - "package-json": "6.5.0" + "package-json": "^6.3.0" } }, "lazystream": { @@ -10362,9 +9669,9 @@ "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", "dev": true, "requires": { - "clone": "2.1.2", - "loader-utils": "1.2.3", - "pify": "4.0.1" + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" }, "dependencies": { "pify": { @@ -10418,8 +9725,8 @@ "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==", "dev": true, "requires": { - "@types/webpack-sources": "0.1.5", - "webpack-sources": "1.4.3" + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" } }, "lie": { @@ -10484,6 +9791,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", @@ -10494,15 +9802,17 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.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==" + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true }, "lodash-es": { "version": "4.17.15", @@ -10524,7 +9834,8 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true }, "lodash.kebabcase": { "version": "4.1.1", @@ -10572,8 +9883,9 @@ "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": { - "js-tokens": "4.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lowercase-keys": { @@ -10588,30 +9900,33 @@ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "yallist": "3.1.1" + "yallist": "^3.0.2" } }, "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==", + "dev": true, "requires": { - "sourcemap-codec": "1.4.6" + "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" + "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==" + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true } } }, @@ -10627,17 +9942,17 @@ "integrity": "sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA==", "dev": true, "requires": { - "agentkeepalive": "3.5.2", - "cacache": "12.0.2", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.1.0", - "https-proxy-agent": "2.2.2", - "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.2", - "ssri": "6.0.1" + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "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" } }, "make-iterator": { @@ -10667,7 +9982,8 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true }, "map-stream": { "version": "0.1.0", @@ -10679,6 +9995,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, "requires": { "object-visit": "^1.0.0" } @@ -10777,12 +10094,12 @@ "integrity": "sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q==", "dev": true, "requires": { - "arr-union": "3.1.0", - "async-array-reduce": "0.2.1", - "glob": "7.1.3", - "has-glob": "1.0.0", - "is-valid-glob": "1.0.0", - "resolve-dir": "1.0.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" } }, "md5.js": { @@ -10808,15 +10125,16 @@ "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", "dev": true, "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.0" + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.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=", + "dev": true, "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -10862,6 +10180,7 @@ "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", @@ -10927,10 +10246,10 @@ "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", "dev": true, "requires": { - "loader-utils": "1.2.3", + "loader-utils": "^1.1.0", "normalize-url": "1.9.1", - "schema-utils": "1.0.0", - "webpack-sources": "1.4.3" + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" } }, "minimalistic-assert": { @@ -10949,6 +10268,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -10956,7 +10276,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true }, "minipass": { "version": "2.9.0", @@ -10964,8 +10285,8 @@ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.1.1" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, "minizlib": { @@ -10974,7 +10295,7 @@ "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "requires": { - "minipass": "2.9.0" + "minipass": "^2.9.0" } }, "mississippi": { @@ -10983,16 +10304,16 @@ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.7.1", - "end-of-stream": "1.4.3", - "flush-write-stream": "1.1.1", - "from2": "2.3.0", - "parallel-transform": "1.2.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "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" }, "dependencies": { "pump": { @@ -11001,8 +10322,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.3", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -11011,6 +10332,7 @@ "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": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -11020,6 +10342,7 @@ "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" } @@ -11030,6 +10353,7 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" }, @@ -11037,7 +10361,8 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true } } }, @@ -11057,7 +10382,7 @@ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", "requires": { - "moment": "2.24.0" + "moment": ">= 2.9.0" } }, "move-concurrently": { @@ -11077,7 +10402,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "multicast-dns": { "version": "6.2.3", @@ -11111,24 +10437,26 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, "optional": 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": { - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -11155,33 +10483,33 @@ "integrity": "sha512-GT6QK5WAirQwALdeJPiXdgRd5PzRqcknb/C/G+cCDEbUFri4oGVmns2Nl4I0FGg/cRn6nXTxRiUunOSqZ3Lehw==", "dev": true, "requires": { - "ajv": "6.10.2", - "autoprefixer": "9.6.1", - "browserslist": "4.6.6", - "chalk": "2.4.2", - "chokidar": "3.2.1", - "clean-css": "4.2.1", - "commander": "3.0.2", - "fs-extra": "8.1.0", - "glob": "7.1.3", - "injection-js": "2.2.2", - "less": "3.9.0", - "less-plugin-npm-import": "2.1.0", - "node-sass-tilde-importer": "1.0.2", - "postcss": "7.0.17", - "postcss-url": "8.0.0", - "read-pkg-up": "5.0.0", - "rimraf": "3.0.0", - "rollup": "1.22.0", - "rollup-plugin-commonjs": "10.1.0", - "rollup-plugin-json": "4.0.0", - "rollup-plugin-node-resolve": "5.2.0", - "rollup-plugin-sourcemaps": "0.4.2", - "rxjs": "6.5.3", - "sass": "1.22.9", - "stylus": "0.54.5", - "terser": "4.1.4", - "update-notifier": "3.0.1" + "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", + "rimraf": "^3.0.0", + "rollup": "^1.12.1", + "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" }, "dependencies": { "ajv": { @@ -11190,10 +10518,10 @@ "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": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "anymatch": { @@ -11202,8 +10530,8 @@ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "normalize-path": "3.0.0", - "picomatch": "2.0.7" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "binary-extensions": { @@ -11218,7 +10546,7 @@ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "fill-range": "7.0.1" + "fill-range": "^7.0.1" } }, "chokidar": { @@ -11227,14 +10555,14 @@ "integrity": "sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==", "dev": true, "requires": { - "anymatch": "3.1.1", - "braces": "3.0.2", - "fsevents": "2.1.0", - "glob-parent": "5.1.0", - "is-binary-path": "2.1.0", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "readdirp": "3.1.3" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.0", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.1.3" } }, "commander": { @@ -11249,7 +10577,7 @@ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "to-regex-range": "5.0.1" + "to-regex-range": "^5.0.1" } }, "fsevents": { @@ -11265,7 +10593,7 @@ "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { - "is-glob": "4.0.1" + "is-glob": "^4.0.1" } }, "is-binary-path": { @@ -11274,7 +10602,7 @@ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "binary-extensions": "2.0.0" + "binary-extensions": "^2.0.0" } }, "is-number": { @@ -11295,10 +10623,10 @@ "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2", - "lines-and-columns": "1.1.6" + "@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": { @@ -11307,10 +10635,10 @@ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "@types/normalize-package-data": "2.4.0", - "normalize-package-data": "2.5.0", - "parse-json": "5.0.0", - "type-fest": "0.6.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" } }, "read-pkg-up": { @@ -11319,8 +10647,8 @@ "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", "dev": true, "requires": { - "find-up": "3.0.0", - "read-pkg": "5.2.0" + "find-up": "^3.0.0", + "read-pkg": "^5.0.0" } }, "readdirp": { @@ -11329,7 +10657,7 @@ "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", "dev": true, "requires": { - "picomatch": "2.0.7" + "picomatch": "^2.0.4" } }, "rimraf": { @@ -11338,7 +10666,7 @@ "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", "dev": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } }, "to-regex-range": { @@ -11347,7 +10675,7 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "7.0.0" + "is-number": "^7.0.0" } }, "type-fest": { @@ -11363,7 +10691,7 @@ "resolved": "https://registry.npmjs.org/ngrx-store-localstorage/-/ngrx-store-localstorage-8.0.0.tgz", "integrity": "sha512-3AHqw1AeXDXU/Hgxlh5fjP/srgGuP8BJR2uQ6ViGLeKwMEQDZuQfwd8zu9+bPZcvIxbAcxjWoGCVJXYEkBlxmg==", "requires": { - "deepmerge": "3.3.0" + "deepmerge": "^3.2.0" } }, "ngx-moment": { @@ -11371,7 +10699,7 @@ "resolved": "https://registry.npmjs.org/ngx-moment/-/ngx-moment-3.4.0.tgz", "integrity": "sha512-GEqzSsu12VsXXP35aerlQpuZ1ienEYQZxHmp+RH7EuJD7hWamKgLOpmbiDI9Ij3KLW/UApvonYzZvyRSv3ea/w==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "nice-try": { @@ -11409,29 +10737,29 @@ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { - "assert": "1.5.0", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "3.0.0", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "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.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.2", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.11", + "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.1", - "vm-browserify": "1.1.0" + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -11446,8 +10774,9 @@ "version": "1.1.33", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.33.tgz", "integrity": "sha512-I0V30bWQEoHb+10W8oedVoUrdjW5wIkYm0w7vvcrPO95pZY738m1k77GF5sO0vKg5eXYg9oGtrMAETbgZGm11A==", + "dev": true, "requires": { - "semver": "5.6.0" + "semver": "^5.3.0" } }, "node-sass-tilde-importer": { @@ -11474,16 +10803,17 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "2.8.4", - "resolve": "1.12.0", - "semver": "5.6.0", - "validate-npm-package-license": "3.0.4" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { "version": "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" } @@ -11500,10 +10830,10 @@ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "normalizr": { @@ -11544,8 +10874,8 @@ "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", "dev": true, "requires": { - "ignore-walk": "3.0.2", - "npm-bundled": "1.0.6" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npm-pick-manifest": { @@ -11554,9 +10884,9 @@ "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", "dev": true, "requires": { - "figgy-pudding": "3.5.1", - "npm-package-arg": "6.1.0", - "semver": "5.6.0" + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" } }, "npm-registry-fetch": { @@ -11565,13 +10895,13 @@ "integrity": "sha512-1ZQ+yjnxc698R5h9Yje9CASapzAZr7aYDkJDdERg9xg2hOEY0vRJwskOaJAXq8N/eLavzvW4g564YAfq6zMn/A==", "dev": true, "requires": { - "JSONStream": "1.3.5", - "bluebird": "3.7.0", - "figgy-pudding": "3.5.1", - "lru-cache": "5.1.1", - "make-fetch-happen": "5.0.0", - "npm-package-arg": "6.1.0", - "safe-buffer": "5.2.0" + "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": { "safe-buffer": { @@ -11696,6 +11026,7 @@ "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", @@ -11706,6 +11037,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" } @@ -11714,6 +11046,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" } @@ -11735,12 +11068,14 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, "requires": { "isobject": "^3.0.0" } @@ -11749,6 +11084,7 @@ "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": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", @@ -11792,6 +11128,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -11842,7 +11179,7 @@ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "2.1.0" + "mimic-fn": "^2.1.0" } }, "open": { @@ -11851,7 +11188,7 @@ "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "dev": true, "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "opn": { @@ -11860,7 +11197,7 @@ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "optimist": { @@ -11984,16 +11321,18 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, "requires": { - "p-try": "2.2.0" + "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.2.1" + "p-limit": "^2.0.0" } }, "p-map": { @@ -12008,13 +11347,14 @@ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dev": true, "requires": { - "retry": "0.12.0" + "retry": "^0.12.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==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "package-json": { "version": "6.5.0", @@ -12022,10 +11362,10 @@ "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dev": true, "requires": { - "got": "9.6.0", - "registry-auth-token": "4.0.0", - "registry-url": "5.1.0", - "semver": "6.3.0" + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" }, "dependencies": { "semver": { @@ -12042,34 +11382,34 @@ "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", "dev": true, "requires": { - "bluebird": "3.7.0", - "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.9.0", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "normalize-package-data": "2.5.0", - "npm-package-arg": "6.1.0", - "npm-packlist": "1.4.4", - "npm-pick-manifest": "2.2.3", - "npm-registry-fetch": "4.0.1", - "osenv": "0.1.5", - "promise-inflight": "1.0.1", - "promise-retry": "1.1.1", - "protoduck": "5.0.1", - "rimraf": "2.7.1", - "safe-buffer": "5.1.2", - "semver": "5.6.0", - "ssri": "6.0.1", - "tar": "4.4.13", - "unique-filename": "1.1.1", - "which": "1.3.1" + "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" }, "dependencies": { "npm-pick-manifest": { @@ -12078,9 +11418,9 @@ "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", "dev": true, "requires": { - "figgy-pudding": "3.5.1", - "npm-package-arg": "6.1.0", - "semver": "5.6.0" + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" } } } @@ -12097,9 +11437,9 @@ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "1.0.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "parse-asn1": { @@ -12108,12 +11448,12 @@ "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17", - "safe-buffer": "5.1.2" + "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": { @@ -12181,7 +11521,8 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "path-browserify": { "version": "0.0.1", @@ -12192,17 +11533,20 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "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=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", @@ -12219,7 +11563,8 @@ "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==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "path-root": { "version": "0.1.1", @@ -12316,8 +11661,9 @@ "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" + "find-up": "^3.0.0" } }, "plugin-error": { @@ -12326,10 +11672,10 @@ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "ansi-colors": "1.1.0", - "arr-diff": "4.0.0", - "arr-union": "3.1.0", - "extend-shallow": "3.0.2" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" }, "dependencies": { "ansi-colors": { @@ -12338,7 +11684,7 @@ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "ansi-wrap": "^0.1.0" } } } @@ -12355,9 +11701,9 @@ "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", "dev": true, "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "async": { @@ -12371,7 +11717,8 @@ "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=" + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true }, "postcss": { "version": "7.0.17", @@ -12379,9 +11726,9 @@ "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "dependencies": { "source-map": { @@ -12418,8 +11765,8 @@ "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", "dev": true, "requires": { - "cosmiconfig": "5.2.1", - "import-cwd": "2.1.0" + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" } }, "postcss-loader": { @@ -12473,12 +11820,6 @@ "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 - }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -12488,7 +11829,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", @@ -12499,7 +11841,8 @@ "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 }, "progress": { "version": "1.1.8", @@ -12654,17 +11997,17 @@ "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", "dev": true, "requires": { - "adm-zip": "0.4.13", - "chalk": "1.1.3", - "del": "2.2.2", - "glob": "7.1.3", - "ini": "1.3.5", - "minimist": "1.2.0", - "q": "1.4.1", - "request": "2.88.0", - "rimraf": "2.7.1", - "semver": "5.6.0", - "xml2js": "0.4.22" + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" } } } @@ -12675,14 +12018,15 @@ "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "dev": true, "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.9.0" } }, "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", @@ -12752,7 +12096,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "q": { "version": "1.5.1", @@ -12778,8 +12123,8 @@ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -12851,8 +12196,8 @@ "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", "dev": true, "requires": { - "loader-utils": "1.2.3", - "schema-utils": "2.4.1" + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" }, "dependencies": { "ajv": { @@ -12861,10 +12206,10 @@ "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": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "schema-utils": { @@ -12873,8 +12218,8 @@ "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-keywords": "3.4.1" + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" } } } @@ -12914,11 +12259,11 @@ "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==", "dev": true, "requires": { - "glob": "7.1.3", - "graceful-fs": "4.2.2", - "json-parse-better-errors": "1.0.2", - "normalize-package-data": "2.5.0", - "slash": "1.0.0" + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" } }, "read-package-tree": { @@ -12927,9 +12272,9 @@ "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", "dev": true, "requires": { - "read-package-json": "2.1.0", - "readdir-scoped-modules": "1.1.0", - "util-promisify": "2.1.0" + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" } }, "read-pkg": { @@ -12997,6 +12342,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", @@ -13013,20 +12359,21 @@ "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", "dev": true, "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "graceful-fs": "4.2.2", - "once": "1.4.0" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" } }, "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.2.2", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "readline2": { @@ -13066,14 +12413,16 @@ "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.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, "requires": { - "regenerate": "1.4.0" + "regenerate": "^1.4.0" } }, "regenerator-runtime": { @@ -13086,14 +12435,16 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, "requires": { - "private": "0.1.8" + "private": "^0.1.6" } }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -13105,20 +12456,21 @@ "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", "dev": true, "requires": { - "define-properties": "1.1.3" + "define-properties": "^1.1.2" } }, "regexpu-core": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "8.1.0", - "regjsgen": "0.5.0", - "regjsparser": "0.6.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.1.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" } }, "registry-auth-token": { @@ -13127,8 +12479,8 @@ "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", "dev": true, "requires": { - "rc": "1.2.8", - "safe-buffer": "5.1.2" + "rc": "^1.2.8", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -13137,20 +12489,22 @@ "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "dev": true, "requires": { - "rc": "1.2.8" + "rc": "^1.2.8" } }, "regjsgen": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==" + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true }, "regjsparser": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "remove-bom-buffer": { @@ -13177,17 +12531,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=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", @@ -13221,9 +12578,9 @@ "integrity": "sha512-x8uSfKKK/5YiJ8JYsNMwa1PJYvHfPdUABVXd21ro09Nh5BRZ5ATuACwrqCNpktwVqVbFTk/cIGFepeMqY0oX3g==", "dev": true, "requires": { - "chalk": "2.4.2", - "glob": "7.1.4", - "yargs": "13.3.0" + "chalk": "^2.4.2", + "glob": "^7.1.4", + "yargs": "^13.3.0" }, "dependencies": { "ansi-regex": { @@ -13238,9 +12595,9 @@ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "3.1.0", - "strip-ansi": "5.2.0", - "wrap-ansi": "5.1.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "emoji-regex": { @@ -13261,12 +12618,12 @@ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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": { @@ -13287,9 +12644,9 @@ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { @@ -13298,7 +12655,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } }, "which-module": { @@ -13313,9 +12670,9 @@ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "string-width": "3.1.0", - "strip-ansi": "5.2.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "yargs": { @@ -13324,16 +12681,16 @@ "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "5.0.0", - "find-up": "3.0.0", - "get-caller-file": "2.0.5", - "require-directory": "2.1.1", - "require-main-filename": "2.0.0", - "set-blocking": "2.0.0", - "string-width": "3.1.0", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "13.1.1" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } }, "yargs-parser": { @@ -13342,8 +12699,8 @@ "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -13402,12 +12759,6 @@ "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 - }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -13430,7 +12781,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -13462,8 +12813,9 @@ "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" + "path-parse": "^1.0.6" } }, "resolve-cwd": { @@ -13481,8 +12833,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -13503,7 +12855,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", @@ -13511,7 +12864,7 @@ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "lowercase-keys": "1.0.1" + "lowercase-keys": "^1.0.0" } }, "restore-cursor": { @@ -13520,14 +12873,15 @@ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "5.1.0", - "signal-exit": "3.0.2" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true }, "retry": { "version": "0.12.0", @@ -13553,7 +12907,7 @@ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } }, "ripemd160": { @@ -13572,9 +12926,9 @@ "integrity": "sha512-x4l4ZrV/Mr/x/jvFTmwROdEAhbZjx16yDRTVSKWh/i4oJDuW2dVEbECT853mybYCz7BAitU8ElGlhx7dNjw3qQ==", "dev": true, "requires": { - "@types/estree": "0.0.39", - "@types/node": "12.7.9", - "acorn": "7.1.0" + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" }, "dependencies": { "acorn": { @@ -13591,11 +12945,11 @@ "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", "dev": true, "requires": { - "estree-walker": "0.6.1", - "is-reference": "1.1.4", - "magic-string": "0.25.3", - "resolve": "1.12.0", - "rollup-pluginutils": "2.8.2" + "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": { @@ -13604,7 +12958,7 @@ "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", "dev": true, "requires": { - "rollup-pluginutils": "2.8.2" + "rollup-pluginutils": "^2.5.0" } }, "rollup-plugin-node-resolve": { @@ -13614,10 +12968,10 @@ "dev": true, "requires": { "@types/resolve": "0.0.8", - "builtin-modules": "3.1.0", - "is-module": "1.0.0", - "resolve": "1.12.0", - "rollup-pluginutils": "2.8.2" + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" } }, "rollup-plugin-sourcemaps": { @@ -13645,7 +12999,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "run-parallel": { @@ -13679,7 +13033,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "rxjs-spy": { @@ -13687,11 +13041,11 @@ "resolved": "https://registry.npmjs.org/rxjs-spy/-/rxjs-spy-7.5.1.tgz", "integrity": "sha512-dJ9mO4HvW2r16PsU15Qsc0RVkG7pFrfyCNTGx3vrxWje3kIgZ6QjMVnWblQxbniZ32lwLk/2x9+D2O6GhgXV/w==", "requires": { - "@types/circular-json": "0.4.0", - "@types/stacktrace-js": "0.0.32", - "circular-json": "0.5.9", - "error-stack-parser": "2.0.4", - "stacktrace-gps": "3.0.3" + "@types/circular-json": "^0.4.0", + "@types/stacktrace-js": "^0.0.32", + "circular-json": "^0.5.0", + "error-stack-parser": "^2.0.1", + "stacktrace-gps": "^3.0.2" } }, "rxjs-tslint": { @@ -13700,11 +13054,40 @@ "integrity": "sha512-NnOfqutNfdT7VQnQm32JLYh2gDZjc0gdWZFtrxf/czNGkLKJ1nOO6jbKAFI09W0f9lCtv6P2ozxjbQH8TSPPFQ==", "dev": true, "requires": { - "chalk": "2.4.2", - "optimist": "0.6.1", - "tslint": "5.20.0", - "tsutils": "2.29.0", - "typescript": "3.5.3" + "chalk": "^2.4.0", + "optimist": "^0.6.1", + "tslint": "^5.9.1", + "tsutils": "^2.25.0", + "typescript": ">=2.8.3" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + } + } } }, "rxjs-websockets": { @@ -13715,12 +13098,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" } @@ -13736,7 +13121,7 @@ "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==", "dev": true, "requires": { - "chokidar": "2.0.4" + "chokidar": ">=2.0.0 <4.0.0" } }, "sass-lint": { @@ -13745,20 +13130,20 @@ "integrity": "sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==", "dev": true, "requires": { - "commander": "2.20.0", - "eslint": "2.13.1", + "commander": "^2.8.1", + "eslint": "^2.7.0", "front-matter": "2.1.2", - "fs-extra": "3.0.1", - "glob": "7.1.3", - "globule": "1.2.1", - "gonzales-pe-sl": "4.2.3", - "js-yaml": "3.13.1", - "known-css-properties": "0.3.0", - "lodash.capitalize": "4.2.1", - "lodash.kebabcase": "4.1.1", - "merge": "1.2.1", - "path-is-absolute": "1.0.1", - "util": "0.10.4" + "fs-extra": "^3.0.1", + "glob": "^7.0.0", + "globule": "^1.0.0", + "gonzales-pe-sl": "^4.2.3", + "js-yaml": "^3.5.4", + "known-css-properties": "^0.3.0", + "lodash.capitalize": "^4.1.0", + "lodash.kebabcase": "^4.0.0", + "merge": "^1.2.0", + "path-is-absolute": "^1.0.0", + "util": "^0.10.3" }, "dependencies": { "fs-extra": { @@ -13767,9 +13152,9 @@ "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "jsonfile": "3.0.1", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" } }, "inherits": { @@ -13784,7 +13169,7 @@ "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "dev": true, "requires": { - "graceful-fs": "4.2.2" + "graceful-fs": "^4.1.6" } }, "util": { @@ -13804,11 +13189,11 @@ "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", "dev": true, "requires": { - "clone-deep": "4.0.1", - "loader-utils": "1.2.3", - "neo-async": "2.6.1", - "pify": "4.0.1", - "semver": "5.6.0" + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" }, "dependencies": { "pify": { @@ -13886,7 +13271,8 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true }, "semver-diff": { "version": "2.1.0", @@ -13931,18 +13317,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.7.2", + "http-errors": "~1.7.2", "mime": "1.6.0", "ms": "2.1.1", - "on-finished": "2.3.0", - "range-parser": "1.2.1", - "statuses": "1.5.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { "ms": { @@ -13980,10 +13366,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" } }, "inherits": { @@ -14006,9 +13392,9 @@ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.3", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", "send": "0.17.1" } }, @@ -14028,6 +13414,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", @@ -14039,6 +13426,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" } @@ -14073,7 +13461,7 @@ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" } }, "shebang-command": { @@ -14125,6 +13513,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", @@ -14140,6 +13529,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" } @@ -14148,6 +13538,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" } @@ -14158,6 +13549,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", @@ -14168,6 +13560,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" } @@ -14176,6 +13569,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" } @@ -14184,6 +13578,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" } @@ -14192,6 +13587,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", @@ -14204,6 +13600,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" }, @@ -14212,6 +13609,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" } @@ -14361,7 +13759,7 @@ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { - "websocket-driver": "0.7.3" + "websocket-driver": ">=0.5.1" } }, "ms": { @@ -14378,7 +13776,7 @@ "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", "dev": true, "requires": { - "ip": "1.1.5", + "ip": "^1.1.5", "smart-buffer": "4.0.2" } }, @@ -14388,8 +13786,8 @@ "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, "requires": { - "agent-base": "4.2.1", - "socks": "2.3.2" + "agent-base": "~4.2.1", + "socks": "~2.3.2" }, "dependencies": { "agent-base": { @@ -14398,7 +13796,7 @@ "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" } } } @@ -14409,7 +13807,7 @@ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -14437,6 +13835,7 @@ "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==", + "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -14451,8 +13850,8 @@ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "source-map": { @@ -14466,12 +13865,14 @@ "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.6", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", - "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==" + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true }, "sparkles": { "version": "1.0.1", @@ -14485,8 +13886,8 @@ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.5" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -14517,11 +13918,11 @@ "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "dev": true, "requires": { - "debug": "4.1.1", - "handle-thing": "2.0.0", - "http-deceiver": "1.2.7", - "select-hose": "2.0.0", - "spdy-transport": "3.0.0" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "dependencies": { "debug": { @@ -14530,7 +13931,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -14576,9 +13977,9 @@ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -14589,7 +13990,7 @@ "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", "dev": true, "requires": { - "chalk": "2.4.2" + "chalk": "^2.0.1" } }, "split": { @@ -14605,6 +14006,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" } @@ -14621,15 +14023,15 @@ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "ssri": { @@ -14638,7 +14040,7 @@ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "figgy-pudding": "3.5.1" + "figgy-pudding": "^3.5.1" } }, "stack-trace": { @@ -14658,13 +14060,14 @@ "integrity": "sha512-51Rr7dXkyFUKNmhY/vqZWK+EvdsfFSRiQVtgHTFlAdNIYaDD7bVh21yBHXaNWAvTD+w+QSjxHg7/v6Tz4veExA==", "requires": { "source-map": "0.5.6", - "stackframe": "1.1.0" + "stackframe": "^1.1.0" } }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -14674,6 +14077,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" } @@ -14725,9 +14129,9 @@ "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "jsonfile": "3.0.1", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" } }, "jsonfile": { @@ -14736,7 +14140,7 @@ "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "dev": true, "requires": { - "graceful-fs": "4.2.2" + "graceful-fs": "^4.1.6" } }, "mkdirp": { @@ -14873,8 +14277,8 @@ "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", "dev": true, "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "string.prototype.trimright": { @@ -14883,14 +14287,15 @@ "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", "dev": true, "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -14899,6 +14304,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" } @@ -14936,8 +14342,8 @@ "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", "dev": true, "requires": { - "loader-utils": "1.2.3", - "schema-utils": "2.4.1" + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" }, "dependencies": { "ajv": { @@ -14946,10 +14352,10 @@ "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": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "schema-utils": { @@ -14958,8 +14364,8 @@ "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-keywords": "3.4.1" + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" } } } @@ -15020,7 +14426,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "sver-compat": { @@ -15141,7 +14547,8 @@ "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", @@ -15149,13 +14556,13 @@ "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { - "chownr": "1.1.3", - "fs-minipass": "1.2.7", - "minipass": "2.9.0", - "minizlib": "1.3.3", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.1.1" + "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" } }, "teeny-request": { @@ -15226,12 +14633,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", @@ -15267,9 +14668,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "execa": { @@ -15278,13 +14679,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "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": { @@ -15299,8 +14700,8 @@ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "yallist": { @@ -15317,9 +14718,9 @@ "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==", "dev": true, "requires": { - "commander": "2.20.0", - "source-map": "0.6.1", - "source-map-support": "0.5.13" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { @@ -15336,15 +14737,15 @@ "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "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": "1.9.1", - "source-map": "0.6.1", - "terser": "4.1.4", - "webpack-sources": "1.4.3", - "worker-farm": "1.7.0" + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { "find-cache-dir": { @@ -15353,9 +14754,9 @@ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "2.1.0", - "pkg-dir": "3.0.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, "source-map": { @@ -15384,8 +14785,8 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.2" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "through2-filter": { @@ -15416,7 +14817,7 @@ "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -15460,6 +14861,7 @@ "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" }, @@ -15468,6 +14870,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" } @@ -15484,6 +14887,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", @@ -15495,6 +14899,7 @@ "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" @@ -15536,7 +14941,8 @@ "tree-kill": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true }, "trim-right": { "version": "1.0.1", @@ -15544,18 +14950,6 @@ "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.4.2", - "enhanced-resolve": "4.1.0", - "loader-utils": "1.2.3", - "micromatch": "3.1.10", - "semver": "5.6.0" - } - }, "ts-md5": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.6.tgz", @@ -15567,39 +14961,11 @@ "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", "dev": true, "requires": { - "arg": "4.1.1", - "diff": "4.0.1", - "make-error": "1.3.5", - "source-map-support": "0.5.13", - "yn": "3.1.1" - } - }, - "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": { - "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.4.2", - "enhanced-resolve": "4.1.0", - "tsconfig-paths": "3.9.0" + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" } }, "tsickle": { @@ -15608,9 +14974,9 @@ "integrity": "sha512-ufUZqLUNqh+kOfr52N/hJ5JbiDO32/CO7ZCteZBX9HA2kiejwEgDaJeJe1GAj2TIu683IgTA/LPKvlns6Liw0w==", "dev": true, "requires": { - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map": "0.7.3" + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.7.3" }, "dependencies": { "source-map": { @@ -15627,24 +14993,24 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tslint": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.0.tgz", - "integrity": "sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", + "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "builtin-modules": "1.1.1", - "chalk": "2.4.2", - "commander": "2.20.0", - "diff": "4.0.1", - "glob": "7.1.3", - "js-yaml": "3.13.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "resolve": "1.12.0", - "semver": "5.6.0", - "tslib": "1.10.0", - "tsutils": "2.29.0" + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.10.0", + "tsutils": "^2.29.0" }, "dependencies": { "builtin-modules": { @@ -15661,7 +15027,7 @@ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.8.1" } }, "tty-browserify": { @@ -15713,7 +15079,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.24" + "mime-types": "~2.1.24" } }, "typedarray": { @@ -15735,8 +15101,8 @@ "dev": true, "optional": true, "requires": { - "commander": "2.20.0", - "source-map": "0.6.1" + "commander": "~2.20.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -15792,31 +15158,36 @@ "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.5" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true }, "unicode-property-aliases-ecmascript": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "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", @@ -15839,7 +15210,7 @@ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unique-stream": { @@ -15867,9 +15238,9 @@ "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", "dev": true, "requires": { - "debug": "3.2.6", - "request": "2.88.0", - "uuid": "3.3.3" + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" }, "dependencies": { "debug": { @@ -15878,7 +15249,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -15905,6 +15276,7 @@ "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" @@ -15914,6 +15286,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", @@ -15924,6 +15297,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" } @@ -15933,14 +15307,16 @@ "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", @@ -15948,24 +15324,25 @@ "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", "dev": true, "requires": { - "boxen": "3.2.0", - "chalk": "2.4.2", - "configstore": "4.0.0", - "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-yarn-global": "0.3.0", - "latest-version": "5.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^3.0.0", + "chalk": "^2.0.1", + "configstore": "^4.0.0", + "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-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -15973,7 +15350,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", @@ -15999,8 +15377,8 @@ "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { - "querystringify": "2.1.1", - "requires-port": "1.0.0" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, "url-parse-lax": { @@ -16009,7 +15387,7 @@ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "dev": true, "requires": { - "prepend-http": "2.0.0" + "prepend-http": "^2.0.0" }, "dependencies": { "prepend-http": { @@ -16029,7 +15407,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", @@ -16056,8 +15435,8 @@ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "yallist": { @@ -16088,7 +15467,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", @@ -16096,7 +15476,7 @@ "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", "dev": true, "requires": { - "object.getownpropertydescriptors": "2.0.3" + "object.getownpropertydescriptors": "^2.0.3" } }, "util.promisify": { @@ -16127,7 +15507,7 @@ "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", "dev": true, "requires": { - "homedir-polyfill": "1.0.3" + "homedir-polyfill": "^1.0.1" } }, "validate-npm-package-license": { @@ -16136,8 +15516,8 @@ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "3.1.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "validate-npm-package-name": { @@ -16178,12 +15558,12 @@ "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, "requires": { - "clone": "2.1.2", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.3", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } }, "vinyl-fs": { @@ -16234,12 +15614,6 @@ "vinyl": "^2.0.0" } }, - "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.0", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", @@ -16297,25 +15671,25 @@ "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "6.3.0", - "ajv": "6.10.2", - "ajv-keywords": "3.4.1", - "chrome-trace-event": "1.0.2", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.3", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.4.0", - "loader-utils": "1.2.3", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.6.1", - "node-libs-browser": "2.2.1", - "schema-utils": "1.0.0", - "tapable": "1.1.3", - "terser-webpack-plugin": "1.4.1", - "watchpack": "1.6.0", - "webpack-sources": "1.4.3" + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" }, "dependencies": { "acorn": { @@ -16330,10 +15704,10 @@ "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": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } } } @@ -16371,10 +15745,10 @@ "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", "dev": true, "requires": { - "memory-fs": "0.4.1", - "mime": "2.4.4", - "range-parser": "1.2.1", - "webpack-log": "2.0.0" + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" }, "dependencies": { "mime": { @@ -16392,37 +15766,37 @@ "dev": true, "requires": { "ansi-html": "0.0.7", - "bonjour": "3.5.0", - "chokidar": "2.1.8", - "compression": "1.7.4", - "connect-history-api-fallback": "1.6.0", - "debug": "4.1.1", - "del": "4.1.1", - "express": "4.17.1", - "html-entities": "1.2.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", - "opn": "5.5.0", - "p-retry": "3.0.1", - "portfinder": "1.0.24", - "schema-utils": "1.0.0", - "selfsigned": "1.10.7", - "semver": "6.3.0", - "serve-index": "1.9.1", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.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.0", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.21", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.3.0", + "serve-index": "^1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.3.0", - "spdy": "4.0.1", - "strip-ansi": "3.0.1", - "supports-color": "6.1.0", - "url": "0.11.0", - "webpack-dev-middleware": "3.7.0", - "webpack-log": "2.0.0", - "ws": "6.2.1", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", "yargs": "12.0.5" }, "dependencies": { @@ -16438,18 +15812,18 @@ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.3", - "braces": "2.3.2", - "fsevents": "1.2.9", - "glob-parent": "3.1.0", - "inherits": "2.0.4", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.2.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" } }, "cliui": { @@ -16458,9 +15832,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "strip-ansi": { @@ -16469,7 +15843,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -16480,7 +15854,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "invert-kv": { @@ -16501,7 +15875,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "mem": { @@ -16510,9 +15884,9 @@ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, "ms": { @@ -16533,9 +15907,9 @@ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.3.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "semver": { @@ -16550,8 +15924,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "strip-ansi": { @@ -16560,7 +15934,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -16577,18 +15951,18 @@ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "11.1.1" + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.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 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, "yargs-parser": { @@ -16597,8 +15971,8 @@ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -16622,19 +15996,14 @@ "lodash": "^4.17.5" } }, - "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", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -16660,9 +16029,9 @@ "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "dev": true, "requires": { - "http-parser-js": "0.4.10", - "safe-buffer": "5.1.2", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { @@ -16746,7 +16115,7 @@ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "worker-plugin": { @@ -16755,7 +16124,7 @@ "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", "dev": true, "requires": { - "loader-utils": "1.2.3" + "loader-utils": "^1.1.0" } }, "wrap-ansi": { @@ -16789,9 +16158,9 @@ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "ws": { @@ -16800,7 +16169,7 @@ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "async-limiter": "1.0.1" + "async-limiter": "~1.0.0" } }, "xdg-basedir": { @@ -16893,19 +16262,19 @@ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "dev": true, "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" }, "dependencies": { "camelcase": { @@ -16945,7 +16314,7 @@ "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "dev": true, "requires": { - "buffer-crc32": "0.2.13" + "buffer-crc32": "~0.2.3" } }, "yeast": { From 875c9c949d25e7a5288f010092d30ab3a2510281 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Sun, 5 Apr 2020 14:45:27 +0100 Subject: [PATCH 006/176] Package update --- package-lock.json | 90 ++++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index de9410d41f..53ddb2da46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3084,6 +3084,11 @@ } } }, + "brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg=" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -14097,11 +14102,86 @@ "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" + "version": "github:nwmac/ajsf#8c88d9a8a6b75e8bf39ab0151bbcd7a85d3aef7a", + "from": "github:nwmac/ajsf", + "requires": { + "@angular/animations": "^9.0.4", + "@angular/cdk": "^9.2.0", + "@angular/common": "^9.0.4", + "@angular/compiler": "^9.0.4", + "@angular/core": "^9.0.4", + "@angular/flex-layout": "^9.0.0-beta.29", + "@angular/forms": "^9.0.4", + "@angular/material": "^9.2.0", + "@angular/platform-browser": "^9.0.4", + "@angular/platform-browser-dynamic": "^9.0.4", + "@angular/router": "^9.0.4", + "brace": "^0.11.1", + "core-js": "^3.6.4", + "lodash-es": "^4.17.15", + "rxjs": "^6.5.2", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + }, + "dependencies": { + "@angular/animations": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.0.tgz", + "integrity": "sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag==" + }, + "@angular/cdk": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.0.tgz", + "integrity": "sha512-jeeznvNDpR9POuxzz8Y0zFvMynG9HCJo3ZPTqOjlOq8Lj8876+rLsHDvKEMeLdwlkdi1EweYJW1CLQzI+TwqDA==", + "requires": { + "parse5": "^5.0.0" + } + }, + "@angular/common": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.0.tgz", + "integrity": "sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA==" + }, + "@angular/compiler": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.0.tgz", + "integrity": "sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA==" + }, + "@angular/core": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.0.tgz", + "integrity": "sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w==" + }, + "@angular/forms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.0.tgz", + "integrity": "sha512-5GC8HQlPChPV+168zLlm4yj4syA6N9ChSKV0tmzj1zIfMcub1UAOaB9IYaXRHQsjPFh9OuQXwmkzScyAfhEVjA==" + }, + "@angular/material": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.0.tgz", + "integrity": "sha512-KKzEIVh6/m56m+Ao8p4PK0SyEr0574l3VP2swj1qPag3u+FYgemmXCGTaChrKdDsez+zeTCPXImBGXzE6NQ80Q==" + }, + "@angular/platform-browser": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.0.tgz", + "integrity": "sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg==" + }, + "@angular/platform-browser-dynamic": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz", + "integrity": "sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ==" + }, + "@angular/router": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.0.tgz", + "integrity": "sha512-cExO1nPnoPFiUJWZ28hTHozPLFoCmqr3xqcM57We0hhKE0esdrO+gRWKRH0EJERukLbU8coPKVhA8daGUpASiQ==" + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + } } }, "stratos-protractor-reporter": { diff --git a/package.json b/package.json index c9d8de8f45..fa7d7b6075 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "rxjs": "^6.2.0", "rxjs-spy": "^7.0.2", "rxjs-websockets": "~8.0.0", - "stratos-angular6-json-schema-form": "^7.0.6", + "stratos-angular6-json-schema-form": "nwmac/ajsf", "ts-md5": "^1.2.4", "web-animations-js": "^2.3.2", "xterm": "^4.0.2", From bae8e49289cbd39975f73f8ad84634aec41c8cf7 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Sun, 5 Apr 2020 14:46:58 +0100 Subject: [PATCH 007/176] Package update --- package-lock.json | 23 +++++++++++++++++++---- package.json | 4 ++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53ddb2da46..ed5e742515 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15073,9 +15073,9 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tslint": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", - "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.1.tgz", + "integrity": "sha512-kd6AQ/IgPRpLn6g5TozqzPdGNZ0q0jtXW4//hRcj10qLYBaa3mTUU2y2MCG+RXZm8Zx+KZi0eA+YCrMyNlF4UA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -15086,7 +15086,7 @@ "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.10.0", @@ -15098,6 +15098,21 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.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" + } } } }, diff --git a/package.json b/package.json index fa7d7b6075..b61afba2d8 100644 --- a/package.json +++ b/package.json @@ -138,13 +138,13 @@ "replace-in-file": "^4.1.3", "request": "^2.88.0", "request-promise-native": "^1.0.7", - "rxjs-tslint": "^0.1.5", + "rxjs-tslint": "^0.1.7", "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": "~6.1.0", + "tslint": "~6.1.1", "typescript": "<3.6.0" } } From c2626495638980aa39d89babea901131db1ffa14 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Mon, 6 Apr 2020 19:49:52 +0100 Subject: [PATCH 008/176] Angular 9 migration --- .npmrc | 2 + angular.json | 37 +- package-lock.json | 9083 +++++++++++------ package.json | 126 +- .../card-autoscaler-default.component.ts | 2 +- .../combo-chart/combo-chart.component.ts | 2 +- .../cf-autoscaler/tsconfig.lib.prod.json | 6 + .../log-stream-tab.component.ts | 2 +- .../deploy-application-step2.component.ts | 2 +- ...-foundry-organization-summary.component.ts | 2 +- .../manage-users-set-usernames.component.ts | 2 +- .../add-service-instance.component.spec.ts | 2 +- .../bind-apps-step.component.spec.ts | 2 +- .../specify-details-step.component.spec.ts | 2 +- .../shared/components/components.module.ts | 2 +- .../event-metadata.component.ts | 2 +- .../list-types/cf-users/cf-permission-cell.ts | 3 +- .../schema-form/schema-form.component.spec.ts | 2 +- .../schema-form/schema-form.component.ts | 2 +- .../cloud-foundry/tsconfig.lib.prod.json | 6 + src/frontend/packages/core/src/app.module.ts | 7 +- .../packages/core/src/core/md.module.ts | 2 +- .../edit-quota-step.component.ts | 2 +- .../edit-space-quota-step.component.ts | 2 +- .../dashboard-base.component.ts | 8 +- .../create-endpoint-cf-step-1.component.ts | 6 +- .../packages/core/src/route-reuse-stragegy.ts | 2 + .../dialog-confirm.component.spec.ts | 2 +- .../app-table-cell-default.component.ts | 5 +- .../list-table/table-cell-status.directive.ts | 2 +- .../endpoint-card/endpoint-card.component.ts | 4 +- .../shared/components/list/list.component.ts | 4 +- .../components/list/list.component.types.ts | 2 + .../no-content-message.component.ts | 2 +- src/frontend/packages/core/tsconfig.app.json | 12 +- .../store/src/entity-catalog.module.ts | 2 +- .../packages/store/tsconfig.lib.prod.json | 6 + 37 files changed, 6005 insertions(+), 3354 deletions(-) create mode 100644 .npmrc create mode 100644 src/frontend/packages/cf-autoscaler/tsconfig.lib.prod.json create mode 100644 src/frontend/packages/cloud-foundry/tsconfig.lib.prod.json create mode 100644 src/frontend/packages/store/tsconfig.lib.prod.json diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..dbde4965c9 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +@nwmac:registry=https://npm.pkg.github.com + diff --git a/angular.json b/angular.json index 43d24281ff..12d5d6f658 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,12 @@ }, "configurations": { "production": { + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], "optimization": true, "outputHashing": "all", "sourceMap": false, @@ -101,6 +108,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,6 +132,12 @@ }, "configurations": { "production": { + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], "fileReplacements": [ { "replace": "src/frontend/packages/core/src/environments/environment.ts", @@ -216,7 +230,12 @@ "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": { "builder": "@angular-devkit/build-angular:karma", "options": { @@ -254,7 +273,12 @@ "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": { "builder": "@angular-devkit/build-angular:karma", "options": { @@ -292,7 +316,12 @@ "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": { "builder": "@angular-devkit/build-angular:karma", "options": { @@ -323,7 +352,7 @@ "schematics": { "@schematics/angular:component": { "prefix": "app", - "styleext": "scss" + "style": "scss" }, "@schematics/angular:directive": { "prefix": "app" diff --git a/package-lock.json b/package-lock.json index ed5e742515..7110fb959f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,19 +5,19 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.803.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.7.tgz", - "integrity": "sha512-8cjg4BnLNbCc3YwPzuAjnt4oKHJmYr7IvdcLockrp9MZqxaNbSs9cy55iFKZyz3eGahYpTxxRa4oTUQsxRT3fQ==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.0.tgz", + "integrity": "sha512-SlqEBkPrT40zMCy5344AsUqC76pEPCaGPaAkCIvadaz2dC9vNMzQrvubCPJHViD/TumkSX1kYmLS3iYASVM9GQ==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.7", - "rxjs": "6.4.0" + "@angular-devkit/core": "9.1.0", + "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,85 +26,78 @@ } }, "@angular-devkit/build-angular": { - "version": "0.803.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.7.tgz", - "integrity": "sha512-Rvd0JXstVWmdEY4+0lLJEdFEQuZD2fcVvIJPQGzJt1ExycDliP6ebrhjeWOpLuRCgUU2/CObHgh2rVEDDKeMHg==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.803.7", - "@angular-devkit/build-optimizer": "0.803.7", - "@angular-devkit/build-webpack": "0.803.7", - "@angular-devkit/core": "8.3.7", - "@babel/core": "7.5.5", - "@babel/preset-env": "7.5.5", - "@ngtools/webpack": "8.3.7", - "ajv": "6.10.2", - "autoprefixer": "9.6.1", - "browserslist": "4.6.6", - "cacache": "12.0.2", - "caniuse-lite": "1.0.30000989", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.0.tgz", + "integrity": "sha512-ftJVNlKvIomqRfr5jFVraPqlLSUJu8YyVbFv/aCsvhNpuZGkYpTOMoJDwyywdslSTH608BIoU63IAnIz9PwUdw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.901.0", + "@angular-devkit/build-optimizer": "0.901.0", + "@angular-devkit/build-webpack": "0.901.0", + "@angular-devkit/core": "9.1.0", + "@babel/core": "7.9.0", + "@babel/generator": "7.9.3", + "@babel/preset-env": "7.9.0", + "@babel/template": "7.8.6", + "@jsdevtools/coverage-istanbul-loader": "3.0.3", + "@ngtools/webpack": "9.1.0", + "ajv": "6.12.0", + "autoprefixer": "9.7.4", + "babel-loader": "8.0.6", + "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.0.4", - "core-js": "3.2.1", - "file-loader": "4.2.0", - "find-cache-dir": "3.0.0", - "glob": "7.1.4", - "istanbul-instrumenter-loader": "3.0.1", - "jest-worker": "24.9.0", + "copy-webpack-plugin": "5.1.1", + "core-js": "3.6.4", + "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", + "source-map-support": "0.5.16", "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.1.4", - "terser-webpack-plugin": "1.4.1", - "tree-kill": "1.2.1", - "webpack": "4.39.2", - "webpack-dev-middleware": "3.7.0", - "webpack-dev-server": "3.8.0", - "webpack-merge": "4.2.1", + "terser": "4.6.7", + "terser-webpack-plugin": "2.3.5", + "tree-kill": "1.2.2", + "webpack": "4.42.0", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.10.3", + "webpack-merge": "4.2.2", "webpack-sources": "1.4.3", - "webpack-subresource-integrity": "1.1.0-rc.6", - "worker-plugin": "3.2.0" + "webpack-subresource-integrity": "1.4.0", + "worker-plugin": "4.0.2" }, "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" - } - }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -121,19 +114,28 @@ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "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" + } + }, "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": { @@ -145,19 +147,19 @@ } }, "@angular-devkit/build-ng-packagr": { - "version": "0.803.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.803.7.tgz", - "integrity": "sha512-ZQG7ClH6BTbgaM6PMIjnUJNaSilP55yYVqnNQZ2dTisFrYNbu5OpNWzWcIME1znaW7VItXJELLgIwBjHJAWlpA==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.0.tgz", + "integrity": "sha512-cUQKK7+bYi3fOmq41cfr1ZFQwqAUUm0Yz7DgH34Ek7D98XudNOxJ63Xv4manId528WhqyGDP5/2tut7QNV3VJA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.7", - "rxjs": "6.4.0" + "@angular-devkit/architect": "0.901.0", + "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" @@ -166,15 +168,15 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.803.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.7.tgz", - "integrity": "sha512-tk6z/QKw2OM++6OTUiUXp/pAwKFyyvfJmzrsXdHqmBZyrqGPU1fcSOfuJCSGjjwjpiQ7tjSVHf/ZvZHakdOoOQ==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.0.tgz", + "integrity": "sha512-Y9sz8uf2zjilhPUVYb0K9Mio6c1d5c+csuDc15CCKzELXJwyyDxilIFgn6Eu+edM0HNQGzbIwkjy4DkR9mtuTQ==", "dev": true, "requires": { - "loader-utils": "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.8.3", "webpack-sources": "1.4.3" }, "dependencies": { @@ -183,31 +185,24 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true - }, - "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==", - "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.803.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.7.tgz", - "integrity": "sha512-hBFqPTMhQn0BhjhZ5kd69cknWeQu1o0v/+yJbF5otpn0c+QbjvI0Yq+ikF82rDFJIkO8UUjNCTBU6o6gdwW4pw==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.0.tgz", + "integrity": "sha512-Oze0VzIvHnoW12C80fiNH4HBu/GWmhJPXdNA7nRkU/tBQlIKnfngf8rQ0QbgecN2qdEXQpZJsP/XclTi3zugsg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.7", - "@angular-devkit/core": "8.3.7", - "rxjs": "6.4.0", - "webpack-merge": "4.2.1" + "@angular-devkit/architect": "0.901.0", + "@angular-devkit/core": "9.1.0", + "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" @@ -216,34 +211,22 @@ } }, "@angular-devkit/core": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.7.tgz", - "integrity": "sha512-DByn3rUOg21rDZQXdIFbN7Dt0JgUc11kyP3TZb8kzXRKdpPZA4AwvtQ6tZveR4+n1dTDX38P1ZGDsO6bdMQivg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.0.tgz", + "integrity": "sha512-vHTsrB4JaVUQ95FRnKrgo79Y3F6FokImrZdrmwkQmwAThpjXeXmpUEKZS+ZSTFRgesjiIysVGOFijARP4BQ7Bg==", "dev": true, "requires": { - "ajv": "6.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" - } - }, "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" @@ -258,19 +241,20 @@ } }, "@angular-devkit/schematics": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.7.tgz", - "integrity": "sha512-xdWvSLU5tuFOaeAaeMQRY0VJbic1gWyPFifx6VcU5oxi9wQY6o1j7AWMeEcsGh+PCZEt0G9WJQIh73tcKRqkNg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.0.tgz", + "integrity": "sha512-cb9PSvskMwWlL54fPfCcpJoyNDWAX6Wo7CzL5qpIB2cJCPLAuyfRUYYrkO77YUST+n2HvypHz0cZ5SNGMfaaBQ==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.7", - "rxjs": "6.4.0" + "@angular-devkit/core": "9.1.0", + "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" @@ -279,47 +263,44 @@ } }, "@angular/animations": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.9.tgz", - "integrity": "sha512-l30AF0d9P5okTPM1wieUHgcnDyGSNvyaBcxXSOkT790wAP2v5zs7VrKq9Lm+ICu4Nkx07KrOr5XLUHhqsg3VXA==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.0.tgz", + "integrity": "sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag==" }, "@angular/cdk": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.2.tgz", - "integrity": "sha512-e+BtFab0Vd1q/ZVu6l850Q4vvgyVYiugSX31oMRlp86fKHPowlAO7jL3z5JcAG7TybpLIqd7oqF8XQBR/yw83w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.0.tgz", + "integrity": "sha512-jeeznvNDpR9POuxzz8Y0zFvMynG9HCJo3ZPTqOjlOq8Lj8876+rLsHDvKEMeLdwlkdi1EweYJW1CLQzI+TwqDA==", "requires": { - "parse5": "^5.0.0", - "tslib": "^1.7.1" + "parse5": "^5.0.0" } }, "@angular/cli": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.7.tgz", - "integrity": "sha512-YZvF/+4vReqChaBA4pbsHO9/e/A6h1MUjPcUtQO4Ssp6hxTDJUnZfaMUzY0w0aZQSO31Phcw12qWtXZLqYn9Ww==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.0.tgz", + "integrity": "sha512-ofum4gPE/W3fKyzuJrpdHeOS0ZL8x0eYCgsrMyUoFodSpb5LWPqeW+56NgDTpIeny+Trx3pM9dr9QTUVTJ0vYg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.7", - "@angular-devkit/core": "8.3.7", - "@angular-devkit/schematics": "8.3.7", - "@schematics/angular": "8.3.7", - "@schematics/update": "0.803.7", + "@angular-devkit/architect": "0.901.0", + "@angular-devkit/core": "9.1.0", + "@angular-devkit/schematics": "9.1.0", + "@schematics/angular": "9.1.0", + "@schematics/update": "0.901.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "^4.1.1", + "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": "11.1.4", "read-package-tree": "5.3.1", - "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": { @@ -343,139 +324,222 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "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==", + "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.9", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.9.tgz", - "integrity": "sha512-76WDU1USlI5vAzqCJ3gxCQGuu57aJEggNk/xoWmQEXipiFTFBh2wSKn/dE6Txr/q3COTPIcrmb9OCeal5kQPIA==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.0.tgz", + "integrity": "sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA==" }, "@angular/compiler": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.9.tgz", - "integrity": "sha512-oQho19DnOhEDNerCOGuGK95tcZ2oy4dSA5SykJmmniRnZzPM2++bJD32qJehXHy1K+3hv2zN9x7HPhqT3ljT6g==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.0.tgz", + "integrity": "sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA==" }, "@angular/compiler-cli": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.9.tgz", - "integrity": "sha512-tqGBKPf3SRYNEGGJbmjom//U/eAjnecDhGUw6o+VkYE/wxYd9pPcLmcEwwyXBpIPJAsN8RsjTikPuH0gcNE8bw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.0.tgz", + "integrity": "sha512-xZ8mVPmPporSTtvNA+cbFJQymLzuWfMX6HDDgztZ2eZ5WcQJYloRN4CcYMEzDhCxfV1Zw9Tfc2l14jZD8osi6g==", "dev": true, "requires": { "canonical-path": "1.0.0", - "chokidar": "^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": { + "@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": { - "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" + "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": "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==", + "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" + } + }, + "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": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.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 }, - "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=", - "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" + } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "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": { - "invert-kv": "^2.0.0" + "binary-extensions": "^2.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "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": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "p-locate": "^4.1.0" } }, "normalize-path": { @@ -484,15 +548,43 @@ "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==", + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "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": { @@ -501,6 +593,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "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", @@ -508,40 +606,32 @@ "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": "^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": { - "ansi-regex": "^3.0.0" + "is-number": "^7.0.0" } }, "which-module": { @@ -550,29 +640,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.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -582,12 +683,9 @@ } }, "@angular/core": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.9.tgz", - "integrity": "sha512-GpHAuLOlN9iioELCQBmAsjETTUCyFgVUI3LXwh3e63jnpd+ZuuZcZbjfTYhtgYVNMetn7cVEO6p88eb7qvpUWQ==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.0.tgz", + "integrity": "sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w==" }, "@angular/flex-layout": { "version": "9.0.0-beta.29", @@ -595,68 +693,49 @@ "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" }, "@angular/forms": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.9.tgz", - "integrity": "sha512-kAdBuApC9PPOdPI8BmNhxCraAkXGbX/PkVan8pQ5xdumvgGqvVjbJvLaUSbJROPtgCRlQyiEDrHFd4gk/WU76A==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.0.tgz", + "integrity": "sha512-5GC8HQlPChPV+168zLlm4yj4syA6N9ChSKV0tmzj1zIfMcub1UAOaB9IYaXRHQsjPFh9OuQXwmkzScyAfhEVjA==" }, "@angular/language-service": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.9.tgz", - "integrity": "sha512-F6ReN0cToHIkCjEM2ECkBxCTsvFjVae8FpIr3Fz8IHZHOOYcS5mx/BWdEO7odI5/tQKl+cCWol7NjvJYV0zolg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.0.tgz", + "integrity": "sha512-2f8ECoXrj40oS1rtIfi+F8T4WPzundcZDs8WMFNBuWYbk14v1S9sTgMEmZyePHGkPjt6IfYiLJKJCvVgrt1nxQ==", "dev": true }, "@angular/material": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.2.tgz", - "integrity": "sha512-mR2ppE+Z1S5As2SUFK8wUH76Fj7YgrefhrwVGaeCLcAen//RHPw043+KL2apPAUaltdIFlGFtUuA6yJN6av0nQ==", - "requires": { - "tslib": "^1.7.1" - } + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.0.tgz", + "integrity": "sha512-KKzEIVh6/m56m+Ao8p4PK0SyEr0574l3VP2swj1qPag3u+FYgemmXCGTaChrKdDsez+zeTCPXImBGXzE6NQ80Q==" }, "@angular/material-moment-adapter": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-8.2.2.tgz", - "integrity": "sha512-HZYoVssNh+uon0SszUDtVTWmjah5vtEJOYVYl9BakE6dC+Z4910B+/hVQ1HfOdas5mHpjxVoYpbIoe4QG5sc5A==", - "requires": { - "tslib": "^1.7.1" - } + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-9.2.0.tgz", + "integrity": "sha512-DruanWMcAzOy8mFZ6Xr9sRqJ+KjF0hvFshxqrv0SD/rVpf9oi8ADnuACmHYXN5dYr/YtgmHDywq0Z7USY7SIoA==" }, "@angular/platform-browser": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.9.tgz", - "integrity": "sha512-k3aNZy0OTqGn7HlHHV52QF6ZAP/VlQhWGD2u5e1dWIWMq39kdkdSCNu5tiuAf5hIzMBiSQ0tjnuVWA4MuDBYIQ==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.0.tgz", + "integrity": "sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg==" }, "@angular/platform-browser-dynamic": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.9.tgz", - "integrity": "sha512-GbE4TUy4n/a8yp8fLWwdG/QnjUPZZ8VufItZ7GvOpoyknzegvka111dLctvMoPzSAsrKyShL6cryuyDC5PShUA==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz", + "integrity": "sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ==" }, "@angular/platform-server": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.2.9.tgz", - "integrity": "sha512-rr6h82+DdUGhpsF3WT3eLk5itjZDXe7SiNtRGHkPj+yTyFAxuTKA3cX0N7LWsGGIFax+s1vQhMreV4YcyHKGPQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.1.0.tgz", + "integrity": "sha512-JboTIUBgf9yHRjF93q8NJQoeIp5Zp4kg8Nmw1QLWO6SV+OpiOpKSrlScMVncCh0KiU6SIOmiuHJwBhLm78fi+Q==", "requires": { "domino": "^2.1.2", - "tslib": "^1.9.0", "xhr2": "^0.1.4" } }, "@angular/router": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.9.tgz", - "integrity": "sha512-4P60CWNB/jxGjDBEuYN0Jobt76QlebAQeFBTDswRVwRlq/WJT4QhL3a8AVIRsHn9bQII0LUt/ZQBBPxn7h9lSA==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.0.tgz", + "integrity": "sha512-cExO1nPnoPFiUJWZ28hTHozPLFoCmqr3xqcM57We0hhKE0esdrO+gRWKRH0EJERukLbU8coPKVhA8daGUpASiQ==" }, "@babel/code-frame": { "version": "7.5.5", @@ -667,28 +746,70 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/compat-data": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", + "dev": true, + "requires": { + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, "@babel/core": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", - "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helpers": "^7.5.5", - "@babel/parser": "^7.5.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5", - "convert-source-map": "^1.1.0", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "json5": "^2.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "@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" + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -698,15 +819,6 @@ "ms": "^2.1.1" } }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -716,226 +828,238 @@ } }, "@babel/generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", - "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "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.6.0", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "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==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" } }, - "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "@babel/helper-compilation-targets": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.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==", + "dev": true, + "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.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "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==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "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==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "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==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@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.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.8.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.8.3" } }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "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==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", + "@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/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "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==", "dev": true }, "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "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==", "dev": true, "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "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==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@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.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "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==", "dev": true, "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "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": { - "@babel/types": "^7.4.4" + "@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==", + "dev": true + }, "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "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==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "@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.6.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", - "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { @@ -958,170 +1082,235 @@ } }, "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==", + "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.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@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.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@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==", + "dev": true, + "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==", + "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.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", + "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", - "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "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.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "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.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "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.0.0" + "@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.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "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.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "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.0.0" + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "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==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz", - "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-plugin-utils": "^7.8.3", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", + "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@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" }, "dependencies": { @@ -1134,344 +1323,416 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-destructuring": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", - "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", + "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", - "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "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==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "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==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", - "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", + "@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.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", + "@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.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "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==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", - "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==", + "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": { - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3" } }, "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", + "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "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==", "dev": true, "requires": { - "regenerator-transform": "^0.14.0" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" } }, "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "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==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", - "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "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==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/preset-env": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", - "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@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==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.5.5", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.5.0", "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.5.5", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "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": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" + "@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" + } + } } }, "@babel/traverse": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", - "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "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": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.2", - "@babel/types": "^7.6.0", + "@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", @@ -1496,61 +1757,102 @@ } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", + "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", + "dev": true, + "requires": { + "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": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "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" + } + }, + "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" + } } } }, "@ngrx/effects": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-8.3.0.tgz", - "integrity": "sha512-/DdBqCFpHOJZUAmIpefQ8EVwmJXXkcEdLhsV8aXncCNWkK61sy/MbZZfDAbee6Cd1is33bVXRUKD49Z+Upvw5A==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-9.0.0.tgz", + "integrity": "sha512-6Rq7FsNZK26HqYlpOGCglKLenIkVOOKE0y6D/8KXjEJ1JlZWi00fdI7poclBGjm9pvMBGXfJA8a9MKuxb/t9cA==" }, "@ngrx/router-store": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-8.3.0.tgz", - "integrity": "sha512-wIWGW3ZyT9+lJEBXVsPx1/NLFQ8KoCbhlEmpmQHniXE3iIMnK25Or2JCNXfgrndQA9SSVlKIPP3uaDJMyoBotQ==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-9.0.0.tgz", + "integrity": "sha512-eVgdRwK0twPgTgWnIpc2EBoz6LgWsGdlheDVKZ9MNU8ZkbPV8/ycivW5Oy5cm+ppi1QHHmkpgt+u5c2iGi68cg==" }, "@ngrx/store": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-8.3.0.tgz", - "integrity": "sha512-QtM5T6/wTYqAlqeW60ptqqrsBwYF7jvQHsh0yE3AnwZIQvSbLFM2t5S2kN+753v4rHiXVRrA5pLaLzjGhAKcSg==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-9.0.0.tgz", + "integrity": "sha512-QnmfXJ4G2jp+vFaqT5Qfp6h0J9OHxfDKI2RbnMU93Tq1Xd/WVPzXnOQGjILBjwwWI6RFkSdIpUoQONr7VOW63g==" }, "@ngrx/store-devtools": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-8.3.0.tgz", - "integrity": "sha512-7jsmN8wz6PMKrbqHnUulMvf8OSYUZbXXOwkcXRaGqIjlnEG9RCHQL0cXuF8zB6uX5xencdEXsRVQe3MdZXWQng==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-9.0.0.tgz", + "integrity": "sha512-Vj8sj8GclbSbnYCS8eqZXTOYDdip1nnjKhkYClUg2oFPh67haaCmvh7TXITnX8PpgDtj5akF84Xw9/1HRiG8mg==" }, "@ngtools/webpack": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.7.tgz", - "integrity": "sha512-JPUzw08myovtT/x2dzzWVUNjFq8OHD81bvcBXdqPAQwQvHDSIdo6bKcu2qhakgagtXLJZnglKtefTJFrMG8ciw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.0.tgz", + "integrity": "sha512-kQ+1N/F+5tuUXiiaoqJwhcOIM0I93EEvF3xwpTLRm91wl2i8R1261LvsD/uQPrgLrZNGR6eFhFF1Izn2PnIjQA==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.7", - "enhanced-resolve": "4.1.0", - "rxjs": "6.4.0", - "tree-kill": "1.2.1", + "@angular-devkit/core": "9.1.0", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.4", "webpack-sources": "1.4.3" }, "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" @@ -1559,97 +1861,229 @@ } }, "@nodelib/fs.scandir": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.2.tgz", - "integrity": "sha512-wrIBsjA5pl13f0RN4Zx4FNWmU71lv03meGKnqRUoCyan17s4V3WL92f3w3AIuWbNnpcrQyFBU5qMavJoB8d27w==", + "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": { - "@nodelib/fs.stat": "2.0.2", + "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.2.tgz", - "integrity": "sha512-z8+wGWV2dgUhLqrtRYa03yDx4HWMvXKi1z8g3m2JyxAx8F7xk74asqPk5LAETjqDSGLFML/6CDl0+yFunSYicw==", + "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 }, "@nodelib/fs.walk": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.3.tgz", - "integrity": "sha512-l6t8xEhfK9Sa4YO5mIRdau7XSOADfmh3jCr0evNHdY+HNkW6xuQhgMH7D73VV6WpZOagrW0UludvMTiifiwTfA==", + "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": { - "@nodelib/fs.scandir": "2.1.2", + "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" } }, - "@schematics/angular": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.7.tgz", - "integrity": "sha512-RsUZofittMe+o8AGi2wbrWb10Avurl2VgDqlINF0fAEfdxzmjvNwXkP4IdAo5wsGl2URrxnJWeRP6geBqgueZQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.7", - "@angular-devkit/schematics": "8.3.7" - } + "@npmcli/ci-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", + "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==", + "dev": true }, - "@schematics/update": { - "version": "0.803.7", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.7.tgz", - "integrity": "sha512-T8HM88+oY7bMBq0w1SoSNTpPJplwGcU3tMbX9p18h7rdsmH3j68+al84A8S3/x+mUiLmumTUXAUmxd1gtoTiKA==", + "@npmcli/git": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.1.tgz", + "integrity": "sha512-hVatexiBtx71F01Ars38Hr5AFUGmJgHAfQtRlO5fJlnAawRGSXwEFgjB5i3XdUUmElZU/RXy7fefN02dZKxgPw==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.7", - "@angular-devkit/schematics": "8.3.7", - "@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" + "@npmcli/promise-spawn": "^1.1.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "unique-filename": "^1.1.1", + "which": "^2.0.2" }, "dependencies": { - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "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": { - "tslib": "^1.9.0" + "isexe": "^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 } } }, - "@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.0.1", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-12.0.1.tgz", - "integrity": "sha512-Dmm46eTtyKtTkku1ZIB39q/AHvUGdGIRJc7jPUucJLoSPWeD7AjvE6OFiIZYP48IkPwV0R3OI/ZmKyNA3DPkRQ==", - "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" + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@npmcli/promise-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.1.0.tgz", + "integrity": "sha512-FwbuYN9KXBkloLeIR3xRgI8dyOdfK/KzaJlChszNuwmUXD1lHXfLlSeo4n4KrKt2udIK9K9/TzlnyCA3ubM2fA==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@nwmac/ajsf-core": { + "version": "0.1.4", + "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-core/0.1.4/69a42e983ece036d34fffc0d2e9e30568322dac1ad1e40aecc143ef6e50bc093", + "integrity": "sha512-9emicHjVD13Y3+7pix9EVJpiksjrAtTEC6j+IHCrNncZSGH+bLlvBHzbFQas+m9eIyCIgpcxkbxQZZQLtClSVA==", + "requires": { + "ajv": "^6.10.0", + "lodash-es": "^4.17.15" + } + }, + "@nwmac/ajsf-material": { + "version": "0.1.4", + "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-material/0.1.4/2e339b3ba5be265afcce56bf2eaf266a4be454b2ac61b776ccbd664a7e21294d", + "integrity": "sha512-bpCwmN+C1Pd5pPieUVSTwrxBg4GNribmQFTMcDyloAvHGOzsS7aLcO9Q17uEajczspEoNqqoP1NY1BcJgP/UVg==", + "requires": { + "@nwmac/ajsf-core": "~0.1.4", + "lodash-es": "^4.17.15" + } + }, + "@rollup/plugin-commonjs": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", + "integrity": "sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.0", + "estree-walker": "^1.0.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0" + } + }, + "@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": { + "@rollup/pluginutils": "^3.0.4" + } + }, + "@rollup/plugin-node-resolve": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.1.tgz", + "integrity": "sha512-14ddhD7TnemeHE97a4rLOhobfYvUVcaYuqTnL8Ti7Jxi9V9Jr5LY7Gko4HZ5k4h4vqQM0gBQt6tsp9xXW94WPA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.6", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "dependencies": { + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "@rollup/pluginutils": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.8.tgz", + "integrity": "sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw==", + "dev": true, + "requires": { + "estree-walker": "^1.0.1" + } + }, + "@schematics/angular": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.0.tgz", + "integrity": "sha512-qkehaITQ1S1udfnnBY5CXGWnk1iVFI8cZayjLUlRfD5w+6v9if3VIuqPssX96MqvkbjyRu1N214+ieaawzLmuA==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0", + "@angular-devkit/schematics": "9.1.0" + } + }, + "@schematics/update": { + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.0.tgz", + "integrity": "sha512-u2VESL1dgOSGZK/wcWEz0WcCU/yv764zhzCQerCwUtbV1CISSSDZ6x+prVYDXOdxWBGtDos2MbCF3GEJJI1T+w==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0", + "@angular-devkit/schematics": "9.1.0", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^8.0.0", + "pacote": "11.1.4", + "rxjs": "6.5.4", + "semver": "7.1.3", + "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 + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@swimlane/ngx-charts": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-13.0.2.tgz", + "integrity": "sha512-pKHw3DLsO2eso3SqMlHt9vumaU8gaDYZbrC8PNWteU49AFkX8kLVJIvsgjMSKwW/n3VpgHBpTMGnLkSlzHJORg==", + "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" } }, "@szmarczak/http-timer": { @@ -1673,9 +2107,9 @@ "integrity": "sha512-J3fzl1F6wvh8KXVVcIuHN12xi1ZDcPA/0Vix+ZcJYwZWVHUwfIqfvzYXXEw7ybeev6477KCTt9fKydU+ajUqcg==" }, "@types/bluebird": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.27.tgz", - "integrity": "sha512-6BmYWSBea18+tSjjSC3QIyV93ZKAeNWGM7R6aYt1ryTZXrlHF+QLV0G2yV0viEGVyRkyQsWfMoJ0k/YghBX5sQ==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.30.tgz", + "integrity": "sha512-8LhzvcjIoqoi1TghEkRMkbbmM+jhHnBokPGkJWjclMK+Ks0MxEBow3/p2/iFTZ+OIbJHQDSfpgdZEb+af3gfVw==", "dev": true }, "@types/caseless": { @@ -1689,6 +2123,12 @@ "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.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -1713,9 +2153,9 @@ } }, "@types/jasmine": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.4.2.tgz", - "integrity": "sha512-SaSSGOzwUnBEn64c+HTyVTJhRf8F1CXZLnxYx2ww3UrgGBmEEw38RSux2l3fYiT9brVLP67DU5omWA6V9OHI5Q==", + "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": { @@ -1728,20 +2168,20 @@ } }, "@types/karma": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/karma/-/karma-3.0.3.tgz", - "integrity": "sha512-mkJejrAacgignkBce2+qD9S4VncjEfAT0Dion0fRcqpav3Sd2KiLTHODZOXRP3S8b0ZY5sXr9meDB3P8MSH8Cg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@types/karma/-/karma-4.4.1.tgz", + "integrity": "sha512-Y2jH6yMPqVMCeewC6gn5Q3hljcbtffyjnhQC8rhp9zdek2zUXh6e6+TDLNlO2lCiNmjzxANiRxQR0cRxkkIYmQ==", "dev": true, "requires": { "@types/bluebird": "*", "@types/node": "*", - "log4js": "^3.0.0" + "log4js": "^4.0.0" } }, "@types/marked": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.6.5.tgz", - "integrity": "sha512-6kBKf64aVfx93UJrcyEZ+OBM5nGv4RLsI6sR1Ar34bpgvGVRoyTgpxn4ZmtxOM5aDTAaaznYuYUH8bUX3Nk3YA==" + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.7.3.tgz", + "integrity": "sha512-WXdEKuT3azHxLTThd5dwnpLt2Q9QiC8iKj09KZRtVqro3pX8hhY+GbD8FZOae6SBBEJ22yKJn3c7ejL0aucAcA==" }, "@types/minimatch": { "version": "3.0.3", @@ -1750,17 +2190,17 @@ "dev": true }, "@types/moment-timezone": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.12.tgz", - "integrity": "sha512-hnHH2+Efg2vExr/dSz+IX860nSiyk9Sk4pJF2EmS11lRpMcNXeB4KBW5xcgw2QPsb9amTXdsVNEe5IoJXiT0uw==", + "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" } }, "@types/node": { - "version": "12.7.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.9.tgz", - "integrity": "sha512-P57oKTJ/vYivL2BCfxCC5tQjlS8qW31pbOL6qt99Yrjm95YdHgNZwjrTTjMBh+C2/y6PXIX4oz253+jUzxKKfQ==", + "version": "12.12.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz", + "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==", "dev": true }, "@types/normalize-package-data": { @@ -1770,15 +2210,15 @@ "dev": true }, "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, "@types/request": { - "version": "2.48.3", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.3.tgz", - "integrity": "sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w==", + "version": "2.48.4", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.4.tgz", + "integrity": "sha512-W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw==", "dev": true, "requires": { "@types/caseless": "*", @@ -1810,9 +2250,9 @@ } }, "@types/selenium-webdriver": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", - "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "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": { @@ -1827,15 +2267,15 @@ "integrity": "sha512-SdxmlrHfO0BxgbBP9HZWMUo2rima8lwMjPiWm6S0dyKkDa5CseamktFhXg8umu3TPVBkSlX6ZoB5uUDJK89yvg==" }, "@types/tough-cookie": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", - "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==", + "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.5", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", - "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.7.tgz", + "integrity": "sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==", "dev": true, "requires": { "@types/node": "*", @@ -2045,16 +2485,6 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2095,9 +2525,9 @@ } }, "adm-zip": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", - "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "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": { @@ -2107,30 +2537,75 @@ "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" + }, + "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 + } } }, "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz", + "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==", "dev": true, "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", "humanize-ms": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "ajv": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", - "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "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": { - "fast-deep-equal": "^2.0.1", + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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" @@ -2148,11 +2623,18 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true + "dev": true, + "optional": true }, "angular2-virtual-scroll": { "version": "0.4.16", @@ -2218,12 +2700,12 @@ "dev": true }, "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "type-fest": "^0.5.2" + "type-fest": "^0.11.0" } }, "ansi-gray": { @@ -2288,12 +2770,12 @@ } }, "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "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": "^1.0.0" + "default-require-extensions": "^2.0.0" } }, "aproba": { @@ -2309,9 +2791,9 @@ "dev": true }, "arg": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", - "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { @@ -2605,6 +3087,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -2612,18 +3100,18 @@ "dev": true }, "autoprefixer": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", - "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", "dev": true, "requires": { - "browserslist": "^4.6.3", - "caniuse-lite": "^1.0.30000980", + "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.17", - "postcss-value-parser": "^4.0.0" + "postcss": "^7.0.26", + "postcss-value-parser": "^4.0.2" } }, "aws-sign2": { @@ -2633,9 +3121,9 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, "axobject-query": { @@ -2647,89 +3135,57 @@ "ast-types-flow": "0.0.7" } }, - "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=", + "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": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" }, "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=", + "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": { - "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" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.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=", - "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" + } }, - "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 - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "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 + "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": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true } } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, "babel-plugin-dynamic-import-node": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", @@ -2739,78 +3195,6 @@ "object.assign": "^4.1.0" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "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 - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "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" - } - }, - "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" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, "bach": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", @@ -2965,9 +3349,9 @@ } }, "bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", + "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": { @@ -3022,73 +3406,118 @@ "multicast-dns-service-types": "^1.1.0" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", "camelcase": "^5.3.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "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": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "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==", + "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": "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": "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" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.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==", + "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": "^4.1.0" + "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.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, - "brace": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", - "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg=" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3206,14 +3635,15 @@ } }, "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, "browserstack": { @@ -3223,24 +3653,93 @@ "dev": true, "requires": { "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 + } } }, "browserstack-local": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.2.tgz", - "integrity": "sha512-fRaynjF0MvtyyfPRy2NFnVwxLyNtD28K/v9xRsIjUVf7xLc80NIm7Nfr3KXlFmWizhG91PL/UAOXlHkoxQjaNw==", + "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": "^2.2.1", - "is-running": "^2.0.0", - "ps-tree": "=1.1.1", + "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 + } } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "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": { "base64-js": "^1.0.2", @@ -3325,32 +3824,34 @@ "dev": true }, "cacache": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", - "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", + "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", + "chownr": "^1.1.2", + "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", + "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.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.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "rimraf": "^2.7.1", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "unique-filename": "^1.1.1" }, "dependencies": { "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -3360,6 +3861,12 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true } } }, @@ -3404,12 +3911,6 @@ "pump": "^3.0.0" } }, - "http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", - "dev": true - }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -3470,10 +3971,22 @@ "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": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, "caniuse-lite": { - "version": "1.0.30000989", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "version": "1.0.30001039", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", + "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==", "dev": true }, "canonical-path": { @@ -3538,9 +4051,9 @@ } }, "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "chrome-trace-event": { @@ -3603,9 +4116,9 @@ } }, "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -3619,6 +4132,12 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-boxes": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", @@ -3634,6 +4153,12 @@ "restore-cursor": "^3.1.0" } }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "dev": true + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -3706,6 +4231,17 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -3737,14 +4273,14 @@ } }, "codelyzer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.0.tgz", - "integrity": "sha512-izfUfhEOOgAizszPlEDxo71DK/C4wprZw0vkY6UWcOSTQvN1JyfXf9DXwaV7WX+/JC+hH0ShXfdtGLA9Rca7LA==", + "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", + "axobject-query": "2.0.2", "css-selector-tokenizer": "^0.7.1", "cssauron": "^1.4.0", "damerau-levenshtein": "^1.0.4", @@ -3788,6 +4324,16 @@ "object-visit": "^1.0.0" } }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3803,6 +4349,16 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "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": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -3827,7 +4383,8 @@ "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true }, "commondir": { "version": "1.0.1", @@ -3836,9 +4393,9 @@ "dev": true }, "compare-versions": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", - "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, "component-bind": { @@ -3860,12 +4417,12 @@ "dev": true }, "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { - "mime-db": ">= 1.40.0 < 2" + "mime-db": ">= 1.43.0 < 2" } }, "compression": { @@ -3902,27 +4459,33 @@ } }, "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, "requires": { - "dot-prop": "^4.1.0", + "dot-prop": "^5.2.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" + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" }, "dependencies": { "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "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": { - "pify": "^3.0.0" + "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 } } }, @@ -3951,13 +4514,10 @@ "dev": true }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "constants-browserify": { "version": "1.0.0", @@ -4032,12 +4592,12 @@ } }, "copy-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==", + "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": { - "cacache": "^11.3.3", + "cacache": "^12.0.3", "find-cache-dir": "^2.1.0", "glob-parent": "^3.1.0", "globby": "^7.1.1", @@ -4045,16 +4605,16 @@ "loader-utils": "^1.2.3", "minimatch": "^3.0.4", "normalize-path": "^3.0.0", - "p-limit": "^2.2.0", + "p-limit": "^2.2.1", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", + "serialize-javascript": "^2.1.2", "webpack-log": "^2.0.0" }, "dependencies": { "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "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", @@ -4062,6 +4622,7 @@ "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", @@ -4085,9 +4646,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -4112,33 +4673,88 @@ "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" + } + }, "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.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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" + } } } }, "core-js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", - "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==" + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" }, "core-js-compat": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", - "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", "dev": true, "requires": { - "browserslist": "^4.6.6", - "semver": "^6.3.0" + "browserslist": "^4.8.3", + "semver": "7.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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "dev": true } } @@ -4243,71 +4859,234 @@ } }, "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "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": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" }, "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "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 - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } } } }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "through": "X.X.X" + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "3.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 + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" } }, "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "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": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "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": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "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 + } + } + }, "cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", @@ -4336,131 +5115,15 @@ "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==", - "requires": { - "d3-time": "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=" + "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.3", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.3.tgz", - "integrity": "sha512-v8bbYyCFKjyCzFk/tdWqXwDykY8YWqhXYjcYxfILIit085VZOpj4XJKOMccTsvWxgzSLMJQg5SiqHjslsipEDg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", "requires": { "d3-dispatch": "1", "d3-drag": "1", @@ -4469,176 +5132,100 @@ "d3-transition": "1" } }, - "d3-chord": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", - "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", - "requires": { - "d3-array": "1", - "d3-path": "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.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" }, "d3-dispatch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", - "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=" + "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.1", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", - "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", + "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-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==", - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, "d3-ease": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", - "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=" - }, - "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" - } + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" }, "d3-format": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.1.tgz", - "integrity": "sha512-TUswGe6hfguUX1CtKxyG2nymO+1lyThbkS1ifLX0Sr+dOQtAD5gkrffpHnx+yHNKUZ0Bmg5T4AjUQwugPDrm0g==" - }, - "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==", - "requires": { - "d3-array": "1" - } + "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.8", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + "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.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "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=" - }, - "d3-random": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", - "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=" - }, - "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==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-dsv": "1", - "xmlhttprequest": "1" - } + "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-scale": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "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", - "d3-collection": "1", - "d3-color": "1", + "d3-array": "1.2.0 - 2", "d3-format": "1", - "d3-interpolate": "1", + "d3-interpolate": "^1.2.0", "d3-time": "1", "d3-time-format": "2" } }, "d3-selection": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", - "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==" + "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.5", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", - "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", + "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.0.8", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", - "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + "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.1.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", - "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "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.7", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", - "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + "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.1.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", - "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", + "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", @@ -4648,27 +5235,10 @@ "d3-timer": "1" } }, - "d3-voronoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" - }, - "d3-zoom": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", - "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, "damerau-levenshtein": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", - "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", "dev": true }, "dashdash": { @@ -4681,15 +5251,9 @@ } }, "date-format": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", - "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", "dev": true }, "debug": { @@ -4729,9 +5293,9 @@ } }, "deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", - "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "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", @@ -4787,12 +5351,20 @@ } }, "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=", + "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": "^2.0.0" + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "default-resolution": { @@ -4801,10 +5373,27 @@ "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 + } + } + }, "defer-to-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", - "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", + "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": { @@ -4893,29 +5482,11 @@ } } }, - "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": { + "p-map": { "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" - } + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true }, "pify": { "version": "4.0.1", @@ -4967,9 +5538,9 @@ "dev": true }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "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", @@ -4988,15 +5559,6 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "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" - } - }, "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", @@ -5092,24 +5654,58 @@ "void-elements": "^2.0.0" } }, - "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==", + "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 + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domino": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.3.tgz", - "integrity": "sha512-EwjTbUv1Q/RLQOdn9k7ClHutrQcWGsfXaRQNOnM/KgK4xDBoLFEcIRFuBSxAx13Vfa63X029gXYrNFrSy+DOSg==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.4.tgz", + "integrity": "sha512-l70mlQ7IjPKC8kT7GljQXJZmt5OqFL+RE91ik5y5WWQtsd9wP8R7gpFnNu96fK5MqAAZRXfLLsnzKtkty5fWGQ==" + }, + "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": { + "dom-serializer": "0", + "domelementtype": "1" + } }, "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==", + "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": "^1.0.0" + "is-obj": "^2.0.0" } }, "duplexer": { @@ -5163,15 +5759,15 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.273", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.273.tgz", - "integrity": "sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw==", + "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==", "dev": true }, "elliptic": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "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": { "bn.js": "^4.4.0", @@ -5190,9 +5786,9 @@ "dev": true }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, "encodeurl": { @@ -5206,6 +5802,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, + "optional": true, "requires": { "iconv-lite": "~0.4.13" } @@ -5322,13 +5919,13 @@ } }, "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==", + "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": { "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", + "memory-fs": "^0.5.0", "tapable": "^1.0.0" } }, @@ -5338,6 +5935,12 @@ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, "err-code": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", @@ -5497,6 +6100,12 @@ "es6-symbol": "^3.1.1" } }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -5759,9 +6368,9 @@ "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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, "esutils": { @@ -5808,9 +6417,9 @@ "dev": true }, "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", "dev": true }, "eventsource": { @@ -6077,23 +6686,22 @@ } }, "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 + "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.0.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", - "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", + "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": { - "@nodelib/fs.stat": "^2.0.1", - "@nodelib/fs.walk": "^1.2.1", - "glob-parent": "^5.0.0", - "is-glob": "^4.0.1", - "merge2": "^1.2.3", - "micromatch": "^4.0.2" + "@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": { @@ -6115,9 +6723,9 @@ } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -6151,10 +6759,9 @@ } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -6169,12 +6776,12 @@ "dev": true }, "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", + "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", "dev": true, "requires": { - "reusify": "^1.0.0" + "reusify": "^1.0.4" } }, "faye-websocket": { @@ -6187,15 +6794,15 @@ } }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -6212,37 +6819,13 @@ } }, "file-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", - "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "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": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.0.0" - }, - "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" - } - }, - "schema-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", - "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" } }, "fileset": { @@ -6294,13 +6877,13 @@ } }, "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==", + "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": { "commondir": "^1.0.1", - "make-dir": "^3.0.0", + "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" }, "dependencies": { @@ -6324,14 +6907,23 @@ } }, "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "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" } }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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", @@ -6341,6 +6933,12 @@ "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", @@ -6371,12 +6969,12 @@ "dev": true }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" } }, "findup-sync": { @@ -6496,9 +7094,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flush-write-stream": { @@ -6512,9 +7110,9 @@ } }, "follow-redirects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", - "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "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": { "debug": "^3.0.0" @@ -6616,23 +7214,42 @@ } }, "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==", + "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": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" } }, "fs-mkdirp-stream": { @@ -7296,10 +7913,10 @@ "is-property": "^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==", + "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 }, "get-caller-file": { @@ -7412,12 +8029,12 @@ } }, "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "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": { - "ini": "^1.3.4" + "ini": "^1.3.5" } }, "global-modules": { @@ -7451,18 +8068,16 @@ "dev": true }, "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", "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", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", "slash": "^3.0.0" }, "dependencies": { @@ -7613,9 +8228,9 @@ } }, "gulp-zip": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.0.tgz", - "integrity": "sha512-oR3t8kn+ccHkSyRcBV5kBLPXrhqTh5d6wBAR7r7wqjNQNBhYvOwPedCwlAaGcNl1qSeXNDn6qOk1Qyxvx9Wrow==", + "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", @@ -7664,15 +8279,10 @@ "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.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "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": { @@ -7842,6 +8452,12 @@ "minimalistic-assert": "^1.0.1" } }, + "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", @@ -7880,16 +8496,40 @@ "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.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, "http-deceiver": { @@ -7937,23 +8577,30 @@ } }, "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==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -7987,19 +8634,19 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "agent-base": "6", + "debug": "4" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "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" @@ -8026,6 +8673,7 @@ "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" } @@ -8049,9 +8697,9 @@ "dev": true }, "ignore-walk": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.2.tgz", - "integrity": "sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==", + "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" @@ -8071,9 +8719,9 @@ "dev": true }, "immer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-4.0.0.tgz", - "integrity": "sha512-374/m+biF/6Z24jiqR/u49SH095oIgYr/qLiQnR88svojs5RNJh/h9i0Qq0pqhgUon3Txx8PgUWH+obRy6jbKw==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-6.0.3.tgz", + "integrity": "sha512-12VvNrfSrXZdm/BJgi/KDW2soq5freVSf3I1+4CLunUM8mAGx2/0Njy0xBVzi5zewQZiwM7z1/1T+8VaI7NkmQ==" }, "import-cwd": { "version": "2.1.0", @@ -8125,6 +8773,18 @@ "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", @@ -8160,36 +8820,77 @@ "dev": true }, "injection-js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.2.tgz", - "integrity": "sha512-9K4fW2NNPG3JCvORx5G/T6q/PZYIr43RFgxBvtk3OV4omh5iqvpK4cChuBfhgPnRbXSgZRfuROh0XG5KNA8Xlg==", + "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==", + "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": "^2.4.2", + "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.2.0", - "rxjs": "^6.4.0", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "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==", + "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": { @@ -8199,23 +8900,32 @@ "dev": true }, "string-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", - "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "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": "^5.2.0" + "strip-ansi": "^6.0.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==", + "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": "^4.1.0" + "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" } } } @@ -8269,9 +8979,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "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": { @@ -8285,9 +8995,9 @@ } }, "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==", + "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": { @@ -8352,6 +9062,20 @@ "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", @@ -8403,6 +9127,12 @@ "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", @@ -8415,15 +9145,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "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", @@ -8443,15 +9164,35 @@ } }, "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=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.1.tgz", + "integrity": "sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg==", "dev": true, "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "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-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -8484,9 +9225,9 @@ "dev": true }, "is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", + "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": { @@ -8510,33 +9251,33 @@ } }, "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "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": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "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": "^1.0.0" + "is-path-inside": "^2.1.0" } }, "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=", + "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.1" + "path-is-inside": "^1.0.2" } }, "is-plain-obj": { @@ -8611,6 +9352,15 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "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", @@ -8654,9 +9404,9 @@ "dev": true }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", "dev": true }, "is-yarn-global": { @@ -8775,167 +9525,214 @@ } }, "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" - } - }, - "istanbul-instrumenter-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", - "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", - "dev": true, - "requires": { - "convert-source-map": "^1.5.0", - "istanbul-lib-instrument": "^1.7.3", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0" + "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": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "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": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "@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" } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "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": { - "ajv": "^5.0.0" + "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": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "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==", + "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": "^0.4.0" + "append-transform": "^1.0.0" } }, "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==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "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" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "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-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==", + "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": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "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 - }, - "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-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==", + "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": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "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": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "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": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.4.tgz", - "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", + "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": { - "handlebars": "^4.0.3" + "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": { @@ -8964,12 +9761,20 @@ "dev": true }, "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "version": "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.1.2" + "colors": "1.4.0" + }, + "dependencies": { + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + } } }, "jasminewd2": { @@ -8979,21 +9784,32 @@ "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==", + "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": "^6.1.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-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9017,9 +9833,9 @@ "dev": true }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-buffer": { @@ -9034,6 +9850,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", + "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -9043,8 +9865,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { "version": "1.0.1", @@ -9074,12 +9895,12 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "jsonfile": { @@ -9122,9 +9943,9 @@ } }, "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "version": "3.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", @@ -9140,9 +9961,9 @@ "dev": true }, "karma": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.3.0.tgz", - "integrity": "sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", + "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", "dev": true, "requires": { "bluebird": "^3.3.0", @@ -9151,7 +9972,6 @@ "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", @@ -9200,34 +10020,19 @@ } }, "chokidar": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.1.tgz", - "integrity": "sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==", + "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.0", + "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.1.3" - } - }, - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "debug": { - "version": "4.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" + "readdirp": "~3.3.0" } }, "fill-range": { @@ -9239,28 +10044,17 @@ "to-regex-range": "^5.0.1" } }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fsevents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.0.tgz", - "integrity": "sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "dev": true, "optional": true }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -9281,31 +10075,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "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" - } - }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "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 - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9313,12 +10088,12 @@ "dev": true }, "readdirp": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.3.tgz", - "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", + "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.4" + "picomatch": "^2.0.7" } }, "source-map": { @@ -9327,30 +10102,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "streamroller": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", - "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.14" - }, - "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" - } - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9381,165 +10132,28 @@ } }, "karma-coverage-istanbul-reporter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.0.tgz", - "integrity": "sha512-UH0mXPJFJyK5uiK7EkwGtQ8f30lCBAfqRResnZ4pzLJ04SOp4SPlYkmwbbZ6iVJ6sQFVzlDUXlntBEsLRdgZpg==", + "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": { "istanbul-api": "^2.1.6", "minimatch": "^3.0.4" - }, - "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.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" - } - }, - "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-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" - } - }, - "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" - } - }, - "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", - "dev": true, - "requires": { - "handlebars": "^4.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "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==", + "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": { - "jasmine-core": "^3.3" + "jasmine-core": "^3.5.0" } }, "karma-jasmine-html-reporter": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", - "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "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 }, "karma-source-map-support": { @@ -9643,9 +10257,9 @@ } }, "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", + "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", "dev": true, "requires": { "clone": "^2.1.2", @@ -9656,7 +10270,8 @@ "mkdirp": "^0.5.0", "promise": "^7.1.1", "request": "^2.83.0", - "source-map": "~0.6.0" + "source-map": "~0.6.0", + "tslib": "^1.10.0" }, "dependencies": { "source-map": { @@ -9679,6 +10294,26 @@ "pify": "^4.0.1" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -9687,31 +10322,19 @@ } } }, - "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=", + "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": { - "promise": "~7.0.1", - "resolve": "~1.1.6" - }, - "dependencies": { - "promise": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", - "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "leven": "^3.1.0" } }, "levn": { @@ -9725,9 +10348,9 @@ } }, "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==", + "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", @@ -9793,23 +10416,23 @@ "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, @@ -9848,23 +10471,44 @@ "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 + }, + "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": "3.0.6", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", - "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", "dev": true, "requires": { - "circular-json": "^0.5.5", - "date-format": "^1.2.0", - "debug": "^3.1.0", - "rfdc": "^1.1.2", - "streamroller": "0.7.0" + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "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" @@ -9879,9 +10523,9 @@ } }, "loglevel": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", - "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", "dev": true }, "loose-envify": { @@ -9906,12 +10550,20 @@ "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 + } } }, "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==", + "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" @@ -9936,28 +10588,32 @@ } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "make-fetch-happen": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz", - "integrity": "sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.4.tgz", + "integrity": "sha512-hIFoqGq1db0QMiy/Atr/pI1Rs4rDV+ZdGSey2SQyF3KK3u1z4aj9mS5UdNnZkdQpA+H3pGn0J3KlEwsi2x4EqA==", "dev": true, "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.1", + "agentkeepalive": "^4.1.0", + "cacache": "^15.0.0", + "http-cache-semantics": "^4.0.4", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.1.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" } }, "make-iterator": { @@ -10011,9 +10667,9 @@ "integrity": "sha1-55ZqFe6louprSJXSW364It199Fs=" }, "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==" + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==" }, "matchdep": { "version": "2.0.0", @@ -10118,6 +10774,12 @@ "safe-buffer": "^5.1.2" } }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -10125,20 +10787,27 @@ "dev": true }, "mem": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", - "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-6.0.1.tgz", + "integrity": "sha512-uIRYASflIsXqvKe+7aXbLrydaRzz4qiK6amqZDQI++eRtW3UoKtnDcGeCAOREgll7YMxO5E4VB9+3B0LFmy96g==", "dev": true, "requires": { "map-age-cleaner": "^0.1.3", - "mimic-fn": "^2.1.0", - "p-is-promise": "^2.1.0" + "mimic-fn": "^3.0.0" + }, + "dependencies": { + "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 + } } }, "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=", + "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", @@ -10163,6 +10832,23 @@ "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", @@ -10219,18 +10905,18 @@ "dev": true }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "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": { - "mime-db": "1.40.0" + "mime-db": "1.43.0" } }, "mimic-fn": { @@ -10246,15 +10932,60 @@ "dev": true }, "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==", + "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": { "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" + } + } } }, "minimalistic-assert": { @@ -10279,28 +11010,87 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" + } + }, + "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": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", + "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-pipeline": "^1.2.2", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", "dev": true, "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, "mississippi": { @@ -10383,9 +11173,9 @@ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", - "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz", + "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==", "requires": { "moment": ">= 2.9.0" } @@ -10483,50 +11273,47 @@ "dev": true }, "ng-packagr": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.5.1.tgz", - "integrity": "sha512-GT6QK5WAirQwALdeJPiXdgRd5PzRqcknb/C/G+cCDEbUFri4oGVmns2Nl4I0FGg/cRn6nXTxRiUunOSqZ3Lehw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-9.1.0.tgz", + "integrity": "sha512-783WCTa+qQl8QQefQ3n8cDzYF3PpsQUnY87SwuXIxaJ1p8NjBq/3vCZmTiI3AXzDZFhRacbCqghtaJGU1qcFrQ==", "dev": true, "requires": { + "@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.6.0", - "browserslist": "^4.0.0", - "chalk": "^2.3.1", - "chokidar": "^3.0.0", + "autoprefixer": "^9.6.5", + "browserslist": "^4.7.0", + "chalk": "^3.0.0", + "chokidar": "^3.2.1", "clean-css": "^4.1.11", - "commander": "^3.0.0", - "fs-extra": "^8.0.0", + "commander": "^4.0.0", + "fs-extra": "^9.0.0", "glob": "^7.1.2", "injection-js": "^2.2.1", - "less": "^3.8.0", - "less-plugin-npm-import": "^2.1.0", + "less": "^3.10.3", "node-sass-tilde-importer": "^1.0.0", - "postcss": "^7.0.0", + "postcss": "^7.0.18", "postcss-url": "^8.0.0", "read-pkg-up": "^5.0.0", "rimraf": "^3.0.0", - "rollup": "^1.12.1", - "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" + "rollup": "2.2.0", + "rollup-plugin-sourcemaps": "^0.5.0", + "rxjs": "^6.5.0", + "sass": "^1.23.0", + "stylus": "^0.54.7", + "terser": "^4.3.8", + "update-notifier": "^4.0.0" }, "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "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": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "anymatch": { @@ -10554,26 +11341,51 @@ "fill-range": "^7.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" + } + }, "chokidar": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.1.tgz", - "integrity": "sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==", + "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.0", + "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.1.3" + "readdirp": "~3.3.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": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, "fill-range": { @@ -10585,22 +11397,37 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "fsevents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.0.tgz", - "integrity": "sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "dev": true, "optional": true }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "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-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -10616,12 +11443,46 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "normalize-path": { + "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" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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", @@ -10657,23 +11518,41 @@ } }, "readdirp": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.3.tgz", - "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", + "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.4" + "picomatch": "^2.0.7" } }, "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" } }, + "rollup": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.2.0.tgz", + "integrity": "sha512-iAu/j9/WJ0i+zT0sAMuQnsEbmOKzdQ4Yxu5rbPs9aUCyqveI1Kw3H4Fi9NWfCOpb8luEySD2lDyFWL9CrLE8iw==", + "dev": true, + "requires": { + "fsevents": "~2.1.2" + } + }, + "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" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10692,17 +11571,17 @@ } }, "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==", + "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": { "deepmerge": "^3.2.0" } }, "ngx-moment": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ngx-moment/-/ngx-moment-3.4.0.tgz", - "integrity": "sha512-GEqzSsu12VsXXP35aerlQpuZ1ienEYQZxHmp+RH7EuJD7hWamKgLOpmbiDI9Ij3KLW/UApvonYzZvyRSv3ea/w==", + "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" } @@ -10719,17 +11598,6 @@ "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, - "node-fetch-npm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", @@ -10776,13 +11644,10 @@ } }, "node-releases": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.33.tgz", - "integrity": "sha512-I0V30bWQEoHb+10W8oedVoUrdjW5wIkYm0w7vvcrPO95pZY738m1k77GF5sO0vKg5eXYg9oGtrMAETbgZGm11A==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true }, "node-sass-tilde-importer": { "version": "1.0.2", @@ -10830,21 +11695,15 @@ "dev": true }, "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" - } + "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 }, "normalizr": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.4.1.tgz", - "integrity": "sha512-gei+tJucERU8vYN6TFQL2k5YMLX2Yh7nlylKMJC65+Uu/LS3xQCDJc8cies72aHouycKYyVgcnyLRbaJsigXKw==" + "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", @@ -10856,65 +11715,126 @@ } }, "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-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": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } + } + }, + "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": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", - "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "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": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", + "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } } }, "npm-packlist": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", - "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.1.tgz", + "integrity": "sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "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" + } + } } }, "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==", + "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": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } } }, "npm-registry-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.1.tgz", - "integrity": "sha512-1ZQ+yjnxc698R5h9Yje9CASapzAZr7aYDkJDdERg9xg2hOEY0vRJwskOaJAXq8N/eLavzvW4g564YAfq6zMn/A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.0.0.tgz", + "integrity": "sha512-975WwLvZjX97y9UWWQ8nAyr7bw02s9xKPHqvEm5T900LQsB1HXb8Gb9ebYtCBLSX+K8gSOrO5KS/9yV/naLZmQ==", "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", + "@npmcli/ci-detect": "^1.0.0", "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } + "make-fetch-happen": "^8.0.2", + "minipass": "^3.0.0", + "minipass-fetch": "^1.1.2", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" } }, "npm-run-all": { @@ -10997,6 +11917,15 @@ "path-key": "^2.0.0" } }, + "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": { + "boolbase": "~1.0.0" + } + }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -11065,9 +11994,9 @@ "dev": true }, "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", "dev": true }, "object-keys": { @@ -11110,13 +12039,94 @@ } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.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.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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" + } + } } }, "object.map": { @@ -11148,6 +12158,99 @@ "make-iterator": "^1.0.0" } }, + "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": { + "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.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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" + } + } + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -11188,12 +12291,13 @@ } }, "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" } }, "opn": { @@ -11203,6 +12307,14 @@ "dev": true, "requires": { "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 + } } }, "optimist": { @@ -11243,6 +12355,89 @@ "wordwrap": "~1.0.0" } }, + "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": { + "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 + }, + "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" + } + } + } + }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -11288,16 +12483,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -11323,28 +12508,31 @@ "dev": true }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "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 + "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", @@ -11356,9 +12544,9 @@ } }, "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "package-json": { @@ -11382,58 +12570,63 @@ } }, "pacote": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", - "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.4.tgz", + "integrity": "sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw==", "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", + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.1.0", + "cacache": "^15.0.0", + "chownr": "^1.1.4", + "fs-minipass": "^2.1.0", "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", + "minipass": "^3.0.1", + "minipass-fetch": "^1.2.1", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^8.0.0", "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" + "read-package-json-fast": "^1.1.3", + "rimraf": "^2.7.1", + "semver": "^7.1.3", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "which": "^2.0.2" }, "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==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "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": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "isexe": "^2.0.0" } } } }, "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "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": { @@ -11630,9 +12823,9 @@ "dev": true }, "picomatch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pidtree": { @@ -11669,6 +12862,60 @@ "dev": true, "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" } }, "plugin-error": { @@ -11701,20 +12948,29 @@ "dev": true }, "portfinder": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz", - "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", "dev": true, "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "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 } } @@ -11726,9 +12982,9 @@ "dev": true }, "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11744,6 +13000,92 @@ } } }, + "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": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "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": { + "browserslist": "^4.0.0", + "color": "^3.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 + } + } + }, + "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": { + "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 + } + } + }, + "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": { + "postcss": "^7.0.0" + } + }, + "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": { + "postcss": "^7.0.0" + } + }, + "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": { + "postcss": "^7.0.0" + } + }, + "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": { + "postcss": "^7.0.0" + } + }, "postcss-import": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", @@ -11782,8 +13124,429 @@ "requires": { "loader-utils": "^1.1.0", "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.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==", + "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" + } + } + } + }, + "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": { + "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": { + "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" + } + } + } + }, + "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": { + "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 + } + } + }, + "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": { + "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 + } + } + }, + "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": { + "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 + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-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" + } + } + } + }, + "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": { + "postcss": "^7.0.0" + } + }, + "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": { + "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 + } + } + }, + "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 + } + } + }, + "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 + } + } + }, + "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": { + "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 + } + } + }, + "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": { + "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 + } + } + }, + "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": { + "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 + } + } + }, + "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": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.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 + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-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-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": { + "cssnano-util-get-arguments": "^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 + } + } + }, + "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": { + "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": { + "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-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": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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": { + "is-svg": "^3.0.0", + "postcss": "^7.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": { @@ -11808,9 +13571,9 @@ } }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", "dev": true }, "prelude-ls": { @@ -11889,19 +13652,10 @@ } } }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, "protractor": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", - "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz", + "integrity": "sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA==", "dev": true, "requires": { "@types/q": "^0.0.32", @@ -11921,6 +13675,12 @@ "webdriver-manager": "^12.0.6" }, "dependencies": { + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -11969,6 +13729,30 @@ "pinkie-promise": "^2.0.0" } }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -12018,13 +13802,13 @@ } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "prr": { @@ -12043,9 +13827,9 @@ } }, "ps-tree": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.1.tgz", - "integrity": "sha512-kef7fYYSKVqQffmzTMsVcUD1ObNJMp8sNSmHGlGKsZQyL/ht9MZKk86u0Rd1NhpTOAuhqwKCLLpktwkqz+MF8A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, "requires": { "event-stream": "=3.3.4" @@ -12058,9 +13842,9 @@ "dev": true }, "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "public-encrypt": { @@ -12101,8 +13885,16 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "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", @@ -12196,35 +13988,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.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "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": "^2.0.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.4.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", - "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "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": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } @@ -12259,16 +14049,26 @@ } }, "read-package-json": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.0.tgz", - "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", "dev": true, "requires": { "glob": "^7.1.1", "graceful-fs": "^4.1.2", "json-parse-better-errors": "^1.0.1", "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-json-fast": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "read-package-tree": { @@ -12422,27 +14222,28 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "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" } }, "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==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", "dev": true, "requires": { - "private": "^0.1.6" + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" } }, "regex-not": { @@ -12456,36 +14257,117 @@ } }, "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "dev": true, "requires": { - "define-properties": "^1.1.2" + "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.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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" + } + } } }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "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.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "registry-auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", - "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", "dev": true, "requires": { - "rc": "^1.2.8", - "safe-buffer": "^5.0.1" + "rc": "^1.2.8" } }, "registry-url": { @@ -12498,18 +14380,26 @@ } }, "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", "dev": true }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "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" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } } }, "remove-bom-buffer": { @@ -12551,15 +14441,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -12578,39 +14459,78 @@ } }, "replace-in-file": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-4.1.3.tgz", - "integrity": "sha512-x8uSfKKK/5YiJ8JYsNMwa1PJYvHfPdUABVXd21ro09Nh5BRZ5ATuACwrqCNpktwVqVbFTk/cIGFepeMqY0oX3g==", + "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", - "glob": "^7.1.4", - "yargs": "^13.3.0" + "chalk": "^3.0.0", + "glob": "^7.1.6", + "yargs": "^15.0.2" }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.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==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -12618,9 +14538,9 @@ "dev": true }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -12631,10 +14551,55 @@ "path-is-absolute": "^1.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": "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 + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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 }, "require-main-filename": { @@ -12644,23 +14609,32 @@ "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" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.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==", + "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": "^4.1.0" + "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": { @@ -12670,38 +14644,39 @@ "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "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": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "cliui": "^5.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", "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.1.1" + "yargs-parser": "^18.1.1" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -12711,9 +14686,9 @@ } }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -12723,7 +14698,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -12733,27 +14708,27 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.15" } }, "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "request-promise-core": "1.1.2", + "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -12906,102 +14881,84 @@ "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", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.22.0.tgz", - "integrity": "sha512-x4l4ZrV/Mr/x/jvFTmwROdEAhbZjx16yDRTVSKWh/i4oJDuW2dVEbECT853mybYCz7BAitU8ElGlhx7dNjw3qQ==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", - "dev": true - } - } - }, - "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" + "glob": "^7.1.3" } }, - "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==", + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "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" + "hash-base": "^3.0.0", + "inherits": "^2.0.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=", + "rollup": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", + "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", "dev": true, "requires": { - "rollup-pluginutils": "^2.0.1", - "source-map-resolve": "^0.5.0" + "fsevents": "~2.1.2" + }, + "dependencies": { + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + } } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "rollup-plugin-sourcemaps": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.5.0.tgz", + "integrity": "sha512-xp2vvRvgnYiXydgf/JFFFgYxrqMaQaOrK/g6yZvgwT9R1TSYjD3HKku1pD7iQNjQHkl5yGpokvJLp7cP/lR+aQ==", "dev": true, "requires": { - "estree-walker": "^0.6.1" + "@rollup/pluginutils": "^3.0.1", + "source-map-resolve": "^0.5.3" + }, + "dependencies": { + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "dev": true, "requires": { "is-promise": "^2.1.0" @@ -13022,11 +14979,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", @@ -13034,9 +14986,9 @@ "dev": true }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "requires": { "tslib": "^1.9.0" } @@ -13096,9 +15048,9 @@ } }, "rxjs-websockets": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/rxjs-websockets/-/rxjs-websockets-8.0.0.tgz", - "integrity": "sha512-8t3nE350u+6vPcJ5E5DCdsxXCJePQPNHWZmUFbs0tfYHTNdc4Hth4nNaEHAoxsJ4HrsRT9e5YutfMmstTl0afQ==" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/rxjs-websockets/-/rxjs-websockets-8.0.1.tgz", + "integrity": "sha512-j1U2uGxJxwxwKlDnRVWViFdpWgvESEWwS0+3/PKg8ygAqTLEB77hVxUqmqZcp45fcgtkrvl1/0i7qy9wEFO29g==" }, "safe-buffer": { "version": "5.1.2", @@ -13118,12 +15070,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" @@ -13189,22 +15142,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 } } @@ -13216,23 +15189,58 @@ "dev": true, "requires": { "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 + } } }, "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "schema-utils": { - "version": "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.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" } }, "select-hose": { @@ -13280,12 +15288,20 @@ "dev": true }, "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": { @@ -13345,9 +15361,9 @@ } }, "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", "dev": true }, "serve-index": { @@ -13491,11 +15507,28 @@ "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "simple-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", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -13509,9 +15542,9 @@ "dev": true }, "smart-buffer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", - "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", "dev": true }, "snapdragon": { @@ -13647,9 +15680,9 @@ } }, "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dev": true }, "socket.io-client": { @@ -13736,9 +15769,9 @@ } }, "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { "debug": "^3.2.5", @@ -13776,33 +15809,40 @@ } }, "socks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", - "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "dev": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" }, "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "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 } } }, @@ -13834,6 +15874,28 @@ "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": { @@ -13850,9 +15912,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.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -13874,9 +15936,9 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", - "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "sparkles": { @@ -13918,9 +15980,9 @@ "dev": true }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -13977,9 +16039,9 @@ "dev": true }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "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", @@ -14040,14 +16102,20 @@ } }, "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" } }, + "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", @@ -14101,89 +16169,6 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "stratos-angular6-json-schema-form": { - "version": "github:nwmac/ajsf#8c88d9a8a6b75e8bf39ab0151bbcd7a85d3aef7a", - "from": "github:nwmac/ajsf", - "requires": { - "@angular/animations": "^9.0.4", - "@angular/cdk": "^9.2.0", - "@angular/common": "^9.0.4", - "@angular/compiler": "^9.0.4", - "@angular/core": "^9.0.4", - "@angular/flex-layout": "^9.0.0-beta.29", - "@angular/forms": "^9.0.4", - "@angular/material": "^9.2.0", - "@angular/platform-browser": "^9.0.4", - "@angular/platform-browser-dynamic": "^9.0.4", - "@angular/router": "^9.0.4", - "brace": "^0.11.1", - "core-js": "^3.6.4", - "lodash-es": "^4.17.15", - "rxjs": "^6.5.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.2" - }, - "dependencies": { - "@angular/animations": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.0.tgz", - "integrity": "sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag==" - }, - "@angular/cdk": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.0.tgz", - "integrity": "sha512-jeeznvNDpR9POuxzz8Y0zFvMynG9HCJo3ZPTqOjlOq8Lj8876+rLsHDvKEMeLdwlkdi1EweYJW1CLQzI+TwqDA==", - "requires": { - "parse5": "^5.0.0" - } - }, - "@angular/common": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.0.tgz", - "integrity": "sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA==" - }, - "@angular/compiler": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.0.tgz", - "integrity": "sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA==" - }, - "@angular/core": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.0.tgz", - "integrity": "sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w==" - }, - "@angular/forms": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.0.tgz", - "integrity": "sha512-5GC8HQlPChPV+168zLlm4yj4syA6N9ChSKV0tmzj1zIfMcub1UAOaB9IYaXRHQsjPFh9OuQXwmkzScyAfhEVjA==" - }, - "@angular/material": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.0.tgz", - "integrity": "sha512-KKzEIVh6/m56m+Ao8p4PK0SyEr0574l3VP2swj1qPag3u+FYgemmXCGTaChrKdDsez+zeTCPXImBGXzE6NQ80Q==" - }, - "@angular/platform-browser": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.0.tgz", - "integrity": "sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg==" - }, - "@angular/platform-browser-dynamic": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz", - "integrity": "sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ==" - }, - "@angular/router": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.0.tgz", - "integrity": "sha512-cExO1nPnoPFiUJWZ28hTHozPLFoCmqr3xqcM57We0hhKE0esdrO+gRWKRH0EJERukLbU8coPKVhA8daGUpASiQ==" - }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" - } - } - }, "stratos-protractor-reporter": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stratos-protractor-reporter/-/stratos-protractor-reporter-1.2.3.tgz", @@ -14295,15 +16280,16 @@ "dev": true }, "streamroller": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", - "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", "dev": true, "requires": { - "date-format": "^1.2.0", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "readable-stream": "^2.3.0" + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" }, "dependencies": { "debug": { @@ -14315,6 +16301,17 @@ "ms": "^2.1.1" } }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14351,6 +16348,97 @@ "function-bind": "^1.0.2" } }, + "string.prototype.trimend": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "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": { + "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.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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" + } + } + } + }, "string.prototype.trimleft": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", @@ -14371,6 +16459,97 @@ "function-bind": "^1.1.1" } }, + "string.prototype.trimstart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "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": { + "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.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -14417,75 +16596,97 @@ "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.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "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": "^2.0.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.4.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", - "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "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": { - "ajv": "^6.10.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" } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + } + } + }, + "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 } } }, @@ -14498,6 +16699,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": { @@ -14519,6 +16742,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", @@ -14631,18 +16875,25 @@ "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.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", + "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", "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": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } } }, "teeny-request": { @@ -14734,68 +16985,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.1.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz", - "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", "dev": true, "requires": { "commander": "^2.20.0", @@ -14812,38 +17010,92 @@ } }, "terser-webpack-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", - "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "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", - "serialize-javascript": "^1.7.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" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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" + } } } }, @@ -14880,9 +17132,9 @@ } }, "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, "time-stamp": { @@ -14900,6 +17152,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", @@ -14932,9 +17190,9 @@ "dev": true }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "to-object-path": { @@ -15001,76 +17259,43 @@ "dev": true }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", - "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=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, "ts-md5": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.6.tgz", - "integrity": "sha512-VFW6O4CTZsgTPDBhF31i83hPhfwd9Dcp5RnbfGOIJPDRro9IhvXMYd8xBycD0yXqHZiAvv+iDG8F+UFrPEyQ5w==" + "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" - } - }, - "tsickle": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.37.0.tgz", - "integrity": "sha512-ufUZqLUNqh+kOfr52N/hJ5JbiDO32/CO7ZCteZBX9HA2kiejwEgDaJeJe1GAj2TIu683IgTA/LPKvlns6Liw0w==", - "dev": true, - "requires": { - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "yn": "3.1.1" } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tslint": { "version": "6.1.1", @@ -15162,9 +17387,9 @@ } }, "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true }, "type-is": { @@ -15183,10 +17408,19 @@ "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 }, "uglify-js": { @@ -15267,15 +17501,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "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==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "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==", "dev": true }, "union-value": { @@ -15290,6 +17524,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", @@ -15319,12 +17565,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": { @@ -15367,6 +17613,12 @@ "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", @@ -15414,30 +17666,82 @@ "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": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -15575,13 +17879,96 @@ } }, "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "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.2", - "object.getownpropertydescriptors": "^2.0.3" + "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.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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": { @@ -15636,6 +18023,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", @@ -15710,9 +18103,9 @@ } }, "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, "void-elements": { @@ -15722,14 +18115,42 @@ "dev": true }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^2.1.8", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "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 + } } }, "wbuf": { @@ -15741,6 +18162,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", @@ -15757,9 +18187,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", @@ -15782,70 +18212,169 @@ "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" }, "dependencies": { "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "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==", + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "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" + "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" } - } - } - }, - "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=", + }, + "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", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.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" + } + }, "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" } } } }, "webpack-dev-middleware": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", - "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "dev": true, "requires": { "memory-fs": "^0.4.1", - "mime": "^2.4.2", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", "range-parser": "^1.2.1", "webpack-log": "^2.0.0" }, "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", @@ -15855,41 +18384,41 @@ } }, "webpack-dev-server": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", - "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.6", + "chokidar": "^2.1.8", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", "html-entities": "^1.2.1", - "http-proxy-middleware": "^0.19.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.0", + "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.3", + "loglevel": "^1.6.6", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.21", + "portfinder": "^1.0.25", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.4", + "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", "sockjs": "0.3.19", - "sockjs-client": "1.3.0", + "sockjs-client": "1.4.0", "spdy": "^4.0.1", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.0", + "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", "yargs": "12.0.5" @@ -15952,12 +18481,27 @@ "ms": "^2.1.1" } }, + "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" + } + }, "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-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-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -15973,6 +18517,16 @@ "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==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", @@ -16007,6 +18561,41 @@ "mem": "^4.0.0" } }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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 + }, + "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", @@ -16083,12 +18672,12 @@ } }, "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-sources": { @@ -16110,12 +18699,12 @@ } }, "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": { @@ -16157,43 +18746,44 @@ "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" } } } @@ -16214,12 +18804,34 @@ } }, "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.2", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.2.tgz", + "integrity": "sha512-V+1zSZMOOKk+uBzKyNIODLQLsx59zSIOaI75J1EMS0iR1qy+KQR3y/pQ3T0vIhvPfDFapGRMsoMvQNEL3okqSA==", "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": { @@ -16248,14 +18860,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": { @@ -16268,9 +18881,9 @@ } }, "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": { @@ -16279,22 +18892,13 @@ "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" }, "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "dev": true, "requires": { "sax": ">=0.6.0", - "util.promisify": "~1.0.0", "xmlbuilder": "~11.0.0" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - } } }, "xmlbuilder": { @@ -16303,11 +18907,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", @@ -16321,9 +18920,9 @@ "dev": true }, "xterm": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.0.2.tgz", - "integrity": "sha512-NIr11b6C782TZznU8e6K/IMfmwlWMWRI6ba9GEDG9uX25SadkpjoMnzvxOS0Z/15sfrbn0rghPiarGDmmP0uhQ==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.4.0.tgz", + "integrity": "sha512-JGIpigWM3EBWvnS3rtBuefkiToIILSK1HYMXy4BCsUpO+O4UeeV+/U1AdAXgCB6qJrnPNb7yLgBsVCQUNMteig==" }, "xterm-addon-fit": { "version": "0.3.0", @@ -16346,9 +18945,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": { @@ -16425,9 +19024,9 @@ "dev": true }, "zone.js": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.2.tgz", - "integrity": "sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg==" + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" } } } diff --git a/package.json b/package.json index b61afba2d8..9ce08c3ea2 100644 --- a/package.json +++ b/package.json @@ -46,47 +46,47 @@ "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/animations": "^9.1.0", + "@angular/cdk": "^9.2.0", + "@angular/common": "^9.1.0", + "@angular/compiler": "^9.1.0", + "@angular/core": "^9.1.0", "@angular/flex-layout": "^9.0.0-beta.29", - "@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", - "@swimlane/ngx-charts": "^12.0.1", - "@types/moment-timezone": "^0.5.12", - "@types/marked": "^0.6.5", + "@angular/forms": "^9.1.0", + "@angular/material": "^9.2.0", + "@angular/material-moment-adapter": "^9.2.0", + "@angular/platform-browser": "^9.1.0", + "@angular/platform-browser-dynamic": "^9.1.0", + "@angular/platform-server": "^9.1.0", + "@angular/router": "^9.1.0", + "@ngrx/effects": "^9.0.0", + "@ngrx/router-store": "^9.0.0", + "@ngrx/store": "^9.0.0", + "@ngrx/store-devtools": "^9.0.0", + "@swimlane/ngx-charts": "^13.0.2", + "@types/moment-timezone": "^0.5.13", + "@types/marked": "^0.7.3", "angular2-virtual-scroll": "^0.4.16", - "core-js": "^3.2.1", - "hammerjs": "^2.0.8", - "immer": "^4.0.0", + "core-js": "^3.6.4", + "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": "nwmac/ajsf", - "ts-md5": "^1.2.4", + "rxjs-websockets": "~8.0.1", + "@nwmac/ajsf-material": "^0.1.4", + "ts-md5": "^1.2.7", + "tslib": "^1.10.0", "web-animations-js": "^2.3.2", - "xterm": "^4.0.2", + "xterm": "^4.4.0", "xterm-addon-fit": "^0.3.0", "zone.js": "~0.10.2" }, @@ -94,57 +94,55 @@ "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.0", + "@angular-devkit/build-ng-packagr": "~0.901.0", + "@angular-devkit/schematics": "^9.1.0", + "@angular/cli": "^9.1.0", + "@angular/compiler-cli": "^9.1.0", + "@angular/language-service": "^9.1.0", + "@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": "^4.4.1", + "@types/node": "^12.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": "~4.4.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", "lodash": "^4.17.13", - "mem": "5.1.1", + "mem": "6.0.1", "mktemp": "^1.0.0", - "ng-packagr": "^5.4.0", + "ng-packagr": "^9.0.0", "npm-run-all": "^4.1.5", - "protractor": "^5.4.2", + "protractor": "^5.4.3", "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", + "replace-in-file": "^5.0.2", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", "rxjs-tslint": "^0.1.7", "sass-lint": "^1.12.1", "stratos-protractor-reporter": "^1.2.3", - "ts-node": "~8.4.1", - "tsickle": "^0.37.0", - "tslib": "^1.9.0", + "ts-node": "~8.8.2", "tslint": "~6.1.1", - "typescript": "<3.6.0" + "typescript": "3.8.3" } } 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-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/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/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/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 5ed53069a7..418d485bbf 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 @@ -123,7 +123,7 @@ export class DeployApplicationStep2Component @ViewChild('sourceSelectionForm', { static: true }) sourceSelectionForm: NgForm; subscriptions: Array = []; - @ViewChild('fsChooser', { static: false }) fsChooser; + @ViewChild('fsChooser') fsChooser; public selectedSourceType: SourceType = null; 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..62d4b84115 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'; 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..5fbcc666f4 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,5 +1,5 @@ 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'; 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..972c915d01 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,5 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MaterialDesignFrameworkModule } from 'stratos-angular6-json-schema-form'; +import { MaterialDesignFrameworkModule } from '@nwmac/ajsf-material'; import { AppNameUniqueDirective, 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..1b88f8916c 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 '@nwmac/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/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..081f0b26e0 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 '@nwmac/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/components.module.ts b/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts index 197aca9173..74063bbeb7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { ApplicationModule, NgModule, Type } from '@angular/core'; -import { MaterialDesignFrameworkModule } from 'stratos-angular6-json-schema-form'; +import { MaterialDesignFrameworkModule } from '@nwmac/ajsf-material'; import { CoreModule } from '../../../../core/src/core/core.module'; import { 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-users/cf-permission-cell.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-permission-cell.ts index 766069ffca..8708f3cb6b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-permission-cell.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-permission-cell.ts @@ -1,4 +1,4 @@ -import { Input } from '@angular/core'; +import { Input, Directive } from '@angular/core'; import { Store } from '@ngrx/store'; import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; @@ -27,6 +27,7 @@ export interface ICellPermissionList 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/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..c9849036a7 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 '@nwmac/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..7020c83d18 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 '@nwmac/ajsf-material'; import { safeStringToObj } from '../../../../../core/src/core/utils.service'; import { isValidJsonValidator } from '../../../../../core/src/shared/form-validators'; 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/src/app.module.ts b/src/frontend/packages/core/src/app.module.ts index bfeef7669a..ccb6f826d9 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'; @@ -59,6 +59,7 @@ export interface RouterStateUrl { params: Params; queryParams: Params; } +@Injectable() export class CustomRouterStateSerializer implements RouterStateSerializer { serialize(routerState: RouterStateSnapshot): RouterStateUrl { @@ -99,7 +100,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, 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/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 index 5bb4a1ef34..fd580a6b16 100644 --- 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 @@ -42,7 +42,7 @@ export class EditQuotaStepComponent implements OnDestroy { quotaSubscription: Subscription; quota: IQuotaDefinition; - @ViewChild('form', { static: false }) + @ViewChild('form') form: QuotaDefinitionFormComponent; constructor( 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 index cd832da790..0a4862894d 100644 --- 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 @@ -38,7 +38,7 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { spaceQuotaDefinition$: Observable>; quota: IQuotaDefinition; - @ViewChild('form', { static: false }) + @ViewChild('form') form: SpaceQuotaDefinitionFormComponent; constructor( 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..52489e46a3 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,7 +1,7 @@ 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'; @@ -54,9 +54,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 +103,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. 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 ba2f90ec84..5f977037ae 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 @@ -42,11 +42,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/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/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/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-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-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 3e5313ddf1..91549ffc34 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 @@ -56,12 +56,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.component.ts b/src/frontend/packages/core/src/shared/components/list/list.component.ts index ee00ac9187..8cd259d872 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 @@ -118,7 +118,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; } @@ -145,7 +145,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; } 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 fb42367cfb..cf547290d9 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 @@ -12,6 +12,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"; export enum ListViewTypes { CARD_ONLY = 'cardOnly', @@ -142,6 +143,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/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 dcb09ca95e..60b5e2992b 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 @@ -22,7 +22,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/tsconfig.app.json b/src/frontend/packages/core/tsconfig.app.json index 335a6a7b4a..4dbcf96be1 100644 --- a/src/frontend/packages/core/tsconfig.app.json +++ b/src/frontend/packages/core/tsconfig.app.json @@ -3,11 +3,11 @@ "compilerOptions": { "outDir": "../../../../out-tsc" }, - "exclude": [ - "./src/test.ts", - "**/*.spec.ts", - "**/*.spec.helpers.ts", - "**/node_modules/**", - "./test-framework/**" + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/frontend/packages/**/*.d.ts" ] } diff --git a/src/frontend/packages/store/src/entity-catalog.module.ts b/src/frontend/packages/store/src/entity-catalog.module.ts index ce1830c9af..dc10b701cb 100644 --- a/src/frontend/packages/store/src/entity-catalog.module.ts +++ b/src/frontend/packages/store/src/entity-catalog.module.ts @@ -31,7 +31,7 @@ export class EntityCatalogFeatureModule { export class EntityCatalogModule { // TODO: this does not allow for lazy loading, work out if we can allow this. // https://github.com/cloudfoundry-incubator/stratos/issues/3741 - static forFeature(entityFactory: () => StratosBaseCatalogEntity[]): ModuleWithProviders { + static forFeature(entityFactory: () => StratosBaseCatalogEntity[]): ModuleWithProviders { // Note - If you place any code here before `return` you get funky errors. return { ngModule: EntityCatalogFeatureModule, 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 From adc0804ebb0bdf062a73042416119ca37c04b39e Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Tue, 7 Apr 2020 14:03:39 +0100 Subject: [PATCH 009/176] Fixes for angular 9 issues observed --- package-lock.json | 20 +++++++++---------- package.json | 4 ++-- .../cli-info-cloud-foundry.component.ts | 3 ++- .../schema-form/schema-form.component.ts | 2 +- .../cloud-foundry/src/shared/q-param.ts | 2 +- .../meta-card-base/meta-card.component.ts | 4 +++- 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7110fb959f..5b9abb4086 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1946,20 +1946,20 @@ } }, "@nwmac/ajsf-core": { - "version": "0.1.4", - "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-core/0.1.4/69a42e983ece036d34fffc0d2e9e30568322dac1ad1e40aecc143ef6e50bc093", - "integrity": "sha512-9emicHjVD13Y3+7pix9EVJpiksjrAtTEC6j+IHCrNncZSGH+bLlvBHzbFQas+m9eIyCIgpcxkbxQZZQLtClSVA==", + "version": "0.1.5", + "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-core/0.1.5/d423cd589ae903c35402220402097c9081224ea251dac22d17c284d677d5d75f", + "integrity": "sha512-5dvyatsVdgTC+2AK9wlnTcWyHHkJO+ovQlhysE7SkBUMoZDzUCr3NVvnsSAHLMKWxqmdffVMaLaqYNimVuNL8w==", "requires": { "ajv": "^6.10.0", "lodash-es": "^4.17.15" } }, "@nwmac/ajsf-material": { - "version": "0.1.4", - "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-material/0.1.4/2e339b3ba5be265afcce56bf2eaf266a4be454b2ac61b776ccbd664a7e21294d", - "integrity": "sha512-bpCwmN+C1Pd5pPieUVSTwrxBg4GNribmQFTMcDyloAvHGOzsS7aLcO9Q17uEajczspEoNqqoP1NY1BcJgP/UVg==", + "version": "0.1.5", + "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-material/0.1.5/0581fd7f119119b7db9afbee92d7d5195dcd72fc5d29aad7374e6a63dfdb0263", + "integrity": "sha512-NtsmLpgOuMHjDgMRoL1lTQjH2SyunYBya+1hw4xnxlTK7Vw7FOzadfm1N2KeKgEjgB1vKM7nDC/BkBlpfgGVBg==", "requires": { - "@nwmac/ajsf-core": "~0.1.4", + "@nwmac/ajsf-core": "~0.1.5", "lodash-es": "^4.17.15" } }, @@ -2198,9 +2198,9 @@ } }, "@types/node": { - "version": "12.12.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz", - "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", + "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", "dev": true }, "@types/normalize-package-data": { diff --git a/package.json b/package.json index 9ce08c3ea2..aa4b4dd956 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "rxjs": "^6.5.5", "rxjs-spy": "^7.0.2", "rxjs-websockets": "~8.0.1", - "@nwmac/ajsf-material": "^0.1.4", + "@nwmac/ajsf-material": "^0.1.5", "ts-md5": "^1.2.7", "tslib": "^1.10.0", "web-animations-js": "^2.3.2", @@ -103,7 +103,7 @@ "@types/jasmine": "^3.5.10", "@types/jasminewd2": "~2.0.8", "@types/karma": "^4.4.1", - "@types/node": "^12.11.1", + "@types/node": "^13.11.0", "@types/request": "^2.48.4", "acorn": "^7.1.1", "browserstack-local": "^1.4.5", 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..aeaedd7552 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 @@ -97,9 +97,10 @@ export class CliInfoCloudFoundryComponent implements OnInit { private setupRouteObservable(defaultBackLink: string) { this.route$ = this.store.select(getPreviousRoutingState).pipe( map(route => { + console.log(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/shared/components/schema-form/schema-form.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.ts index 7020c83d18..6db64ca9a9 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 '@nwmac/ajsf-material'; +import { JsonPointer } from '@nwmac/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/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/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 600657089c..9592815e71 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 @@ -68,7 +68,9 @@ 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 = getFavoriteFromCfEntity(entity, entityConfig.schema.entityType, this.favoritesConfigMapper) + }) ).subscribe(); } } From 7486a8cd3366eec11573d4e52ffd2f276b385937 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Tue, 7 Apr 2020 23:10:54 +0100 Subject: [PATCH 010/176] Use npm registry --- .npmrc | 2 - package-lock.json | 46 +++++++++---------- package.json | 2 +- .../add-service-instance.component.spec.ts | 2 +- .../bind-apps-step.component.spec.ts | 2 +- .../specify-details-step.component.spec.ts | 2 +- .../shared/components/components.module.ts | 2 +- .../schema-form/schema-form.component.spec.ts | 2 +- .../schema-form/schema-form.component.ts | 2 +- 9 files changed, 28 insertions(+), 34 deletions(-) delete mode 100644 .npmrc diff --git a/.npmrc b/.npmrc deleted file mode 100644 index dbde4965c9..0000000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -@nwmac:registry=https://npm.pkg.github.com - diff --git a/package-lock.json b/package-lock.json index 5b9abb4086..da2d42c291 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1767,6 +1767,14 @@ "to-fast-properties": "^2.0.0" } }, + "@cfstratos/ajsf-material": { + "version": "0.1.5", + "resolved": "https://npm.pkg.github.com/download/@cfstratos/ajsf-material/0.1.5/0581fd7f119119b7db9afbee92d7d5195dcd72fc5d29aad7374e6a63dfdb0263", + "integrity": "sha512-NtsmLpgOuMHjDgMRoL1lTQjH2SyunYBya+1hw4xnxlTK7Vw7FOzadfm1N2KeKgEjgB1vKM7nDC/BkBlpfgGVBg==", + "requires": { + "lodash-es": "^4.17.15" + } + }, "@istanbuljs/schema": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", @@ -1945,24 +1953,6 @@ "infer-owner": "^1.0.4" } }, - "@nwmac/ajsf-core": { - "version": "0.1.5", - "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-core/0.1.5/d423cd589ae903c35402220402097c9081224ea251dac22d17c284d677d5d75f", - "integrity": "sha512-5dvyatsVdgTC+2AK9wlnTcWyHHkJO+ovQlhysE7SkBUMoZDzUCr3NVvnsSAHLMKWxqmdffVMaLaqYNimVuNL8w==", - "requires": { - "ajv": "^6.10.0", - "lodash-es": "^4.17.15" - } - }, - "@nwmac/ajsf-material": { - "version": "0.1.5", - "resolved": "https://npm.pkg.github.com/download/@nwmac/ajsf-material/0.1.5/0581fd7f119119b7db9afbee92d7d5195dcd72fc5d29aad7374e6a63dfdb0263", - "integrity": "sha512-NtsmLpgOuMHjDgMRoL1lTQjH2SyunYBya+1hw4xnxlTK7Vw7FOzadfm1N2KeKgEjgB1vKM7nDC/BkBlpfgGVBg==", - "requires": { - "@nwmac/ajsf-core": "~0.1.5", - "lodash-es": "^4.17.15" - } - }, "@rollup/plugin-commonjs": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", @@ -2604,6 +2594,7 @@ "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", @@ -6688,7 +6679,8 @@ "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==" + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true }, "fast-glob": { "version": "3.2.2", @@ -6761,7 +6753,8 @@ "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -9865,7 +9858,8 @@ "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", @@ -10190,9 +10184,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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 }, "klaw-sync": { @@ -13885,7 +13879,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "pupa": { "version": "2.0.1", @@ -17742,6 +17737,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } diff --git a/package.json b/package.json index e691359e4e..7bab803ace 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "rxjs": "^6.5.5", "rxjs-spy": "^7.0.2", "rxjs-websockets": "~8.0.1", - "@nwmac/ajsf-material": "^0.1.5", + "@cfstratos/ajsf-material": "^0.1.5", "ts-md5": "^1.2.7", "tslib": "^1.10.0", "web-animations-js": "^2.3.2", 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 972c915d01..d1770c3adc 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,5 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MaterialDesignFrameworkModule } from '@nwmac/ajsf-material'; +import { MaterialDesignFrameworkModule } from '@cfstratos/ajsf-material'; import { AppNameUniqueDirective, 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 1b88f8916c..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 '@nwmac/ajsf-material'; +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/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 081f0b26e0..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 '@nwmac/ajsf-material'; +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/components.module.ts b/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts index 74063bbeb7..4e0e716513 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { ApplicationModule, NgModule, Type } from '@angular/core'; -import { MaterialDesignFrameworkModule } from '@nwmac/ajsf-material'; +import { MaterialDesignFrameworkModule } from '@cfstratos/ajsf-material'; import { CoreModule } from '../../../../core/src/core/core.module'; import { 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 c9849036a7..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 '@nwmac/ajsf-material'; +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 6db64ca9a9..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 '@nwmac/ajsf-core'; +import { JsonPointer } from '@cfstratos/ajsf-core'; import { safeStringToObj } from '../../../../../core/src/core/utils.service'; import { isValidJsonValidator } from '../../../../../core/src/shared/form-validators'; From 574a7dee4bc7fa17688422764ced044b40328adc Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Tue, 7 Apr 2020 23:15:46 +0100 Subject: [PATCH 011/176] Fix package lock --- package-lock.json | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index da2d42c291..4471d07a75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1767,11 +1767,21 @@ "to-fast-properties": "^2.0.0" } }, + "@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": { + "ajv": "^6.10.0", + "lodash-es": "^4.17.15" + } + }, "@cfstratos/ajsf-material": { "version": "0.1.5", - "resolved": "https://npm.pkg.github.com/download/@cfstratos/ajsf-material/0.1.5/0581fd7f119119b7db9afbee92d7d5195dcd72fc5d29aad7374e6a63dfdb0263", - "integrity": "sha512-NtsmLpgOuMHjDgMRoL1lTQjH2SyunYBya+1hw4xnxlTK7Vw7FOzadfm1N2KeKgEjgB1vKM7nDC/BkBlpfgGVBg==", + "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" } }, @@ -2594,7 +2604,6 @@ "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", @@ -6679,8 +6688,7 @@ "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" }, "fast-glob": { "version": "3.2.2", @@ -6753,8 +6761,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -9858,8 +9865,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { "version": "1.0.1", @@ -13879,8 +13885,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { "version": "2.0.1", @@ -17737,7 +17742,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } From 0c1b43accbdcd9fb8b7f6efbc76bd8e85b01d5c6 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Tue, 7 Apr 2020 23:58:40 +0100 Subject: [PATCH 012/176] Fix front-end unit test --- .../core/src/shared/user-permission.directive.spec.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) 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: `` + template: `` }) class TestUserPermissionComponent { } -class MockTemplateRef { } - describe('UserPermissionDirective', () => { let component: TestUserPermissionComponent; let fixture: ComponentFixture; @@ -19,9 +18,6 @@ describe('UserPermissionDirective', () => { imports: [ ...BaseTestModules ], - providers: [ - { provide: TemplateRef, useClass: MockTemplateRef }, - ], declarations: [TestUserPermissionComponent] }); fixture = TestBed.createComponent(TestUserPermissionComponent); From 8051743f1da58d052ed0e9af16db7489f56c85bc Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Mon, 6 Apr 2020 17:33:14 +0100 Subject: [PATCH 013/176] Add initial UI for backup/restore --- .../shared/components/components.module.ts | 6 +- .../backup-endpoints.service.ts | 198 ++++++++++++++ .../backup-endpoints.component.html | 32 +++ .../backup-endpoints.component.scss | 15 + .../backup-endpoints.component.spec.ts | 25 ++ .../backup-endpoints.component.ts | 184 +++++++++++++ .../backup-restore-cell.component.html | 2 + .../backup-restore-cell.component.scss | 0 .../backup-restore-cell.component.spec.ts | 25 ++ .../backup-restore-cell.component.ts | 25 ++ .../backup-restore-endpoints.service.ts | 213 +++++++++++++++ .../backup-restore-endpoints.component.html | 13 + .../backup-restore-endpoints.component.scss | 3 + ...backup-restore-endpoints.component.spec.ts | 25 ++ .../backup-restore-endpoints.component.ts | 48 ++++ .../restore-endpoints.service.ts | 76 ++++++ .../restore-endpoints.component.html | 27 ++ .../restore-endpoints.component.scss | 18 ++ .../restore-endpoints.component.spec.ts | 25 ++ .../restore-endpoints.component.ts | 176 ++++++++++++ .../features/endpoints/endpoints.module.ts | 17 +- .../features/endpoints/endpoints.routing.ts | 19 +- .../table-cell/table-cell.component.ts | 1 + .../endpoint/endpoints-list-config.service.ts | 25 +- .../store/src/actions/endpoint.actions.ts | 2 +- src/jetstream/cnsi.go | 257 +++++++++++++++++- src/jetstream/main.go | 4 + src/jetstream/repository/cnsis/cnsis.go | 1 + src/jetstream/repository/cnsis/pgsql_cnsis.go | 32 +++ .../repository/interfaces/portal_proxy.go | 2 +- .../repository/interfaces/structs.go | 22 +- .../repository/tokens/pgsql_tokens.go | 244 +++++++++++++++++ src/jetstream/repository/tokens/tokens.go | 3 + src/jetstream/stringutils/utils.go | 2 +- 34 files changed, 1744 insertions(+), 23 deletions(-) create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.scss create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.html create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.scss create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.scss create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.ts 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 index 197aca9173..0eab5d7bd5 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts @@ -100,6 +100,9 @@ import { 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'; @@ -175,7 +178,6 @@ import { SelectServiceComponent } from './select-service/select-service.componen 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'; -import { TableCellFeatureFlagDescriptionComponent } from './list/list-types/cf-feature-flags/table-cell-feature-flag-description/table-cell-feature-flag-description.component'; // tslint:disable:max-line-length // tslint:enable:max-line-length @@ -219,7 +221,7 @@ const cfListTableCells: Type>[] = [ TableCellServiceBindableComponent, TableCellServiceActiveComponent, TableCellServiceReferencesComponent, - TableCellServiceInstanceTagsComponent + TableCellServiceInstanceTagsComponent, ]; const cfListCards: Type>[] = [ 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 new file mode 100644 index 0000000000..80cc1c5f43 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts @@ -0,0 +1,198 @@ +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { filter, first, map, switchMap } from 'rxjs/operators'; + +import { GeneralEntityAppState } from '../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { AuthState } from '../../../../../store/src/reducers/auth.reducer'; +import { SessionData } from '../../../../../store/src/types/auth.types'; +import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { BrowserStandardEncoder } from '../../../helper'; +import { + BackupEndpointConfigUI, + BackupEndpointsConfig, + BackupEndpointTypes, + BackupRestoreEndpointService, + BaseEndpointConfig, +} from './backup-restore-endpoints.service'; + +interface BackupEndpointConfigRequest extends BaseEndpointConfig { + // connectedUser: string; +} + +interface BackupEndpointRequestData { + state: BackupEndpointsConfig; + userId: string; + password: string; +} + +@Injectable() +export class BackupEndpointsService extends BackupRestoreEndpointService { + + hasChanges = new BehaviorSubject(false); + hasChanges$ = this.hasChanges.asObservable(); + allChanged = new BehaviorSubject(false); + allChanged$ = this.allChanged.asObservable(); + + state: BackupEndpointsConfig = {}; + password: string; + + constructor( + private store: Store, + private http: HttpClient + ) { + super(); + } + + // State Related + initialize(endpoints: EndpointModel[]) { + endpoints.forEach(entity => { + this.state[entity.guid] = { + [BackupEndpointTypes.ENDPOINT]: false, + [BackupEndpointTypes.CONNECT]: false, + [BackupEndpointTypes.ALL_CONNECT]: false, + entity + }; + }); + this.validate(); + } + + validate() { + const endpoints = Object.values(this.state); + endpoints.forEach(endpoint => { + if (!endpoint[BackupEndpointTypes.ENDPOINT]) { + endpoint[BackupEndpointTypes.CONNECT] = false; + endpoint[BackupEndpointTypes.ALL_CONNECT] = false; + } + if (endpoint[BackupEndpointTypes.ALL_CONNECT] && this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT)) { + endpoint[BackupEndpointTypes.CONNECT] = true; + } + }); + + const hasChanges = !!endpoints.find(endpoint => + endpoint[BackupEndpointTypes.ENDPOINT] || + endpoint[BackupEndpointTypes.CONNECT] || + endpoint[BackupEndpointTypes.ALL_CONNECT] + ); + this.hasChanges.next(hasChanges); + const allChanged = endpoints.every(endpoint => { + const e = !this.canBackup(endpoint.entity, BackupEndpointTypes.ENDPOINT) || endpoint[BackupEndpointTypes.ENDPOINT]; + const c = !this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT) || endpoint[BackupEndpointTypes.CONNECT]; + const aC = !this.canBackup(endpoint.entity, BackupEndpointTypes.ALL_CONNECT) || endpoint[BackupEndpointTypes.ALL_CONNECT]; + return e && c && aC; + } + + ); + this.allChanged.next(allChanged); + } + + canBackup(endpoint: EndpointModel, type: BackupEndpointTypes): boolean { + // Can always back up endpoint + if (type === BackupEndpointTypes.ENDPOINT) { + return true; + } + + // All other settings require endpoint to be backed up + if (!this.state[endpoint.guid][BackupEndpointTypes.ENDPOINT]) { + return false; + } + + const epType = entityCatalog.getEndpoint(endpoint.cnsi_type, endpoint.sub_type).definition; + // The endpoint type supports connection details + if (epType.unConnectable) { + return false; + } + + // Are all connection details backed up anyway? + // Does the user have connection details for this endpoint? + if (type === BackupEndpointTypes.CONNECT) { + return !this.state[endpoint.guid][BackupEndpointTypes.ALL_CONNECT] && + endpoint.connectionStatus === 'connected'; + // return !this.service.state[endpoint.guid][BackupRestoreTypes.CONNECT]; + } + + return true; + } + + selectAll() { + Object.values(this.state).forEach(endpoint => { + if (this.canBackup(endpoint.entity, BackupEndpointTypes.ENDPOINT)) { + endpoint[BackupEndpointTypes.ENDPOINT] = true; + } + if (this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT)) { + endpoint[BackupEndpointTypes.CONNECT] = true; + } + if (this.canBackup(endpoint.entity, BackupEndpointTypes.ALL_CONNECT)) { + endpoint[BackupEndpointTypes.ALL_CONNECT] = true; + } + }); + this.validate(); + } + + selectNone() { + Object.values(this.state).forEach(endpoint => { + endpoint[BackupEndpointTypes.ENDPOINT] = false; + endpoint[BackupEndpointTypes.CONNECT] = false; + endpoint[BackupEndpointTypes.ALL_CONNECT] = false; + }); + this.validate(); + } + + // Request Related + + createBackup(): Observable { + const url = '/pp/v1/endpoints/backup'; + const fromObject = {}; + const params: HttpParams = new HttpParams({ + fromObject, + encoder: new BrowserStandardEncoder() + }); + + return this.getSessionData().pipe( + switchMap(ses => this.http.post(url, this.createBodyToSend(ses), { + params + })), + map(res => { + console.log('Response: ', res); + return new Blob([JSON.stringify(res)]); + }), + first(), + ); + } + + private createBodyToSend(sd: SessionData): BackupEndpointRequestData { + const state: BackupEndpointsConfig = Object.entries(this.state).reduce((res, [endpointId, endpoint]) => { + const { entity, ...rest } = endpoint; + const requestConfig: BackupEndpointConfigRequest = { + ...rest, + }; + res[endpointId] = requestConfig; + return res; + }, {}); + return { + state, + userId: this.getUserIdFromSessionData(sd), + password: this.password + }; + } + + private getUserIdFromSessionData(sd: SessionData): string { + if (sd && sd.user) { + return sd.user.guid; + } + return null; + } + + private getSessionData(): Observable { + return this.store.select(s => s.auth).pipe( + filter(auth => !!(auth && auth.sessionData)), + map((auth: AuthState) => auth.sessionData), + first() + ); + } + + + +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html new file mode 100644 index 0000000000..e6dd32385c --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html @@ -0,0 +1,32 @@ + +

Backup Endpoints

+
+ + + +
+

Select the endpoints and connection details that you would like to backup

+
+ + +
+ +
+
+ +
+

Protect the backup by providing as password. You will need this password when restoring from this backup

+
+ + + +
+
+
+
+ + \ No newline at end of file diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.scss new file mode 100644 index 0000000000..de139e1b04 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.scss @@ -0,0 +1,15 @@ +:host { + flex: 1; +} +.select-step { + display: flex; + flex: 1; + flex-direction: column; + + &__buttons { + padding-bottom: 12px; + button { + margin-right: 24px; + } + } +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts new file mode 100644 index 0000000000..16cf213f81 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BackupEndpointsComponent } from './backup-endpoints.component'; + +describe('BackupEndpointsComponent', () => { + let component: BackupEndpointsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BackupEndpointsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BackupEndpointsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); 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 new file mode 100644 index 0000000000..23f5216ab3 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts @@ -0,0 +1,184 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import * as moment from 'moment'; +import { Observable, of, Subject } from 'rxjs'; +import { filter, first, map, tap } from 'rxjs/operators'; + +import { GetAllEndpoints } from '../../../../../../store/src/actions/endpoint.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 { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; +import { ConfirmationDialogConfig } from '../../../../shared/components/confirmation-dialog.config'; +import { ConfirmationDialogService } from '../../../../shared/components/confirmation-dialog.service'; +import { ITableListDataSource } from '../../../../shared/components/list/data-sources-controllers/list-data-source-types'; +import { ITableColumn } from '../../../../shared/components/list/list-table/table.types'; +import { StepOnNextFunction, StepOnNextResult } from '../../../../shared/components/stepper/step/step.component'; +import { BackupEndpointsService } from '../backup-endpoints.service'; +import { BackupRestoreCellComponent } from '../backup-restore-cell/backup-restore-cell.component'; +import { BackupEndpointTypes } from '../backup-restore-endpoints.service'; + +@Component({ + selector: 'app-backup-endpoints', + templateUrl: './backup-endpoints.component.html', + styleUrls: ['./backup-endpoints.component.scss'], + providers: [ + BackupEndpointsService + ] +}) +export class BackupEndpointsComponent implements OnInit { + + // Step 1 + columns: ITableColumn[] = [ + { + columnId: 'name', + headerCell: () => 'Name', + cellDefinition: { + valuePath: 'name' + } + }, + { + columnId: 'endpoint', + headerCell: () => 'Backup', + cellComponent: BackupRestoreCellComponent, + cellConfig: { + type: BackupEndpointTypes.ENDPOINT + } + }, + { + columnId: 'connect', + headerCell: () => 'Backup Your Connection Details', + cellComponent: BackupRestoreCellComponent, + cellConfig: { + type: BackupEndpointTypes.CONNECT + } + }, + { + columnId: 'all-connect', + headerCell: () => 'Backup All Users Connection Details', + cellComponent: BackupRestoreCellComponent, + cellConfig: { + type: BackupEndpointTypes.ALL_CONNECT + } + }, + ]; + endpointDataSource: ITableListDataSource; + disableSelectAll$: Observable; + disableSelectNone$: Observable; + selectValid$: Observable; + + // Step 2 + passwordValid$: Observable; + passwordForm: FormGroup; + + constructor( + public service: BackupEndpointsService, + private store: Store, + private paginationMonitorFactory: PaginationMonitorFactory, + private confirmDialog: ConfirmationDialogService, + ) { + this.setupSelectStep(); + this.setupPasswordStep(); + } + + setupSelectStep() { + const action = new GetAllEndpoints(); + const endpointObs = getPaginationObservables({ + store: this.store, + action, + paginationMonitor: this.paginationMonitorFactory.create( + action.paginationKey, + action, + true + ) + }, true); + + + const endpoints$ = endpointObs.entities$.pipe( + filter(entities => !!entities), + map(endpoints => endpoints.sort((a, b) => a.name.localeCompare(b.name))) + ); + + endpoints$.pipe(first()).subscribe(entities => this.service.initialize(entities)); + + this.endpointDataSource = { + isTableLoading$: endpointObs.fetchingEntities$, + connect: () => endpoints$, + disconnect: () => { }, + trackBy: (index, row) => row.guid + }; + + this.disableSelectAll$ = this.service.allChanged$; + this.disableSelectNone$ = this.service.hasChanges$.pipe( + map(hasChanges => !hasChanges) + ); + + this.selectValid$ = this.service.hasChanges$; + } + + setupPasswordStep() { + this.passwordForm = new FormGroup({ + password: new FormControl('', [Validators.required]), + }); + this.passwordValid$ = this.passwordForm.statusChanges.pipe( + map(() => { + this.service.password = this.passwordForm.controls.password.value; + return this.passwordForm.valid; + }) + ); + } + + ngOnInit() { + } + + onNext: StepOnNextFunction = () => { + // TODO: RC Complete/Finish token warning + const confirmation = new ConfirmationDialogConfig( + 'Backup', + 'Backing up connection details ?????????', + 'Continue', + true + ); + const result = new Subject(); + + const userCancelledDialog = () => { + result.next({ + success: false + }); + }; + + const backupSuccess = data => { + result.next({ + success: true, + redirect: true, + }); + + const downloadURL = window.URL.createObjectURL(data); + const link = document.createElement('a'); + link.href = downloadURL; + const dateTime = moment().format('YYYYMMDD-HHmmss'); // TODO: RC timezone? + link.download = `stratos_backup_${dateTime}.bk`; + link.click(); + }; + + const backupFailure = err => { + const errorMessage = this.service.createError(err); + result.next({ + success: false, + message: `Failed to create backup` + (errorMessage ? `: ${errorMessage}` : '') + }); + return of(false); + }; + + const createBackup = () => this.service.createBackup().pipe(first()).subscribe(backupSuccess, backupFailure); + + // TODO: RC tie in progress indicator (not sure if possible) + this.confirmDialog.openWithCancel(confirmation, createBackup, userCancelledDialog); + + // TODO: RC Remove console.log + return result.asObservable().pipe(tap(console.log)); + } + + +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.html new file mode 100644 index 0000000000..3f240bbf9e --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts new file mode 100644 index 0000000000..1809ff8d89 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BackupRestoreCellComponent } from './backup-restore-cell.component'; + +describe('BackupRestoreCellComponent', () => { + let component: BackupRestoreCellComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BackupRestoreCellComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BackupRestoreCellComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts new file mode 100644 index 0000000000..97a05e5198 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts @@ -0,0 +1,25 @@ +import { Component } from '@angular/core'; + +import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; +import { TableCellCustom } from '../../../../shared/components/list/list.types'; +import { BackupEndpointsService } from '../backup-endpoints.service'; + +@Component({ + selector: 'app-backup-restore-cell', + templateUrl: './backup-restore-cell.component.html', + styleUrls: ['./backup-restore-cell.component.scss'] +}) +export class BackupRestoreCellComponent extends TableCellCustom { + + constructor(public service: BackupEndpointsService) { + super(); + } + + validate() { + this.service.validate(); + } + + disabled(): boolean { + return !this.service.canBackup(this.row, this.config.type); + } +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts new file mode 100644 index 0000000000..29b19d45f2 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts @@ -0,0 +1,213 @@ +import { HttpErrorResponse } from '@angular/common/http'; + +import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { isHttpErrorResponse } from '../../../jetstream.helpers'; + +// TODO: RC move to types + +export enum BackupEndpointTypes { + ENDPOINT = 'endpoint', + CONNECT = 'connect', + ALL_CONNECT = 'all_connect' +} + +export interface BackupEndpointsConfig { + [endpointId: string]: T; +} + +export interface BaseEndpointConfig { + [BackupEndpointTypes.ENDPOINT]: boolean; + [BackupEndpointTypes.CONNECT]: boolean; + [BackupEndpointTypes.ALL_CONNECT]: boolean; +} + +// type BackupEndpoint = Omit; + +export interface BackupEndpointConfigUI extends BaseEndpointConfig { + entity: EndpointModel; +} + +// @Injectable() +export class BackupRestoreEndpointService { + + createError(err: any): string { + // TODO: RC tidy. move generic + const httpResponse: HttpErrorResponse = isHttpErrorResponse(err); + if (httpResponse) { + if (httpResponse.error) { + if (typeof (httpResponse.error) === 'string') { + return httpResponse.error + ` (${httpResponse.status})`; + } + return httpResponse.error.error + ` (${httpResponse.status})`; + } + return JSON.stringify(httpResponse.error) + ` (${httpResponse.status})`; + } + return err.message; + } + + // hasChanges = new BehaviorSubject(false); + // hasChanges$ = this.hasChanges.asObservable(); + // allChanged = new BehaviorSubject(false); + // allChanged$ = this.allChanged.asObservable(); + + // state: BackupEndpointsConfig = {}; + // password: string; + + + // constructor( + // private store: Store, + // private http: HttpClient + // ) { + + // } + + // // State Related + // initialize(endpoints: EndpointModel[]) { + // endpoints.forEach(entity => { + // this.state[entity.guid] = { + // [BackupRestoreTypes.ENDPOINT]: false, + // [BackupRestoreTypes.CONNECT]: false, + // [BackupRestoreTypes.ALL_CONNECT]: false, + // entity + // }; + // }); + // this.validate(); + // } + + // validate() { + // const endpoints = Object.values(this.state); + // endpoints.forEach(endpoint => { + // if (!endpoint[BackupRestoreTypes.ENDPOINT]) { + // endpoint[BackupRestoreTypes.CONNECT] = false; + // endpoint[BackupRestoreTypes.ALL_CONNECT] = false; + // } + // if (endpoint[BackupRestoreTypes.ALL_CONNECT] && this.canBackup(endpoint.entity, BackupRestoreTypes.CONNECT)) { + // endpoint[BackupRestoreTypes.CONNECT] = true; + // } + // }); + + // const hasChanges = !!endpoints.find(endpoint => + // endpoint[BackupRestoreTypes.ENDPOINT] || + // endpoint[BackupRestoreTypes.CONNECT] || + // endpoint[BackupRestoreTypes.ALL_CONNECT] + // ); + // this.hasChanges.next(hasChanges); + // const allChanged = endpoints.every(endpoint => { + // const e = !this.canBackup(endpoint.entity, BackupRestoreTypes.ENDPOINT) || endpoint[BackupRestoreTypes.ENDPOINT]; + // const c = !this.canBackup(endpoint.entity, BackupRestoreTypes.CONNECT) || endpoint[BackupRestoreTypes.CONNECT]; + // const aC = !this.canBackup(endpoint.entity, BackupRestoreTypes.ALL_CONNECT) || endpoint[BackupRestoreTypes.ALL_CONNECT]; + // return e && c && aC; + // } + + // ); + // this.allChanged.next(allChanged); + // } + + // canBackup(endpoint: EndpointModel, type: BackupRestoreTypes): boolean { + // // Can always back up endpoint + // if (type === BackupRestoreTypes.ENDPOINT) { + // return true; + // } + + // // All other settings require endpoint to be backed up + // if (!this.state[endpoint.guid][BackupRestoreTypes.ENDPOINT]) { + // return false; + // } + + // const epType = entityCatalog.getEndpoint(endpoint.cnsi_type, endpoint.sub_type).definition; + // // The endpoint type supports connection details + // if (epType.unConnectable) { + // return false; + // } + + // // Are all connection details backed up anyway? + // // Does the user have connection details for this endpoint? + // if (type === BackupRestoreTypes.CONNECT) { + // return !this.state[endpoint.guid][BackupRestoreTypes.ALL_CONNECT] && + // endpoint.connectionStatus === 'connected'; + // // return !this.service.state[endpoint.guid][BackupRestoreTypes.CONNECT]; + // } + + // return true; + // } + + // selectAll() { + // Object.values(this.state).forEach(endpoint => { + // if (this.canBackup(endpoint.entity, BackupRestoreTypes.ENDPOINT)) { + // endpoint[BackupRestoreTypes.ENDPOINT] = true; + // } + // if (this.canBackup(endpoint.entity, BackupRestoreTypes.CONNECT)) { + // endpoint[BackupRestoreTypes.CONNECT] = true; + // } + // if (this.canBackup(endpoint.entity, BackupRestoreTypes.ALL_CONNECT)) { + // endpoint[BackupRestoreTypes.ALL_CONNECT] = true; + // } + // }); + // this.validate(); + // } + + // selectNone() { + // Object.values(this.state).forEach(endpoint => { + // endpoint[BackupRestoreTypes.ENDPOINT] = false; + // endpoint[BackupRestoreTypes.CONNECT] = false; + // endpoint[BackupRestoreTypes.ALL_CONNECT] = false; + // }); + // this.validate(); + // } + + // // Request Related + + // createBackup(): Observable { + // const url = '/pp/v1/backup/endpoints'; + // const fromObject = {}; + // const params: HttpParams = new HttpParams({ + // fromObject, + // encoder: new BrowserStandardEncoder() + // }); + + // return this.getSessionData().pipe( + // switchMap(ses => this.http.post(url, this.createBodyToSend(ses), { + // params + // })), + // map(res => { + // console.log('Response: ', res); + // return new Blob([JSON.stringify(res)]); + // }), + // first(), + // ); + // } + + // private createBodyToSend(sd: SessionData): BackupEndpointRequestData { + // const state: BackupEndpointsConfig = Object.entries(this.state).reduce((res, [endpointId, endpoint]) => { + // const { entity, ...rest } = endpoint; + // const requestConfig: BackupEndpointConfigRequest = { + // ...rest, + // }; + // res[endpointId] = requestConfig; + // return res; + // }, {}); + // return { + // state, + // userId: this.getUserIdFromSessionData(sd), + // password: this.password + // }; + // } + + // private getUserIdFromSessionData(sd: SessionData): string { + // if (sd && sd.user) { + // return sd.user.guid; + // } + // return null; + // } + + // private getSessionData(): Observable { + // return this.store.select(s => s.auth).pipe( + // filter(auth => !!(auth && auth.sessionData)), + // map((auth: AuthState) => auth.sessionData), + // first() + // ); + // } + + + +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html new file mode 100644 index 0000000000..d1ea1197f7 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html @@ -0,0 +1,13 @@ + +

Backup/Restore Endpoints

+
+ + + +
+ +

Create a backup of Endpoints and their connection details or restore from an existing backup.

+ +
+
+
\ No newline at end of file diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.scss new file mode 100644 index 0000000000..712926fb2c --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.scss @@ -0,0 +1,3 @@ +.tiles { + flex: 1; +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts new file mode 100644 index 0000000000..587eefc846 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BackupRestoreEndpointsComponent } from './backup-restore-endpoints.component'; + +describe('BackupRestoreEndpointsComponent', () => { + let component: BackupRestoreEndpointsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BackupRestoreEndpointsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BackupRestoreEndpointsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts new file mode 100644 index 0000000000..90b1e4cc2d --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts @@ -0,0 +1,48 @@ +import { Component } from '@angular/core'; +import { Store } from '@ngrx/store'; + +import { RouterNav } from '../../../../../../store/src/actions/router.actions'; +import { AppState } from '../../../../../../store/src/app-state'; +import { ITileConfig, ITileData } from '../../../../shared/components/tile/tile-selector.types'; + +interface IAppTileData extends ITileData { + type: string; +} + + +@Component({ + selector: 'app-backup-restore-endpoints', + templateUrl: './backup-restore-endpoints.component.html', + styleUrls: ['./backup-restore-endpoints.component.scss'], +}) +export class BackupRestoreEndpointsComponent { + + // static BACKUP_RESTORE_PARAM = 'backup'; + + public serviceType: string; + public tileSelectorConfig: ITileConfig[]; + + set selectedTile(tile: ITileConfig) { + if (tile) { + const url = 'endpoints/backup-restore/' + tile.data.type; + this.store.dispatch(new RouterNav({ path: url })); + } + } + + constructor( + private store: Store) { + this.tileSelectorConfig = [ + new ITileConfig( + 'Backup', + { matIcon: 'cloud_download' }, + { type: 'backup' } + ), + new ITileConfig( + 'Restore', + { matIcon: 'cloud_upload' }, + { type: 'restore' } + ) + ]; + } + +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts new file mode 100644 index 0000000000..ca3daa19b9 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts @@ -0,0 +1,76 @@ +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { BehaviorSubject, Observable } from 'rxjs'; + +import { GeneralEntityAppState } from '../../../../../store/src/app-state'; +import { BrowserStandardEncoder } from '../../../helper'; +import { BackupRestoreEndpointService } from './backup-restore-endpoints.service'; + +interface RestoreEndpointsData { + data: string; + password: string; +} + +@Injectable() +export class RestoreEndpointsService extends BackupRestoreEndpointService { + + validFile = new BehaviorSubject(false); + validFile$ = this.validFile.asObservable(); + password: string; // TODO: RC use set password in both services + fileName: string; + private fileContent: string; + + constructor( + private store: Store, + private http: HttpClient + ) { + super(); + } + + setFile(file): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + const res = reader.result as string; + this.setFileResult(res, file.name); + resolve(res); + }; + reader.onerror = () => this.setFileResult(null, null); + reader.onabort = () => this.setFileResult(null, null); + reader.readAsText(file); + }); + } + + private setFileResult(content: string, fileName: string) { + if (!!content) { + this.validFile.next(true); + this.fileName = fileName; + this.fileContent = content; + } else { + this.validFile.next(false); + this.fileName = ''; + this.fileContent = ''; + } + } + + + restoreBackup(): Observable { + const url = '/pp/v1/endpoints/restore'; + const fromObject = {}; + const params: HttpParams = new HttpParams({ + fromObject, + encoder: new BrowserStandardEncoder() + }); + return this.http.post(url, this.createBodyToSend(), { + params + }); + } + + createBodyToSend(): RestoreEndpointsData { + return { + data: this.fileContent, + password: this.password + }; + } +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html new file mode 100644 index 0000000000..7b9ef8f1f0 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html @@ -0,0 +1,27 @@ + +

Restore Endpoints

+
+ + + +
+

Provide the backup file to restore from.

+
+ Choose + + {{service.fileName}} +
+
+
+ +
+

Provide the password that was given at the time the backup was created

+
+ + + +
+
+
+
\ No newline at end of file diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss new file mode 100644 index 0000000000..89184f73a4 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss @@ -0,0 +1,18 @@ +:host { + flex: 1; +} +.file-step { + display: flex; + flex-direction: column; + &__input { + &--input { + height: 0; + visibility: hidden; + width: 0; + } + button { + margin-right: 5px; + } + } + +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts new file mode 100644 index 0000000000..b260285638 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RestoreEndpointsComponent } from './restore-endpoints.component'; + +describe('RestoreEndpointsComponent', () => { + let component: RestoreEndpointsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RestoreEndpointsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RestoreEndpointsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); 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 new file mode 100644 index 0000000000..0bfb63a132 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.ts @@ -0,0 +1,176 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { Observable, of, Subject } from 'rxjs'; +import { first, map, tap } from 'rxjs/operators'; + +import { AppState } from '../../../../../../store/src/app-state'; +import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; +import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; +import { getEventFiles } from '../../../../core/browser-helper'; +import { ConfirmationDialogConfig } from '../../../../shared/components/confirmation-dialog.config'; +import { ConfirmationDialogService } from '../../../../shared/components/confirmation-dialog.service'; +import { ITableListDataSource } from '../../../../shared/components/list/data-sources-controllers/list-data-source-types'; +import { ITableColumn } from '../../../../shared/components/list/list-table/table.types'; +import { StepOnNextFunction, StepOnNextResult } from '../../../../shared/components/stepper/step/step.component'; +import { BackupRestoreCellComponent } from '../backup-restore-cell/backup-restore-cell.component'; +import { BackupEndpointTypes } from '../backup-restore-endpoints.service'; +import { RestoreEndpointsService } from '../restore-endpoints.service'; + + +@Component({ + selector: 'app-restore-endpoints', + templateUrl: './restore-endpoints.component.html', + styleUrls: ['./restore-endpoints.component.scss'], + providers: [ + RestoreEndpointsService + ] +}) +export class RestoreEndpointsComponent implements OnInit { + + // Step 1 + columns: ITableColumn[] = [ + { + columnId: 'name', + headerCell: () => 'Name', + cellDefinition: { + valuePath: 'name' + } + }, + { + columnId: 'endpoint', + headerCell: () => 'Restore', + cellComponent: BackupRestoreCellComponent, + cellConfig: { + type: BackupEndpointTypes.ENDPOINT, + + } + }, + { + columnId: 'connect', + headerCell: () => 'Include Connection', + cellComponent: BackupRestoreCellComponent, + cellConfig: { + type: BackupEndpointTypes.CONNECT + } + }, + // TODO: RC disable backup token if unconnectable + ]; + endpointDataSource: ITableListDataSource; + fileValid$: Observable; + fileName: string; + + // Step 2 + passwordValid$: Observable; + passwordForm: FormGroup; + + constructor( + public service: RestoreEndpointsService, + store: Store, + paginationMonitorFactory: PaginationMonitorFactory, + private confirmDialog: ConfirmationDialogService, + ) { + + // const endpoints$ = of([]); + // this.endpointDataSource = { + // isTableLoading$: of(false), + // connect: () => endpoints$.pipe( + // map(endpoints => endpoints.sort((a, b) => a.name.localeCompare(b.name))) + // ), + // disconnect: () => { }, + // trackBy: (index, row) => row.guid + // }; + + this.setupFileStep(); + + this.setupPasswordStep(); + + } + + setupFileStep() { + this.fileValid$ = this.service.validFile$; + } + + setupPasswordStep() { + this.passwordForm = new FormGroup({ + password: new FormControl('', [Validators.required]), + }); + this.passwordValid$ = this.passwordForm.statusChanges.pipe( + map(() => { + this.service.password = this.passwordForm.controls.password.value; + return this.passwordForm.valid; + }) + ); + } + + ngOnInit() { + } + + onFileChange(event) { + const files = getEventFiles(event); + if (!files.length) { + return; + } + const file = files[0]; + console.log(event, file); + this.service.setFile(file); + + // console.log(files); + // TODO: RC file load - get content of file + // TODO: RC file load - validate correct file + // TODO: RC file load - parse file + // TODO: RC file load - enable next step + + + // const utils = new DeployApplicationFsUtils(); + // utils.handleFileInputSelection(files).pipe( + // filter(res => !!res), + // first() + // ).subscribe((res) => { + // this.propagateChange(res); + // this.sourceData$.next(res); + // }); + } + + restore: StepOnNextFunction = () => { + const confirmation = new ConfirmationDialogConfig( + 'Restore', + 'This will overwrite any matching endpoints and connection details', + 'Continue', + true + ); + const result = new Subject(); + + const userCancelledDialog = () => { + result.next({ + success: false + }); + }; + + const restoreSuccess = data => { + result.next({ + success: true, + redirect: true, + }); + }; + + const backupFailure = err => { + const errorMessage = this.service.createError(err); + result.next({ + success: false, + message: `Failed to restore backup` + (errorMessage ? `: ${errorMessage}` : '') + }); + return of(false); + }; + // TODO: RC make generic in base + + const createBackup = () => this.service.restoreBackup().pipe(first()).subscribe(restoreSuccess, backupFailure); + + // TODO: RC tie in progress indicator (not sure if possible) + this.confirmDialog.openWithCancel(confirmation, createBackup, userCancelledDialog); + + // TODO: RC Remove console.log + return result.asObservable().pipe(tap(console.log)); + } + +} diff --git a/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts b/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts index b68dec67b8..c3704479ff 100644 --- a/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts +++ b/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts @@ -1,16 +1,22 @@ -import { EditEndpointStepComponent } from './edit-endpoint/edit-endpoint-step/edit-endpoint-step.component'; import { NgModule } from '@angular/core'; import { CoreModule } from '../../core/core.module'; import { SharedModule } from '../../shared/shared.module'; +import { BackupEndpointsComponent } from './backup-restore/backup-endpoints/backup-endpoints.component'; +import { BackupRestoreCellComponent } from './backup-restore/backup-restore-cell/backup-restore-cell.component'; +import { + BackupRestoreEndpointsComponent, +} from './backup-restore/backup-restore-endpoints/backup-restore-endpoints.component'; +import { RestoreEndpointsComponent } from './backup-restore/restore-endpoints/restore-endpoints.component'; import { CredentialsAuthFormComponent } from './connect-endpoint-dialog/auth-forms/credentials-auth-form.component'; import { NoneAuthFormComponent } from './connect-endpoint-dialog/auth-forms/none-auth-form.component'; import { SSOAuthFormComponent } from './connect-endpoint-dialog/auth-forms/sso-auth-form.component'; import { ConnectEndpointDialogComponent } from './connect-endpoint-dialog/connect-endpoint-dialog.component'; import { CreateEndpointModule } from './create-endpoint/create-endpoint.module'; +import { EditEndpointStepComponent } from './edit-endpoint/edit-endpoint-step/edit-endpoint-step.component'; +import { EditEndpointComponent } from './edit-endpoint/edit-endpoint.component'; import { EndpointsPageComponent } from './endpoints-page/endpoints-page.component'; import { EndpointsRoutingModule } from './endpoints.routing'; -import { EditEndpointComponent } from './edit-endpoint/edit-endpoint.component'; @NgModule({ imports: [ @@ -27,12 +33,17 @@ import { EditEndpointComponent } from './edit-endpoint/edit-endpoint.component'; NoneAuthFormComponent, EditEndpointComponent, EditEndpointStepComponent, + BackupRestoreEndpointsComponent, + BackupEndpointsComponent, + RestoreEndpointsComponent, + BackupRestoreCellComponent, ], entryComponents: [ ConnectEndpointDialogComponent, CredentialsAuthFormComponent, SSOAuthFormComponent, - NoneAuthFormComponent + NoneAuthFormComponent, + BackupRestoreCellComponent ] }) export class EndpointsModule { } diff --git a/src/frontend/packages/core/src/features/endpoints/endpoints.routing.ts b/src/frontend/packages/core/src/features/endpoints/endpoints.routing.ts index 2b9fcb25c4..194357b894 100644 --- a/src/frontend/packages/core/src/features/endpoints/endpoints.routing.ts +++ b/src/frontend/packages/core/src/features/endpoints/endpoints.routing.ts @@ -4,12 +4,17 @@ import { RouterModule, Routes } from '@angular/router'; import { DynamicExtensionRoutes } from '../../core/extension/dynamic-extension-routes'; import { StratosActionType } from '../../core/extension/extension-service'; import { PageNotFoundComponentComponent } from '../../core/page-not-found-component/page-not-found-component.component'; +import { BackupEndpointsComponent } from './backup-restore/backup-endpoints/backup-endpoints.component'; +import { + BackupRestoreEndpointsComponent, +} from './backup-restore/backup-restore-endpoints/backup-restore-endpoints.component'; +import { RestoreEndpointsComponent } from './backup-restore/restore-endpoints/restore-endpoints.component'; import { CreateEndpointBaseStepComponent, } from './create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component'; import { CreateEndpointComponent } from './create-endpoint/create-endpoint.component'; -import { EndpointsPageComponent } from './endpoints-page/endpoints-page.component'; import { EditEndpointComponent } from './edit-endpoint/edit-endpoint.component'; +import { EndpointsPageComponent } from './endpoints-page/endpoints-page.component'; const endpointsRoutes: Routes = [ { @@ -34,6 +39,18 @@ const endpointsRoutes: Routes = [ path: 'edit/:id', component: EditEndpointComponent }, + { + path: 'backup-restore', + component: BackupRestoreEndpointsComponent + }, + { + path: 'backup-restore/backup', + component: BackupEndpointsComponent + }, + { + path: 'backup-restore/restore', + component: RestoreEndpointsComponent + }, { path: '**', component: PageNotFoundComponentComponent, 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 2b101101aa..d27c1f175f 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 @@ -55,6 +55,7 @@ export const listTableCells: Type>[] = [ TableCellFavoriteComponent, TableCellEndpointDetailsComponent, TableCellSidePanelComponent, + // BackupRestoreCellComponent, ...coreEndpointListDetailsComponents ]; 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 6955532041..429f68fafd 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 @@ -1,18 +1,22 @@ import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; +import { of } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; -import { EndpointModel } from '../../../../../../../store/src/types/endpoint.types'; import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { getFullEndpointApiUrl } from '../../../../../features/endpoints/endpoint-helpers'; 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 { AuthState } from '../../../../../../../store/src/reducers/auth.reducer'; +import { EndpointModel } from '../../../../../../../store/src/types/endpoint.types'; +import { getFullEndpointApiUrl } from '../../../../../features/endpoints/endpoint-helpers'; import { FavoritesConfigMapper } from '../../../favorites-meta-card/favorite-config-mapper'; import { createTableColumnFavorite } from '../../list-table/table-cell-favorite/table-cell-favorite.component'; import { ITableColumn } from '../../list-table/table.types'; -import { IListAction, IListConfig, ListViewTypes } from '../../list.component.types'; +import { IGlobalListAction, IListAction, IListConfig, ListViewTypes } from '../../list.component.types'; import { EndpointCardComponent } from './endpoint-card/endpoint-card.component'; import { EndpointListHelper } from './endpoint-list.helpers'; import { EndpointsDataSource } from './endpoints-data-source'; @@ -28,7 +32,18 @@ export class EndpointsListConfigService implements IListConfig { private singleActions: IListAction[]; - private globalActions = []; + private globalActions: IGlobalListAction[] = [{ + action: () => this.router.navigate(['endpoints/backup-restore']), + icon: 'settings_backup_restore', + label: 'Backup/Restore Endpoints', + description: 'Backup or Restore Endpoints', + visible$: this.store.select(s => s.auth).pipe( + filter(auth => !!auth && !!auth.sessionData), + map((auth: AuthState) => auth.sessionData), + map(session => session.user && session.user.admin) + ), + enabled$: of(true), // Table is not shown when there's no endpoints, so this should always be true + }]; public readonly columns: ITableColumn[] = [ { @@ -109,7 +124,7 @@ export class EndpointsListConfigService implements IListConfig { internalEventMonitorFactory: InternalEventMonitorFactory, endpointListHelper: EndpointListHelper, favoritesConfigMapper: FavoritesConfigMapper, - + private router: Router ) { this.singleActions = endpointListHelper.endpointActions(); const favoriteCell = createTableColumnFavorite( diff --git a/src/frontend/packages/store/src/actions/endpoint.actions.ts b/src/frontend/packages/store/src/actions/endpoint.actions.ts index 21504086a8..c0a728eb06 100644 --- a/src/frontend/packages/store/src/actions/endpoint.actions.ts +++ b/src/frontend/packages/store/src/actions/endpoint.actions.ts @@ -160,4 +160,4 @@ export class UpdateEndpoint extends EndpointAction { ) { super(); } -} \ No newline at end of file +} diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index 3e01345e77..048a912ce8 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -4,6 +4,7 @@ import ( "crypto/x509" "encoding/json" "fmt" + "io/ioutil" "net/http" "net/url" "strconv" @@ -278,8 +279,8 @@ func marshalClusterList(clusterList []*interfaces.ConnectedEndpoint) ([]byte, er return jsonString, nil } -func (p *portalProxy) UpdateEndointMetadata(guid string, metadata string) error { - log.Debug("UpdateEndointMetadata") +func (p *portalProxy) UpdateEndpointMetadata(guid string, metadata string) error { + log.Debug("UpdateEndpointMetadata") cnsiRepo, err := cnsis.NewPostgresCNSIRepository(p.DatabaseConnectionPool) if err != nil { @@ -635,3 +636,255 @@ func (p *portalProxy) updateEndpoint(c echo.Context) error { return nil } + +// TODO: RC position +type BackupDataRequest struct { + State map[string]BackupEndpointsState `json:"state"` + UserID string `json:"userId"` + Password string `json:"password"` +} + +type BackupEndpointsState struct { + Endpoint bool `json:"endpoint"` + Connect bool `json:"connect"` + AllConnect bool `json:"all_connect"` +} + +type BackupRestoreState struct { + Endpoints []*interfaces.CNSIRecord + Tokens []interfaces.BackupTokenRecord +} + +type RestoreDataRequest struct { + Data string `json:"data"` + Password string `json:"password"` +} + +// TODO: RC split out to new file? +func (p *portalProxy) backupEndpoints(c echo.Context) error { + log.Debug("backupEndpoints") + + // Check we can unmarshall the request + body, err := ioutil.ReadAll(c.Request().Body) + if err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") + } + + data := &BackupDataRequest{} + if err = json.Unmarshal(body, data); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") + } + // log.Infof("BODY: %+v", data) + + if data.State == nil || len(data.State) == 0 { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - no endpoints to backup") + } + + response, err := p.createBackup(data) + if err != nil { + return err + } + + // Send back the response to the client + // TODO: RC Missing client_secret when serialised, `-` in definition + jsonString, err := json.Marshal(response) + if err != nil { + return interfaces.NewHTTPError(http.StatusInternalServerError, "Failed to serialize response") + } + + // Encrypt data (see above) // TODO: RC leave until last + encryptedResponse := jsonString + + // Return data + c.Response().Header().Set("Content-Type", "application/json") + c.Response().Write(encryptedResponse) + return nil +} + +func (p *portalProxy) createBackup(data *BackupDataRequest) (*BackupRestoreState, error) { + log.Debug("createBackup") + allEndpoints, err := p.ListEndpoints() + if err != nil { + return nil, interfaces.NewHTTPError(http.StatusBadGateway, "Failed to fetch endpoints") + } + + // Fetch/Format required data + endpoints := make([]*interfaces.CNSIRecord, 0) + // allTokensFrom := make([]string, 0) + // userTokenFrom := make([]string, 0) + tokens := make([]interfaces.BackupTokenRecord, 0) + + for endpointID, endpoint := range data.State { + + if !endpoint.Endpoint { + continue + } + + for _, e := range allEndpoints { + if endpointID == e.GUID { + endpoints = append(endpoints, e) + break + } + } + + if endpoint.AllConnect { + // allTokensFrom = append(allTokensFrom, endpointID) + if tokenRecords, ok := p.getCNSITokenRecordsBackup(endpointID); ok { + log.Warn("tokens for AllConnect") + tokens = append(tokens, tokenRecords...) + } else { + log.Warn("No tokens for AllConnect") + // TODO: RC + } + } else if endpoint.Connect { + // userTokenFrom = append(userTokenFrom, endpointID) + if tokenRecord, ok := p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { + log.Warn("tokens for Connect") + // var btr BackupTokenRecord + // TODO: RC Q This will be the linked token as if it were the users token + var btr = interfaces.BackupTokenRecord{ + // tokenRecord: tokenRecord, + TokenRecord: tokenRecord, + EndpointGUID: endpointID, + TokenType: "CNSI", + UserGUID: data.UserID, + } + + tokens = append(tokens, btr) + } else { + log.Warnf("No tokens for Connect: %+v,%+v", endpointID, data.UserID) + // TODO: RC + // msg := "Unable to retrieve CNSI token record." + // log.Debug(msg) + // return nil, nil, false + } + } + } + + log.Infof("endpoints: %+v", endpoints) + // log.Infof("allTokensFrom: %+v", allTokensFrom) + // log.Infof("userTokenFrom: %+v", userTokenFrom) + log.Infof("tokens: %+v", tokens) + + response := &BackupRestoreState{ + Endpoints: endpoints, + Tokens: tokens, + } + + return response, nil +} + +// func (p *portalProxy) GetCNSITokens(cnsiGUID string) ([]interfaces.TokenRecord, bool) { +// log.Debug("GetCNSITokens") +// tokenRepo, err := tokens.NewPgsqlTokenRepository(p.DatabaseConnectionPool) +// if err != nil { +// return make([]interfaces.TokenRecord, 0), false +// } + +// trs, err := tokenRepo.FindAllCNSITokenIncludeDisconnected(cnsiGUID, p.Config.EncryptionKeyInBytes) +// if err != nil { +// return make([]interfaces.TokenRecord, 0), false +// } + +// return trs, true +// } + +func (p *portalProxy) getCNSITokenRecordsBackup(endpointID string) ([]interfaces.BackupTokenRecord, bool) { + log.Debug("getCNSITokenRecordsBackup") + tokenRepo, err := tokens.NewPgsqlTokenRepository(p.DatabaseConnectionPool) + if err != nil { + return make([]interfaces.BackupTokenRecord, 0), false + } + + trs, err := tokenRepo.FindAllCNSITokenBackup(endpointID, p.Config.EncryptionKeyInBytes) + if err != nil { + return make([]interfaces.BackupTokenRecord, 0), false + } + + return trs, true +} + +func (p *portalProxy) restoreEndpoints(c echo.Context) error { + log.Debug("restoreEndpoints") + + // Check we can unmarshall the request + body, err := ioutil.ReadAll(c.Request().Body) + if err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") + } + + data := &RestoreDataRequest{} + if err = json.Unmarshal(body, data); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") + } + + backup := &BackupRestoreState{} + if err = json.Unmarshal([]byte(data.Data), backup); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid backup - could not parse JSON") + } + + err = p.restoreBackup(backup) + if err != nil { + return err + } + + // log.Warnf("BACKUP DATA: %+v", backup) + c.Response().WriteHeader(http.StatusOK) + return nil + +} + +func (p *portalProxy) restoreBackup(backup *BackupRestoreState) error { + log.Debug("restoreBackup") + cnsiRepo, err := cnsis.NewPostgresCNSIRepository(p.DatabaseConnectionPool) + if err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) + } + + for _, endpoint := range backup.Endpoints { + if err := cnsiRepo.Overwrite(*endpoint, p.Config.EncryptionKeyInBytes); err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", endpoint.Name) + } + } + + tokenRepo, err := tokens.NewPgsqlTokenRepository(p.DatabaseConnectionPool) + if err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) + } + + for _, tr := range backup.Tokens { + if err := tokenRepo.SaveCNSIToken(tr.EndpointGUID, tr.UserGUID, tr.TokenRecord, p.Config.EncryptionKeyInBytes); err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite token", "Failed to overwrite token: %+v", tr.TokenRecord.TokenGUID) + } + } + + return nil +} + +// find := func(a interfaces.CNSIRecord) bool { +// return endpointID == a.GUID +// } + +// endpointPos := sliceContainsFn(find, allEndpoints) +// if endpointPos >= 0 { +// endpoints = append(endpoints, endpoints[endpointPos]) +// } + +// // TODO:RC pos +// func sliceContains(what interface{}, where []interface{}) (idx int) { +// for i, v := range where { +// if v == what { +// return i +// } +// } +// return -1 +// } + +// func sliceContainsFn(is func(a interface{}) bool, where []interface{}) (idx int) { +// for i, v := range where { +// if is(v) { +// return i +// } +// } +// return -1 +// } diff --git a/src/jetstream/main.go b/src/jetstream/main.go index 9b649da31d..ea8da57516 100644 --- a/src/jetstream/main.go +++ b/src/jetstream/main.go @@ -973,6 +973,10 @@ func (p *portalProxy) registerRoutes(e *echo.Echo, needSetupMiddleware bool) { // Apply edits for the given endpoint adminGroup.POST("/endpoint/:id", p.updateEndpoint) + // TODO: RC Q better as `/backup` & `/restore`? + adminGroup.POST("/endpoints/backup", p.backupEndpoints) + adminGroup.POST("/endpoints/restore", p.restoreEndpoints) + adminGroup.POST("/unregister", p.unregisterCluster) // sessionGroup.DELETE("/cnsis", p.removeCluster) diff --git a/src/jetstream/repository/cnsis/cnsis.go b/src/jetstream/repository/cnsis/cnsis.go index d18ddda5ef..b1e5bcc4bc 100644 --- a/src/jetstream/repository/cnsis/cnsis.go +++ b/src/jetstream/repository/cnsis/cnsis.go @@ -14,6 +14,7 @@ type Repository interface { Save(guid string, cnsiRecord interfaces.CNSIRecord, encryptionKey []byte) error Update(endpoint interfaces.CNSIRecord, encryptionKey []byte) error UpdateMetadata(guid string, metadata string) error + Overwrite(endpoint interfaces.CNSIRecord, encryptionKey []byte) error } type Endpoint interface { diff --git a/src/jetstream/repository/cnsis/pgsql_cnsis.go b/src/jetstream/repository/cnsis/pgsql_cnsis.go index 7d8db3b2ff..6ba5344004 100644 --- a/src/jetstream/repository/cnsis/pgsql_cnsis.go +++ b/src/jetstream/repository/cnsis/pgsql_cnsis.go @@ -38,6 +38,8 @@ var updateCNSI = `UPDATE cnsis SET name = $1, skip_ssl_validation = $2, sso_allo // Update the metadata var updateCNSIMetadata = `UPDATE cnsis SET meta_data = $1 WHERE guid = $2` +var countCNSI = `SELECT COUNT(*) FROM cnsis WHERE guid=$1` + // PostgresCNSIRepository is a PostgreSQL-backed CNSI repository type PostgresCNSIRepository struct { db *sql.DB @@ -349,3 +351,33 @@ func (p *PostgresCNSIRepository) UpdateMetadata(guid string, metadata string) er return nil } + +// Overwrite - Creates or Updates CNSI Record +func (p *PostgresCNSIRepository) Overwrite(endpoint interfaces.CNSIRecord, encryptionKey []byte) error { + log.Debug("Overwrite CNSI") + + // Is there an existing token? + var count int + err := p.db.QueryRow(countCNSI, endpoint.GUID).Scan(&count) + if err != nil { + log.Errorf("Unknown error attempting to find CNSI: %v", err) + } + + // if _, err := p.Find(endpoint.GUID, encryptionKey); err != nil { + // // Found, so update endpoint + // // TODO: RC ALL STRINGS? + // return p.Update(endpoint, encryptionKey) + // } else { + // // Not Found, create endpoint + // return p.Save(endpoint.GUID, endpoint, encryptionKey) + // // TODO: RC Q could actually be error + // } + + switch count { + case 0: + return p.Save(endpoint.GUID, endpoint, encryptionKey) + default: + + return p.Update(endpoint, encryptionKey) + } +} diff --git a/src/jetstream/repository/interfaces/portal_proxy.go b/src/jetstream/repository/interfaces/portal_proxy.go index d965601156..4f7ec4eefd 100644 --- a/src/jetstream/repository/interfaces/portal_proxy.go +++ b/src/jetstream/repository/interfaces/portal_proxy.go @@ -44,7 +44,7 @@ type PortalProxy interface { Env() *env.VarSet ListEndpointsByUser(userGUID string) ([]*ConnectedEndpoint, error) ListEndpoints() ([]*CNSIRecord, error) - UpdateEndointMetadata(guid string, metadata string) error + UpdateEndpointMetadata(guid string, metadata string) error // UAA Token GetUAATokenRecord(userGUID string) (TokenRecord, error) diff --git a/src/jetstream/repository/interfaces/structs.go b/src/jetstream/repository/interfaces/structs.go index 041f2ebea0..bdca5a0493 100644 --- a/src/jetstream/repository/interfaces/structs.go +++ b/src/jetstream/repository/interfaces/structs.go @@ -85,13 +85,21 @@ const ( AuthConnectTypeNone = "none" ) -// Token record for an endpoint (includes the Endpoint GUID) -type EndpointTokenRecord struct { - *TokenRecord - EndpointGUID string - EndpointType string - APIEndpint string - LoggingEndpoint string +// // Token record for an endpoint (includes the Endpoint GUID) +// type EndpointTokenRecord struct { +// *TokenRecord +// EndpointGUID string +// EndpointType string +// APIEndpint string +// LoggingEndpoint string +// } + +// BackupTokenRecord used when backing up tokens +type BackupTokenRecord struct { + TokenRecord TokenRecord + UserGUID string + EndpointGUID string + TokenType string } // TokenRecord repsrents and endpoint or uaa token diff --git a/src/jetstream/repository/tokens/pgsql_tokens.go b/src/jetstream/repository/tokens/pgsql_tokens.go index 37e715551c..ddb7dfc3f3 100644 --- a/src/jetstream/repository/tokens/pgsql_tokens.go +++ b/src/jetstream/repository/tokens/pgsql_tokens.go @@ -43,6 +43,19 @@ var findCNSITokenConnected = `SELECT token_guid, auth_token, refresh_token, toke FROM tokens WHERE cnsi_guid = $1 AND (user_guid = $2 OR user_guid = $3) AND token_type = 'cnsi' AND disconnected = '0'` +// TODO: RC +var findAllCNSIToken2 = `SELECT token_guid, auth_token, refresh_token, token_expiry, disconnected, auth_type, meta_data, user_guid, linked_token + FROM tokens + WHERE cnsi_guid = $1 AND token_type = 'cnsi'` + +var findAllCNSITokenConnected = `SELECT token_guid, auth_token, refresh_token, token_expiry, disconnected, auth_type, meta_data, user_guid, linked_token + FROM tokens + WHERE cnsi_guid = $1 AND token_type = 'cnsi' AND disconnected = '0'` + +var findAllCNSIToken = `SELECT user_guid, token_guid, auth_token, refresh_token, token_expiry, disconnected, auth_type, meta_data, user_guid, linked_token + FROM tokens + WHERE cnsi_guid = $1 AND token_type = 'cnsi'` + var countCNSITokens = `SELECT COUNT(*) FROM tokens WHERE cnsi_guid=$1 AND user_guid = $2 AND token_type = 'cnsi'` @@ -82,12 +95,15 @@ func InitRepositoryProvider(databaseProvider string) { updateAuthToken = datastore.ModifySQLStatement(updateAuthToken, databaseProvider) findCNSIToken = datastore.ModifySQLStatement(findCNSIToken, databaseProvider) findCNSITokenConnected = datastore.ModifySQLStatement(findCNSITokenConnected, databaseProvider) + findAllCNSIToken2 = datastore.ModifySQLStatement(findAllCNSIToken2, databaseProvider) + findAllCNSITokenConnected = datastore.ModifySQLStatement(findAllCNSITokenConnected, databaseProvider) countCNSITokens = datastore.ModifySQLStatement(countCNSITokens, databaseProvider) insertCNSIToken = datastore.ModifySQLStatement(insertCNSIToken, databaseProvider) updateCNSIToken = datastore.ModifySQLStatement(updateCNSIToken, databaseProvider) deleteCNSIToken = datastore.ModifySQLStatement(deleteCNSIToken, databaseProvider) deleteCNSITokens = datastore.ModifySQLStatement(deleteCNSITokens, databaseProvider) updateToken = datastore.ModifySQLStatement(updateToken, databaseProvider) + findAllCNSIToken = datastore.ModifySQLStatement(findAllCNSIToken, databaseProvider) } // saveAuthToken - Save the Auth token to the datastore @@ -313,6 +329,129 @@ func (p *PgsqlTokenRepository) SaveCNSIToken(cnsiGUID string, userGUID string, t return nil } +// TODO: RC remove all `all` +func (p *PgsqlTokenRepository) FindAllCNSIToken(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) { + log.Debug("FindAllCNSIToken") + return p.findAllCNSIToken(cnsiGUID, encryptionKey, false) +} + +func (p *PgsqlTokenRepository) FindAllCNSITokenIncludeDisconnected(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) { + log.Debug("FindAllCNSITokenIncludeDisconnected") + return p.findAllCNSIToken(cnsiGUID, encryptionKey, true) +} + +func (p *PgsqlTokenRepository) findAllCNSIToken(cnsiGUID string, encryptionKey []byte, includeDisconnected bool) ([]interfaces.TokenRecord, error) { + log.Debug("findAllCNSIToken") + if cnsiGUID == "" { + msg := "Unable to find CNSI Token without a valid CNSI GUID." + log.Debug(msg) + return make([]interfaces.TokenRecord, 0), errors.New(msg) + } + + var rows *sql.Rows + var err error + if includeDisconnected { + rows, err = p.db.Query(findAllCNSIToken, cnsiGUID) + } else { + rows, err = p.db.Query(findAllCNSITokenConnected, cnsiGUID) + } + if err != nil { + msg := "Unable to Find All CNSI tokens: %v" + if err == sql.ErrNoRows { + log.Debugf(msg, err) + } else { + log.Errorf(msg, err) + } + return make([]interfaces.TokenRecord, 0), fmt.Errorf(msg, err) + } + + // TODO: RC Q should this close come before returning? it doesn't in cnsi List(encryptionKey []byte) ([]*interfaces.CNSIRecord, error) { + defer rows.Close() + + trs := make([]interfaces.TokenRecord, 0) + for rows.Next() { + // temp vars to retrieve db data + var ( + tokenGUID sql.NullString + ciphertextAuthToken []byte + ciphertextRefreshToken []byte + tokenExpiry sql.NullInt64 + disconnected bool + authType string + metadata sql.NullString + tokenUserGUID sql.NullString + linkedTokenGUID sql.NullString + ) + err = rows.Scan(&tokenGUID, &ciphertextAuthToken, &ciphertextRefreshToken, &tokenExpiry, &disconnected, &authType, &metadata, &tokenUserGUID, &linkedTokenGUID) + if err != nil { + return nil, fmt.Errorf("Unable to scan CNSI records: %v", err) + } + + log.Debug("Decrypting Auth Token") + plaintextAuthToken, err := crypto.DecryptToken(encryptionKey, ciphertextAuthToken) + if err != nil { + return make([]interfaces.TokenRecord, 0), err + } + + log.Debug("Decrypting Refresh Token") + plaintextRefreshToken, err := crypto.DecryptToken(encryptionKey, ciphertextRefreshToken) + if err != nil { + return make([]interfaces.TokenRecord, 0), err + } + + // Build a new TokenRecord based on the decrypted tokens + tr := new(interfaces.TokenRecord) + if tokenGUID.Valid { + tr.TokenGUID = tokenGUID.String + } + tr.AuthToken = plaintextAuthToken + tr.RefreshToken = plaintextRefreshToken + if tokenExpiry.Valid { + tr.TokenExpiry = tokenExpiry.Int64 + } + tr.Disconnected = disconnected + tr.AuthType = authType + if metadata.Valid { + tr.Metadata = metadata.String + } + if tokenUserGUID.Valid { + tr.SystemShared = tokenUserGUID.String == SystemSharedUserGuid + } + if linkedTokenGUID.Valid { + tr.LinkedGUID = linkedTokenGUID.String + } + + trs = append(trs, *tr) + + } + + // TODO: RC merge with find single + // TODO: RC Use? + // // If this token is linked - fetch that token and use it instead + // // Currently we don't recurse - we only support one level of linked token - you can't link to another linked token + // if linkedTokenGUID.Valid { + // if includeDisconnected { + // err = p.db.QueryRow(getToken, userGUID, linkedTokenGUID.String).Scan(&tokenGUID, &ciphertextAuthToken, &ciphertextRefreshToken, &tokenExpiry, &disconnected, &authType, &metadata, &tokenUserGUID, &linkedTokenGUID) + // } else { + // err = p.db.QueryRow(getTokenConnected, userGUID, linkedTokenGUID.String).Scan(&tokenGUID, &ciphertextAuthToken, &ciphertextRefreshToken, &tokenExpiry, &disconnected, &authType, &metadata, &tokenUserGUID, &linkedTokenGUID) + // } + + // if err != nil { + // msg := "Unable to Find CNSI token: %v" + // if err == sql.ErrNoRows { + // log.Debugf(msg, err) + // } else { + // log.Errorf(msg, err) + // } + // return interfaces.TokenRecord{}, fmt.Errorf(msg, err) + // } + // } + + // TODO: RC Finish off + + return trs, nil +} + func (p *PgsqlTokenRepository) FindCNSIToken(cnsiGUID string, userGUID string, encryptionKey []byte) (interfaces.TokenRecord, error) { log.Debug("FindCNSIToken") return p.findCNSIToken(cnsiGUID, userGUID, encryptionKey, false) @@ -323,6 +462,97 @@ func (p *PgsqlTokenRepository) FindCNSITokenIncludeDisconnected(cnsiGUID string, return p.findCNSIToken(cnsiGUID, userGUID, encryptionKey, true) } +func (p *PgsqlTokenRepository) FindAllCNSITokenBackup(cnsiGUID string, encryptionKey []byte) ([]interfaces.BackupTokenRecord, error) { + log.Debug("FindAllCNSITokenBackup") + if cnsiGUID == "" { + msg := "Unable to find CNSI Token without a valid CNSI GUID." + log.Debug(msg) + return make([]interfaces.BackupTokenRecord, 0), errors.New(msg) + } + + var rows *sql.Rows + var err error + rows, err = p.db.Query(findAllCNSIToken, cnsiGUID) + if err != nil { + msg := "Unable to Find All CNSI tokens: %v" + if err == sql.ErrNoRows { + log.Debugf(msg, err) + } else { + log.Errorf(msg, err) + } + return make([]interfaces.BackupTokenRecord, 0), fmt.Errorf(msg, err) + } + + // TODO: RC Q should this close come before returning? it doesn't in cnsi List(encryptionKey []byte) ([]*interfaces.CNSIRecord, error) { + defer rows.Close() + + btrs := make([]interfaces.BackupTokenRecord, 0) + for rows.Next() { + // temp vars to retrieve db data + var ( + userGUID string + tokenGUID sql.NullString + ciphertextAuthToken []byte + ciphertextRefreshToken []byte + tokenExpiry sql.NullInt64 + disconnected bool + authType string + metadata sql.NullString + tokenUserGUID sql.NullString + linkedTokenGUID sql.NullString + ) + err = rows.Scan(&userGUID, &tokenGUID, &ciphertextAuthToken, &ciphertextRefreshToken, &tokenExpiry, &disconnected, &authType, &metadata, &tokenUserGUID, &linkedTokenGUID) + if err != nil { + return nil, fmt.Errorf("Unable to scan CNSI records: %v", err) + } + + log.Debug("Decrypting Auth Token") + plaintextAuthToken, err := crypto.DecryptToken(encryptionKey, ciphertextAuthToken) + if err != nil { + return make([]interfaces.BackupTokenRecord, 0), err + } + + log.Debug("Decrypting Refresh Token") + plaintextRefreshToken, err := crypto.DecryptToken(encryptionKey, ciphertextRefreshToken) + if err != nil { + return make([]interfaces.BackupTokenRecord, 0), err + } + + // Build a new TokenRecord based on the decrypted tokens + tr := new(interfaces.TokenRecord) + if tokenGUID.Valid { + tr.TokenGUID = tokenGUID.String + } + tr.AuthToken = plaintextAuthToken + tr.RefreshToken = plaintextRefreshToken + if tokenExpiry.Valid { + tr.TokenExpiry = tokenExpiry.Int64 + } + tr.Disconnected = disconnected + tr.AuthType = authType + if metadata.Valid { + tr.Metadata = metadata.String + } + if tokenUserGUID.Valid { + tr.SystemShared = tokenUserGUID.String == SystemSharedUserGuid + } + if linkedTokenGUID.Valid { + tr.LinkedGUID = linkedTokenGUID.String + } + + btr := new(interfaces.BackupTokenRecord) + btr.TokenRecord = *tr + btr.EndpointGUID = cnsiGUID + btr.TokenType = "cnsi" + btr.UserGUID = userGUID + + btrs = append(btrs, *btr) + + } + + return btrs, nil +} + func (p *PgsqlTokenRepository) findCNSIToken(cnsiGUID string, userGUID string, encryptionKey []byte, includeDisconnected bool) (interfaces.TokenRecord, error) { log.Debug("findCNSIToken") if cnsiGUID == "" { @@ -545,3 +775,17 @@ func (p *PgsqlTokenRepository) UpdateTokenAuth(userGUID string, tr interfaces.To return nil } + +// func (p *PgsqlTokenRepository) Overwrite(tr interfaces.TokenRecord, encryptionKey []byte) error { +// log.Debug("Overwrite Token") + +// if _, err := p.FindCNSITokenIncludeDisconnected(endpointGuid, userGuid, encryptionKey); err != nil { +// // Found, so update endpoint +// // TODO: RC ALL STRINGS? +// return p. Update(endpoint, encryptionKey) +// } else { +// // Not Found, create endpoint +// return p.SaveCNSIToken(endpointGuid, userGuid, tr, encryptionKey) +// // TODO: RC Q could actually be error +// } +// } diff --git a/src/jetstream/repository/tokens/tokens.go b/src/jetstream/repository/tokens/tokens.go index 05384df430..354baa58b6 100644 --- a/src/jetstream/repository/tokens/tokens.go +++ b/src/jetstream/repository/tokens/tokens.go @@ -18,6 +18,9 @@ type Repository interface { FindCNSIToken(cnsiGUID string, userGUID string, encryptionKey []byte) (interfaces.TokenRecord, error) FindCNSITokenIncludeDisconnected(cnsiGUID string, userGUID string, encryptionKey []byte) (interfaces.TokenRecord, error) + FindAllCNSIToken(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) + FindAllCNSITokenIncludeDisconnected(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) + FindAllCNSITokenBackup(cnsiGUID string, encryptionKey []byte) ([]interfaces.BackupTokenRecord, error) DeleteCNSIToken(cnsiGUID string, userGUID string) error DeleteCNSITokens(cnsiGUID string) error SaveCNSIToken(cnsiGUID string, userGUID string, tokenRecord interfaces.TokenRecord, encryptionKey []byte) error diff --git a/src/jetstream/stringutils/utils.go b/src/jetstream/stringutils/utils.go index 2ea9baa5cb..b34c4c22ec 100644 --- a/src/jetstream/stringutils/utils.go +++ b/src/jetstream/stringutils/utils.go @@ -1,9 +1,9 @@ package stringutils import ( + "net/url" "strings" "unicode" - "net/url" ) // ArrayContainsString checks the string array to see if it contains the specifed value From 354aa08eecc7e656e002ffa304a06e117751e448 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Thu, 9 Apr 2020 16:05:00 +0100 Subject: [PATCH 014/176] E2E test fix --- protractor.conf.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/protractor.conf.js b/protractor.conf.js index 5c7242d12d..8595858cf8 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -179,6 +179,11 @@ const config = { // upload_throughput: 500 * 1024 * 1024 // Maximal aggregated upload throughput. // }); + // Ensuer base URL does NOT end with a / + if (browser.baseUrl.endsWith('/')) { + browser.baseUrl = browser.baseUrl.substr(0, browser.baseUrl.length -1); + } + skipPlugin.install(jasmine); require('ts-node').register({ project: 'src/test-e2e/tsconfig.e2e.json' From 77628e8ce623aea0f44b0abde1d1ddcd799c1bfc Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Fri, 10 Apr 2020 12:10:43 +0100 Subject: [PATCH 015/176] Fix mat-select option selection for e2e tests --- protractor.conf.js | 5 ++++- src/test-e2e/po/component.po.ts | 14 ++++++++++++-- src/test-e2e/po/form.po.ts | 30 +++++++++++++++++------------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/protractor.conf.js b/protractor.conf.js index 8595858cf8..dd282d35ae 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -199,7 +199,10 @@ const config = { }).getJasmine2Reporter()); jasmine.getEnv().addReporter(new SpecReporter({ spec: { - displayStacktrace: true, + displayStacktrace: 'pretty', + }, + summary: { + displayStacktrace: 'pretty', }, customProcessors: specReporterCustomProcessors })); diff --git a/src/test-e2e/po/component.po.ts b/src/test-e2e/po/component.po.ts index 2f1c9ab62c..32149348fb 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): promise.Promise { + const comp = new Component(elm); + return comp.waitUntilShown(); + } + public static waitUntilNotShown(elm): promise.Promise { - return browser.wait(until.invisibilityOf(elm), 5000); + const comp = new Component(elm); + return comp.waitUntilNotShown(); } 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 292ec3b189..f9697d2e42 100644 --- a/src/test-e2e/po/form.po.ts +++ b/src/test-e2e/po/form.po.ts @@ -20,9 +20,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; @@ -223,18 +223,22 @@ export class FormComponent extends Component { ctrl.sendKeys(Key.ESCAPE); break; } - 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 - const containsSpace = strValue.indexOf(' '); - if (containsSpace >= 0) { - strValue = strValue.slice(0, containsSpace); - } + + // Options are presented in a .mat-select-panel + // Open the selector ctrl.click(); - ctrl.sendKeys(strValue); - ctrl.sendKeys(Key.RETURN); + const selectMenu = new Component(element(by.css('.mat-select-panel'))); + selectMenu.waitUntilShown(); + selectMenu.all(by.tagName('mat-option')).map(this.mapField).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); } From 0efa6dc79fbf807d084a70198f17cdb8385a33d5 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Fri, 10 Apr 2020 14:20:47 +0100 Subject: [PATCH 016/176] Fix git ignore with secrets.yaml --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ed422405e2..fc81bdc82b 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 From da8a57d771e1ef9a026b9e542f695ad28a7aca8b Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Fri, 10 Apr 2020 14:22:43 +0100 Subject: [PATCH 017/176] Update angular to fix prod build issue --- package-lock.json | 1258 ++++++++++++++++++++++++++------------------- package.json | 44 +- 2 files changed, 761 insertions(+), 541 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4471d07a75..e17ce6468b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,12 +5,12 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.0.tgz", - "integrity": "sha512-SlqEBkPrT40zMCy5344AsUqC76pEPCaGPaAkCIvadaz2dC9vNMzQrvubCPJHViD/TumkSX1kYmLS3iYASVM9GQ==", + "version": "0.901.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.1.tgz", + "integrity": "sha512-foWDAurMfBDYLAJxHpTFkJBub1c2A8+eWHbBjgqIHmT8xadnE7t8nSA9XDl+k/kIoWw/qFU+6IttPirudYc/vw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", + "@angular-devkit/core": "9.1.1", "rxjs": "6.5.4" }, "dependencies": { @@ -26,21 +26,21 @@ } }, "@angular-devkit/build-angular": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.0.tgz", - "integrity": "sha512-ftJVNlKvIomqRfr5jFVraPqlLSUJu8YyVbFv/aCsvhNpuZGkYpTOMoJDwyywdslSTH608BIoU63IAnIz9PwUdw==", + "version": "0.901.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.1.tgz", + "integrity": "sha512-6uEvo5htsJoxQHBVwHOGmM6YWq5q6m9UWMv/ughlek0RtSLFfOt9TZQ/yQHgtGQsCQvscD/jBzVoD0zD5Ax/SQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.0", - "@angular-devkit/build-optimizer": "0.901.0", - "@angular-devkit/build-webpack": "0.901.0", - "@angular-devkit/core": "9.1.0", + "@angular-devkit/architect": "0.901.1", + "@angular-devkit/build-optimizer": "0.901.1", + "@angular-devkit/build-webpack": "0.901.1", + "@angular-devkit/core": "9.1.1", "@babel/core": "7.9.0", "@babel/generator": "7.9.3", "@babel/preset-env": "7.9.0", "@babel/template": "7.8.6", "@jsdevtools/coverage-istanbul-loader": "3.0.3", - "@ngtools/webpack": "9.1.0", + "@ngtools/webpack": "9.1.1", "ajv": "6.12.0", "autoprefixer": "9.7.4", "babel-loader": "8.0.6", @@ -82,7 +82,7 @@ "style-loader": "1.1.3", "stylus": "0.54.7", "stylus-loader": "3.0.2", - "terser": "4.6.7", + "terser": "4.6.10", "terser-webpack-plugin": "2.3.5", "tree-kill": "1.2.2", "webpack": "4.42.0", @@ -94,6 +94,12 @@ "worker-plugin": "4.0.2" }, "dependencies": { + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -143,16 +149,35 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true + }, + "terser": { + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", + "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } } } }, "@angular-devkit/build-ng-packagr": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.0.tgz", - "integrity": "sha512-cUQKK7+bYi3fOmq41cfr1ZFQwqAUUm0Yz7DgH34Ek7D98XudNOxJ63Xv4manId528WhqyGDP5/2tut7QNV3VJA==", + "version": "0.901.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.1.tgz", + "integrity": "sha512-shoWppF08glJmfZV3NdZ48MMjZWETAaiZHGV/TBWzgr3O84Sl6juauqeApHZW27inpjEqyJUktp3PA7eMnpeag==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.0", + "@angular-devkit/architect": "0.901.1", "rxjs": "6.5.4" }, "dependencies": { @@ -168,15 +193,15 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.0.tgz", - "integrity": "sha512-Y9sz8uf2zjilhPUVYb0K9Mio6c1d5c+csuDc15CCKzELXJwyyDxilIFgn6Eu+edM0HNQGzbIwkjy4DkR9mtuTQ==", + "version": "0.901.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.1.tgz", + "integrity": "sha512-o0A9CcyDQSUnC5CQIKf92VH8amIYRYrMgLf2kdhSMcy0QV+rEJyN81dSvwX/Yxgnr9NbWEAQg7jnyKk06vfhOw==", "dev": true, "requires": { "loader-utils": "2.0.0", "source-map": "0.7.3", "tslib": "1.11.1", - "typescript": "3.8.3", + "typescript": "3.6.5", "webpack-sources": "1.4.3" }, "dependencies": { @@ -185,17 +210,23 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true + }, + "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.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.0.tgz", - "integrity": "sha512-Oze0VzIvHnoW12C80fiNH4HBu/GWmhJPXdNA7nRkU/tBQlIKnfngf8rQ0QbgecN2qdEXQpZJsP/XclTi3zugsg==", + "version": "0.901.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.1.tgz", + "integrity": "sha512-9oNI+wPSk8yECy+f0EebfMx4PH3uDJRrifYZAxcr84IpzEbpfpRuYhE3ecwqd7k0zu2Kdjw1uUrGxBuH4/sbGg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.0", - "@angular-devkit/core": "9.1.0", + "@angular-devkit/architect": "0.901.1", + "@angular-devkit/core": "9.1.1", "rxjs": "6.5.4" }, "dependencies": { @@ -211,9 +242,9 @@ } }, "@angular-devkit/core": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.0.tgz", - "integrity": "sha512-vHTsrB4JaVUQ95FRnKrgo79Y3F6FokImrZdrmwkQmwAThpjXeXmpUEKZS+ZSTFRgesjiIysVGOFijARP4BQ7Bg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.1.tgz", + "integrity": "sha512-57MNew2u1QwVb69jxZyhXgdW9kqcGyWyRy2ui/hWCkWLg7RumWtyypmdTs89FNExB4HqtXlQ2eO3JZxfs7QR3w==", "dev": true, "requires": { "ajv": "6.12.0", @@ -241,12 +272,12 @@ } }, "@angular-devkit/schematics": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.0.tgz", - "integrity": "sha512-cb9PSvskMwWlL54fPfCcpJoyNDWAX6Wo7CzL5qpIB2cJCPLAuyfRUYYrkO77YUST+n2HvypHz0cZ5SNGMfaaBQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.1.tgz", + "integrity": "sha512-6wx2HcvafHvEjEa1tjDzW2hXrOiSE8ALqJUArb3+NoO1BDM42aGcqyPo0ODzKtDk12CgSsFXdNKRpQ5AmpSPtw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", + "@angular-devkit/core": "9.1.1", "ora": "4.0.3", "rxjs": "6.5.4" }, @@ -263,9 +294,9 @@ } }, "@angular/animations": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.0.tgz", - "integrity": "sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.1.tgz", + "integrity": "sha512-IvKv8sV0ymbzDEX2ZLW+F6nOTQqDYallHexuzRVT9txvNE8TNHyySvLcyC5dTmX9fj9LA72NZ6nFyhxq0LFvtQ==" }, "@angular/cdk": { "version": "9.2.0", @@ -276,16 +307,16 @@ } }, "@angular/cli": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.0.tgz", - "integrity": "sha512-ofum4gPE/W3fKyzuJrpdHeOS0ZL8x0eYCgsrMyUoFodSpb5LWPqeW+56NgDTpIeny+Trx3pM9dr9QTUVTJ0vYg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.1.tgz", + "integrity": "sha512-sjRAV4UF8M5v+2gw+EwCYSgciBZDc05AbNxQt+uUdxdfR1QU9hifWq8WDxfOR6jdDP5YqMtQsNaFNwrUyjJJoQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.0", - "@angular-devkit/core": "9.1.0", - "@angular-devkit/schematics": "9.1.0", - "@schematics/angular": "9.1.0", - "@schematics/update": "0.901.0", + "@angular-devkit/architect": "0.901.1", + "@angular-devkit/core": "9.1.1", + "@angular-devkit/schematics": "9.1.1", + "@schematics/angular": "9.1.1", + "@schematics/update": "0.901.1", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.1.1", @@ -294,7 +325,7 @@ "npm-package-arg": "8.0.1", "npm-pick-manifest": "6.0.0", "open": "7.0.3", - "pacote": "11.1.4", + "pacote": "9.5.12", "read-package-tree": "5.3.1", "rimraf": "3.0.2", "semver": "7.1.3", @@ -348,19 +379,19 @@ } }, "@angular/common": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.0.tgz", - "integrity": "sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.1.tgz", + "integrity": "sha512-bS13veMs7//YqYjYJ+JI78ylaCyVcdFKZKikd5SZa6+r6fajcyvLnSKqrKypG3O1BeJ8vOG/Pq54P5gWhbR6eA==" }, "@angular/compiler": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.0.tgz", - "integrity": "sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.1.tgz", + "integrity": "sha512-u1IP6IzUgK6lIzrG1cxp96umXgtThyhuFn/KPoyVt7wPxZ6vVR0ZxjM7zycEcrMGzk0nf0nyOKaksJk9sTXTbg==" }, "@angular/compiler-cli": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.0.tgz", - "integrity": "sha512-xZ8mVPmPporSTtvNA+cbFJQymLzuWfMX6HDDgztZ2eZ5WcQJYloRN4CcYMEzDhCxfV1Zw9Tfc2l14jZD8osi6g==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.1.tgz", + "integrity": "sha512-2jGp0ck2kkLNMzXUo/3iJkrQqJ7oGXE8h2tksxBsH2ptnhexRYTHZ626t7Np128tduY5JeC7J1Jxz7MUuYsJ2Q==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -549,9 +580,9 @@ "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -683,9 +714,9 @@ } }, "@angular/core": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.0.tgz", - "integrity": "sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.1.tgz", + "integrity": "sha512-6lDlUlePafr/392hOvvTZZl6xPHT50U6658sHUAVIr0Un4mJ2MHNHKZtO45bpn3hM4gjFcYRQ7Rpd0umW74iTA==" }, "@angular/flex-layout": { "version": "9.0.0-beta.29", @@ -693,14 +724,14 @@ "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" }, "@angular/forms": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.0.tgz", - "integrity": "sha512-5GC8HQlPChPV+168zLlm4yj4syA6N9ChSKV0tmzj1zIfMcub1UAOaB9IYaXRHQsjPFh9OuQXwmkzScyAfhEVjA==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.1.tgz", + "integrity": "sha512-NX+LuK8JFisiq3uHCOK6YoN/yIb2R9Ye5mwiOPkuZA3lZLKCnUXqCHZbM8VHy/WdjIxxeUaFMJc38yV8RVoabg==" }, "@angular/language-service": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.0.tgz", - "integrity": "sha512-2f8ECoXrj40oS1rtIfi+F8T4WPzundcZDs8WMFNBuWYbk14v1S9sTgMEmZyePHGkPjt6IfYiLJKJCvVgrt1nxQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.1.tgz", + "integrity": "sha512-T+/0X2VnmgW/vzynqYTVv29qtebNvrCB/yJqtNIlqXvBjcB8XRRwZPDZvRyl5BiwEPSsJnjdRFNH9krQHxYp+g==", "dev": true }, "@angular/material": { @@ -714,28 +745,28 @@ "integrity": "sha512-DruanWMcAzOy8mFZ6Xr9sRqJ+KjF0hvFshxqrv0SD/rVpf9oi8ADnuACmHYXN5dYr/YtgmHDywq0Z7USY7SIoA==" }, "@angular/platform-browser": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.0.tgz", - "integrity": "sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.1.tgz", + "integrity": "sha512-tjALKhdAWPErj0euIIdvx/31AHEZ7is7ADsMu+nYn2NY2gcPUuiqq3RCUJVxBYJ2Cclq1nlF0i2rEDKh7TrBKg==" }, "@angular/platform-browser-dynamic": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz", - "integrity": "sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.1.tgz", + "integrity": "sha512-kEox5UOwkRLjGKXLh5o5SYopoAylpKgrXtRrKRKTCMmZTpYSe1bLlXMjpwMAMZ9ZFSTvWp9iX94aT5bJDpLrRQ==" }, "@angular/platform-server": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.1.0.tgz", - "integrity": "sha512-JboTIUBgf9yHRjF93q8NJQoeIp5Zp4kg8Nmw1QLWO6SV+OpiOpKSrlScMVncCh0KiU6SIOmiuHJwBhLm78fi+Q==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.1.1.tgz", + "integrity": "sha512-Azvras7WpRtVw4jfEfmlrz5JBIDpXCZMab/5A1dFv3Z9Dbykp5czkZ/XXCpMCVcli7xxthF1uv/FD4nQoJdzSw==", "requires": { "domino": "^2.1.2", - "xhr2": "^0.1.4" + "xhr2": "^0.2.0" } }, "@angular/router": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.0.tgz", - "integrity": "sha512-cExO1nPnoPFiUJWZ28hTHozPLFoCmqr3xqcM57We0hhKE0esdrO+gRWKRH0EJERukLbU8coPKVhA8daGUpASiQ==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.1.tgz", + "integrity": "sha512-OQ5Ctd+swF7ZNlgUxrkGKk2B4yBFqJm0QCxkM86kFDCKQV/4OButZ+4HPy1HxeozBIAmm2pbQA+YjsAUs0VZcQ==" }, "@babel/code-frame": { "version": "7.5.5", @@ -1139,13 +1170,14 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", - "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", + "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.9.5" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -1299,14 +1331,14 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", - "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "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==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^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", @@ -1314,6 +1346,34 @@ "globals": "^11.1.0" }, "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==", + "dev": true, + "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==", + "dev": true + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "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", @@ -1332,9 +1392,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", - "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", + "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==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -1480,9 +1540,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", - "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "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==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.8.3", @@ -1836,32 +1896,32 @@ } }, "@ngrx/effects": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-9.0.0.tgz", - "integrity": "sha512-6Rq7FsNZK26HqYlpOGCglKLenIkVOOKE0y6D/8KXjEJ1JlZWi00fdI7poclBGjm9pvMBGXfJA8a9MKuxb/t9cA==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-9.1.0.tgz", + "integrity": "sha512-DPMtp/2YTrvuxMqaehQ39FeoNODuMcRB6xDImvrnMFPIkUcP3mDHnIg6UB5c2JvfHlZZClKR+Fb+RE2nuVub8w==" }, "@ngrx/router-store": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-9.0.0.tgz", - "integrity": "sha512-eVgdRwK0twPgTgWnIpc2EBoz6LgWsGdlheDVKZ9MNU8ZkbPV8/ycivW5Oy5cm+ppi1QHHmkpgt+u5c2iGi68cg==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-9.1.0.tgz", + "integrity": "sha512-zdIBUsfyrrA64mUqajHMARSwttOAOJ5FSyVJLHQfBlz9/vil6Kby1KhVLEG7mGmkz799YYlIM135QsrJhgf7wA==" }, "@ngrx/store": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-9.0.0.tgz", - "integrity": "sha512-QnmfXJ4G2jp+vFaqT5Qfp6h0J9OHxfDKI2RbnMU93Tq1Xd/WVPzXnOQGjILBjwwWI6RFkSdIpUoQONr7VOW63g==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-9.1.0.tgz", + "integrity": "sha512-Ah2nApPZXTvKl7ybaFMIFwEdMg8b7PvIKATigbDTUftAsFxked2+T7blNv6aCgSfEqbOVMBTYPk7OsLCYZoz4Q==" }, "@ngrx/store-devtools": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-9.0.0.tgz", - "integrity": "sha512-Vj8sj8GclbSbnYCS8eqZXTOYDdip1nnjKhkYClUg2oFPh67haaCmvh7TXITnX8PpgDtj5akF84Xw9/1HRiG8mg==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-9.1.0.tgz", + "integrity": "sha512-KDvuNBxfTgDHjESiouEoPXq8GCUYbHnA+jOs8MzzwVDmxNLeZuDy3amaVzKv9Q5nncI6mNGcXOzTKWzapET8Sw==" }, "@ngtools/webpack": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.0.tgz", - "integrity": "sha512-kQ+1N/F+5tuUXiiaoqJwhcOIM0I93EEvF3xwpTLRm91wl2i8R1261LvsD/uQPrgLrZNGR6eFhFF1Izn2PnIjQA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.1.tgz", + "integrity": "sha512-4RPlk6aIlYhk9isTvXbMaA2G0LhxOzcZ+2iG7zV9Yj/Vm8+lrRexpQ/kC/Dh0GI/oCtKIkVpUzx5LTozYeTLdQ==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", + "@angular-devkit/core": "9.1.1", "enhanced-resolve": "4.1.1", "rxjs": "6.5.4", "webpack-sources": "1.4.3" @@ -1904,65 +1964,6 @@ "fastq": "^1.6.0" } }, - "@npmcli/ci-detect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", - "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==", - "dev": true - }, - "@npmcli/git": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.1.tgz", - "integrity": "sha512-hVatexiBtx71F01Ars38Hr5AFUGmJgHAfQtRlO5fJlnAawRGSXwEFgjB5i3XdUUmElZU/RXy7fefN02dZKxgPw==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^1.1.0", - "mkdirp": "^1.0.3", - "npm-pick-manifest": "^6.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "unique-filename": "^1.1.1", - "which": "^2.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "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" - } - } - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", - "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1", - "read-package-json-fast": "^1.1.1", - "readdir-scoped-modules": "^1.1.0" - } - }, - "@npmcli/promise-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.1.0.tgz", - "integrity": "sha512-FwbuYN9KXBkloLeIR3xRgI8dyOdfK/KzaJlChszNuwmUXD1lHXfLlSeo4n4KrKt2udIK9K9/TzlnyCA3ubM2fA==", - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, "@rollup/plugin-commonjs": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", @@ -2019,27 +2020,27 @@ } }, "@schematics/angular": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.0.tgz", - "integrity": "sha512-qkehaITQ1S1udfnnBY5CXGWnk1iVFI8cZayjLUlRfD5w+6v9if3VIuqPssX96MqvkbjyRu1N214+ieaawzLmuA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.1.tgz", + "integrity": "sha512-V0DcDNgHQ2YR+PGZI6+pf/mUNNxt5SusShkZ1PbwIMk/HUQpzEGkLjm3v1Jw9eIZKiuDx615GNU1xDzQ/KyNRQ==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", - "@angular-devkit/schematics": "9.1.0" + "@angular-devkit/core": "9.1.1", + "@angular-devkit/schematics": "9.1.1" } }, "@schematics/update": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.0.tgz", - "integrity": "sha512-u2VESL1dgOSGZK/wcWEz0WcCU/yv764zhzCQerCwUtbV1CISSSDZ6x+prVYDXOdxWBGtDos2MbCF3GEJJI1T+w==", + "version": "0.901.1", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.1.tgz", + "integrity": "sha512-g5B8hjXKCbUNLKCkWQxc5r2D9lOQXRTLZJNIqva+l/ck0AML5MpelxkqQId9ZGLfQqfFk/XjdSHRWgcmUs1WnA==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", - "@angular-devkit/schematics": "9.1.0", + "@angular-devkit/core": "9.1.1", + "@angular-devkit/schematics": "9.1.1", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "npm-package-arg": "^8.0.0", - "pacote": "11.1.4", + "pacote": "9.5.12", "rxjs": "6.5.4", "semver": "7.1.3", "semver-intersect": "1.4.0" @@ -2198,9 +2199,9 @@ } }, "@types/node": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", - "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", + "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==", "dev": true }, "@types/normalize-package-data": { @@ -2485,6 +2486,16 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2537,57 +2548,21 @@ "dev": true }, "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { - "debug": "4" - }, - "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 - } + "es6-promisify": "^5.0.0" } }, "agentkeepalive": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz", - "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", "dev": true, "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "aggregate-error": { @@ -3747,22 +3722,6 @@ "isarray": "^1.0.0" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -3775,12 +3734,6 @@ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -4154,9 +4107,9 @@ } }, "cli-spinners": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", - "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", + "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==", "dev": true }, "cli-width": { @@ -4700,9 +4653,9 @@ "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -4737,9 +4690,9 @@ } }, "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, "core-js-compat": { "version": "3.6.4", @@ -5802,7 +5755,6 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, - "optional": true, "requires": { "iconv-lite": "~0.4.13" } @@ -6916,9 +6868,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -7913,6 +7865,12 @@ "is-property": "^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==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -8577,30 +8535,23 @@ } }, "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "4", + "debug": "3.1.0" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, @@ -8634,19 +8585,19 @@ "dev": true }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "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": "6", - "debug": "4" + "agent-base": "^4.3.0", + "debug": "^3.1.0" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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" @@ -9187,12 +9138,6 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true - }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -9422,13 +9367,10 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true }, "isexe": { "version": "2.0.0", @@ -9850,12 +9792,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", - "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==", - "dev": true - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -9961,12 +9897,11 @@ "dev": true }, "karma": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", - "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.1.tgz", + "integrity": "sha512-xrDGtZ0mykEQjx1BUHOP1ITi39MDsCGocmSvLJWHxUQpxuKwxk3ZUrC6HI2VWh1plLC6+7cA3B19m12yzO/FRw==", "dev": true, "requires": { - "bluebird": "^3.3.0", "body-parser": "^1.16.1", "braces": "^3.0.2", "chokidar": "^3.0.0", @@ -9978,22 +9913,37 @@ "glob": "^7.1.1", "graceful-fs": "^4.1.2", "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", + "isbinaryfile": "^4.0.2", "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" + "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", @@ -10035,6 +9985,32 @@ "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", @@ -10044,6 +10020,16 @@ "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", @@ -10051,9 +10037,15 @@ "dev": true, "optional": true }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "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": { @@ -10069,12 +10061,27 @@ "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", @@ -10087,6 +10094,36 @@ "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", @@ -10096,12 +10133,38 @@ "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", @@ -10110,6 +10173,52 @@ "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": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -10594,26 +10703,76 @@ "dev": true }, "make-fetch-happen": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.4.tgz", - "integrity": "sha512-hIFoqGq1db0QMiy/Atr/pI1Rs4rDV+ZdGSey2SQyF3KK3u1z4aj9mS5UdNnZkdQpA+H3pGn0J3KlEwsi2x4EqA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", "dev": true, "requires": { - "agentkeepalive": "^4.1.0", - "cacache": "^15.0.0", - "http-cache-semantics": "^4.0.4", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.1.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", "promise-retry": "^1.1.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } } }, "make-iterator": { @@ -11033,19 +11192,6 @@ "minipass": "^3.0.0" } }, - "minipass-fetch": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", - "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-pipeline": "^1.2.2", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -11055,16 +11201,6 @@ "minipass": "^3.0.0" } }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, "minipass-pipeline": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", @@ -11074,15 +11210,6 @@ "minipass": "^3.0.0" } }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, "minizlib": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", @@ -11598,6 +11725,17 @@ "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", @@ -11733,9 +11871,9 @@ }, "dependencies": { "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.2.1.tgz", + "integrity": "sha512-aHhm1pD02jXXkyIpq25qBZjr3CQgg8KST8uX0OWXch3xE6jw+1bfbWnCjzMwojsTquroUmKFHNzU6x26mEiRxw==", "dev": true } } @@ -11767,39 +11905,22 @@ } }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.2.1.tgz", + "integrity": "sha512-aHhm1pD02jXXkyIpq25qBZjr3CQgg8KST8uX0OWXch3xE6jw+1bfbWnCjzMwojsTquroUmKFHNzU6x26mEiRxw==", "dev": true } } }, "npm-packlist": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.1.tgz", - "integrity": "sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", "npm-normalize-package-bin": "^1.0.1" - }, - "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" - } - } } }, "npm-pick-manifest": { @@ -11814,27 +11935,46 @@ }, "dependencies": { "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.2.1.tgz", + "integrity": "sha512-aHhm1pD02jXXkyIpq25qBZjr3CQgg8KST8uX0OWXch3xE6jw+1bfbWnCjzMwojsTquroUmKFHNzU6x26mEiRxw==", "dev": true } } }, "npm-registry-fetch": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.0.0.tgz", - "integrity": "sha512-975WwLvZjX97y9UWWQ8nAyr7bw02s9xKPHqvEm5T900LQsB1HXb8Gb9ebYtCBLSX+K8gSOrO5KS/9yV/naLZmQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz", + "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==", "dev": true, "requires": { - "@npmcli/ci-detect": "^1.0.0", + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", "lru-cache": "^5.1.1", - "make-fetch-happen": "^8.0.2", - "minipass": "^3.0.0", - "minipass-fetch": "^1.1.2", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } } }, "npm-run-all": { @@ -12483,6 +12623,16 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -12570,56 +12720,162 @@ } }, "pacote": { - "version": "11.1.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.4.tgz", - "integrity": "sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw==", + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", "dev": true, "requires": { - "@npmcli/git": "^2.0.1", - "@npmcli/installed-package-contents": "^1.0.5", - "@npmcli/promise-spawn": "^1.1.0", - "cacache": "^15.0.0", - "chownr": "^1.1.4", - "fs-minipass": "^2.1.0", + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "minipass": "^3.0.1", - "minipass-fetch": "^1.2.1", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.0", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^8.0.0", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", - "read-package-json-fast": "^1.1.3", - "rimraf": "^2.7.1", - "semver": "^7.1.3", - "ssri": "^8.0.0", - "tar": "^6.0.1", - "which": "^2.0.2" + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "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" + }, + "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" + } + } + } }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "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" + } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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": { - "isexe": "^2.0.0" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "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" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -12884,9 +13140,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -13652,6 +13908,15 @@ } } }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, "protractor": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz", @@ -13835,12 +14100,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", @@ -14061,16 +14320,6 @@ "npm-normalize-package-bin": "^1.0.0" } }, - "read-package-json-fast": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", - "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "read-package-tree": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", @@ -15819,30 +16068,23 @@ } }, "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" + "agent-base": "~4.2.1", + "socks": "~2.3.2" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { - "ms": "^2.1.1" + "es6-promisify": "^5.0.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, @@ -16349,9 +16591,9 @@ } }, "string.prototype.trimend": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", - "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -16460,9 +16702,9 @@ } }, "string.prototype.trimstart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", - "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -17067,9 +17309,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -17423,6 +17665,12 @@ "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", @@ -17818,34 +18066,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", @@ -18562,9 +18782,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -18887,9 +19107,9 @@ "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", diff --git a/package.json b/package.json index 7bab803ace..34e5101cef 100644 --- a/package.json +++ b/package.json @@ -46,28 +46,28 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "@angular/animations": "^9.1.0", + "@angular/animations": "^9.1.1", "@angular/cdk": "^9.2.0", - "@angular/common": "^9.1.0", - "@angular/compiler": "^9.1.0", - "@angular/core": "^9.1.0", + "@angular/common": "^9.1.1", + "@angular/compiler": "^9.1.1", + "@angular/core": "^9.1.1", "@angular/flex-layout": "^9.0.0-beta.29", - "@angular/forms": "^9.1.0", + "@angular/forms": "^9.1.1", "@angular/material": "^9.2.0", "@angular/material-moment-adapter": "^9.2.0", - "@angular/platform-browser": "^9.1.0", - "@angular/platform-browser-dynamic": "^9.1.0", - "@angular/platform-server": "^9.1.0", - "@angular/router": "^9.1.0", - "@ngrx/effects": "^9.0.0", - "@ngrx/router-store": "^9.0.0", - "@ngrx/store": "^9.0.0", - "@ngrx/store-devtools": "^9.0.0", + "@angular/platform-browser": "^9.1.1", + "@angular/platform-browser-dynamic": "^9.1.1", + "@angular/platform-server": "^9.1.1", + "@angular/router": "^9.1.1", + "@ngrx/effects": "^9.1.0", + "@ngrx/router-store": "^9.1.0", + "@ngrx/store": "^9.1.0", + "@ngrx/store-devtools": "^9.1.0", "@swimlane/ngx-charts": "^13.0.2", "@types/moment-timezone": "^0.5.13", "@types/marked": "^0.7.3", "angular2-virtual-scroll": "^0.4.16", - "core-js": "^3.6.4", + "core-js": "^3.6.5", "immer": "^6.0.3", "lodash-es": "^4.17.14", "mappy-breakpoints": "^0.2.3", @@ -94,16 +94,16 @@ "node": "12.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.901.0", - "@angular-devkit/build-ng-packagr": "~0.901.0", - "@angular-devkit/schematics": "^9.1.0", - "@angular/cli": "^9.1.0", - "@angular/compiler-cli": "^9.1.0", - "@angular/language-service": "^9.1.0", + "@angular-devkit/build-angular": "~0.901.1", + "@angular-devkit/build-ng-packagr": "~0.901.1", + "@angular-devkit/schematics": "^9.1.1", + "@angular/cli": "^9.1.1", + "@angular/compiler-cli": "^9.1.1", + "@angular/language-service": "^9.1.1", "@types/jasmine": "^3.5.10", "@types/jasminewd2": "~2.0.8", "@types/karma": "^4.4.1", - "@types/node": "^13.11.0", + "@types/node": "^13.11.1", "@types/request": "^2.48.4", "acorn": "^7.1.1", "browserstack-local": "^1.4.5", @@ -120,7 +120,7 @@ "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~5.0.1", "js-yaml": "~3.13.1", - "karma": "~4.4.1", + "karma": "~5.0.1", "karma-chrome-launcher": "~3.1.0", "karma-cli": "~2.0.0", "karma-coverage-istanbul-reporter": "^2.1.1", From 2a8457ab76389c680e2941df9dadfb18f2d037f1 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Sun, 12 Apr 2020 15:40:42 +0100 Subject: [PATCH 018/176] Fix routing event change --- .../packages/store/src/reducers/routing.reducer.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/frontend/packages/store/src/reducers/routing.reducer.ts b/src/frontend/packages/store/src/reducers/routing.reducer.ts index d7556182b4..e1c86325c3 100644 --- a/src/frontend/packages/store/src/reducers/routing.reducer.ts +++ b/src/frontend/packages/store/src/reducers/routing.reducer.ts @@ -20,11 +20,17 @@ export function routingReducer(state: RoutingHistory = defaultRoutingState, acti return state; } + // This changed in Anagular 9 - state no longer embdedded + // This deuiplicated 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: From c2189079c289ff960ea093ab721ada0197cbd12e Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 14 Apr 2020 15:55:34 +0100 Subject: [PATCH 019/176] Convert connection details checkbox to drop down --- .../backup-connection-cell.component.html | 8 + .../backup-connection-cell.component.scss | 0 .../backup-connection-cell.component.spec.ts | 25 +++ .../backup-connection-cell.component.ts | 22 +++ .../backup-endpoints.service.ts | 34 +--- .../backup-endpoints.component.html | 7 +- .../backup-endpoints.component.ts | 29 +-- .../backup-restore-endpoints.service.ts | 179 +----------------- .../restore-endpoints.component.ts | 33 ---- .../endpoints-page.component.html | 7 +- .../features/endpoints/endpoints.module.ts | 5 +- .../endpoint/endpoints-list-config.service.ts | 25 +-- src/jetstream/cnsi.go | 51 ++++- 13 files changed, 152 insertions(+), 273 deletions(-) create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.scss create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html new file mode 100644 index 0000000000..752618ca1a --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html @@ -0,0 +1,8 @@ + + + None + Current User + All Users + + \ No newline at end of file diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts new file mode 100644 index 0000000000..9f1d8760e4 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BackupConnectionCellComponent } from './backup-connection-cell.component'; + +describe('BackupConnectionCellComponent', () => { + let component: BackupConnectionCellComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BackupConnectionCellComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BackupConnectionCellComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); 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 new file mode 100644 index 0000000000..60a5190361 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts @@ -0,0 +1,22 @@ +import { Component } from '@angular/core'; + +import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; +import { TableCellCustom } from '../../../../shared/components/list/list.types'; +import { BackupEndpointsService } from '../backup-endpoints.service'; +import { BackupEndpointConnectionTypes, BackupEndpointTypes } from '../backup-restore-endpoints.service'; + +@Component({ + selector: 'app-backup-connection-cell', + templateUrl: './backup-connection-cell.component.html', + styleUrls: ['./backup-connection-cell.component.scss'] +}) +export class BackupConnectionCellComponent extends TableCellCustom { + + backupType = BackupEndpointTypes; + connectionTypes = BackupEndpointConnectionTypes; + selected: BackupEndpointConnectionTypes; + + constructor(public service: BackupEndpointsService) { + super(); + } +} 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 80cc1c5f43..9b5479d444 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 @@ -12,6 +12,7 @@ import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; import { BrowserStandardEncoder } from '../../../helper'; import { BackupEndpointConfigUI, + BackupEndpointConnectionTypes, BackupEndpointsConfig, BackupEndpointTypes, BackupRestoreEndpointService, @@ -51,8 +52,7 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { endpoints.forEach(entity => { this.state[entity.guid] = { [BackupEndpointTypes.ENDPOINT]: false, - [BackupEndpointTypes.CONNECT]: false, - [BackupEndpointTypes.ALL_CONNECT]: false, + [BackupEndpointTypes.CONNECT]: BackupEndpointConnectionTypes.NONE, entity }; }); @@ -63,25 +63,19 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { const endpoints = Object.values(this.state); endpoints.forEach(endpoint => { if (!endpoint[BackupEndpointTypes.ENDPOINT]) { - endpoint[BackupEndpointTypes.CONNECT] = false; - endpoint[BackupEndpointTypes.ALL_CONNECT] = false; - } - if (endpoint[BackupEndpointTypes.ALL_CONNECT] && this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT)) { - endpoint[BackupEndpointTypes.CONNECT] = true; + endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.NONE; } }); const hasChanges = !!endpoints.find(endpoint => endpoint[BackupEndpointTypes.ENDPOINT] || - endpoint[BackupEndpointTypes.CONNECT] || - endpoint[BackupEndpointTypes.ALL_CONNECT] + endpoint[BackupEndpointTypes.CONNECT] !== BackupEndpointConnectionTypes.NONE ); this.hasChanges.next(hasChanges); const allChanged = endpoints.every(endpoint => { const e = !this.canBackup(endpoint.entity, BackupEndpointTypes.ENDPOINT) || endpoint[BackupEndpointTypes.ENDPOINT]; - const c = !this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT) || endpoint[BackupEndpointTypes.CONNECT]; - const aC = !this.canBackup(endpoint.entity, BackupEndpointTypes.ALL_CONNECT) || endpoint[BackupEndpointTypes.ALL_CONNECT]; - return e && c && aC; + const c = !this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT) || endpoint[BackupEndpointTypes.CONNECT] !== BackupEndpointConnectionTypes.NONE; + return e && c; } ); @@ -105,14 +99,6 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { return false; } - // Are all connection details backed up anyway? - // Does the user have connection details for this endpoint? - if (type === BackupEndpointTypes.CONNECT) { - return !this.state[endpoint.guid][BackupEndpointTypes.ALL_CONNECT] && - endpoint.connectionStatus === 'connected'; - // return !this.service.state[endpoint.guid][BackupRestoreTypes.CONNECT]; - } - return true; } @@ -122,10 +108,7 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { endpoint[BackupEndpointTypes.ENDPOINT] = true; } if (this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT)) { - endpoint[BackupEndpointTypes.CONNECT] = true; - } - if (this.canBackup(endpoint.entity, BackupEndpointTypes.ALL_CONNECT)) { - endpoint[BackupEndpointTypes.ALL_CONNECT] = true; + endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.CURRENT; } }); this.validate(); @@ -134,8 +117,7 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { selectNone() { Object.values(this.state).forEach(endpoint => { endpoint[BackupEndpointTypes.ENDPOINT] = false; - endpoint[BackupEndpointTypes.CONNECT] = false; - endpoint[BackupEndpointTypes.ALL_CONNECT] = false; + endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.NONE; }); this.validate(); } diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html index e6dd32385c..14a8f6bf96 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html @@ -22,7 +22,12 @@

Backup Endpoints

Protect the backup by providing as password. You will need this password when restoring from this backup

- + Password + +
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 23f5216ab3..a32fa6f617 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,6 +7,7 @@ import { filter, first, map, tap } 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 { 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'; @@ -15,6 +16,7 @@ import { ConfirmationDialogService } from '../../../../shared/components/confirm import { ITableListDataSource } from '../../../../shared/components/list/data-sources-controllers/list-data-source-types'; import { ITableColumn } from '../../../../shared/components/list/list-table/table.types'; import { StepOnNextFunction, StepOnNextResult } from '../../../../shared/components/stepper/step/step.component'; +import { BackupConnectionCellComponent } from '../backup-connection-cell/backup-connection-cell.component'; import { BackupEndpointsService } from '../backup-endpoints.service'; import { BackupRestoreCellComponent } from '../backup-restore-cell/backup-restore-cell.component'; import { BackupEndpointTypes } from '../backup-restore-endpoints.service'; @@ -38,6 +40,13 @@ export class BackupEndpointsComponent implements OnInit { valuePath: 'name' } }, + { + columnId: 'type', + headerCell: () => 'Type', + cellDefinition: { + getValue: this.getEndpointTypeString + }, + }, { columnId: 'endpoint', headerCell: () => 'Backup', @@ -48,19 +57,8 @@ export class BackupEndpointsComponent implements OnInit { }, { columnId: 'connect', - headerCell: () => 'Backup Your Connection Details', - cellComponent: BackupRestoreCellComponent, - cellConfig: { - type: BackupEndpointTypes.CONNECT - } - }, - { - columnId: 'all-connect', - headerCell: () => 'Backup All Users Connection Details', - cellComponent: BackupRestoreCellComponent, - cellConfig: { - type: BackupEndpointTypes.ALL_CONNECT - } + headerCell: () => 'Connection Details', + cellComponent: BackupConnectionCellComponent, }, ]; endpointDataSource: ITableListDataSource; @@ -71,6 +69,7 @@ export class BackupEndpointsComponent implements OnInit { // Step 2 passwordValid$: Observable; passwordForm: FormGroup; + show = false; constructor( public service: BackupEndpointsService, @@ -82,6 +81,7 @@ export class BackupEndpointsComponent implements OnInit { this.setupPasswordStep(); } + setupSelectStep() { const action = new GetAllEndpoints(); const endpointObs = getPaginationObservables({ @@ -181,4 +181,7 @@ export class BackupEndpointsComponent implements OnInit { } + private getEndpointTypeString(endpoint: EndpointModel): string { + return entityCatalog.getEndpoint(endpoint.cnsi_type, endpoint.sub_type).definition.label; + } } diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts index 29b19d45f2..abb46f3628 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts @@ -8,7 +8,12 @@ import { isHttpErrorResponse } from '../../../jetstream.helpers'; export enum BackupEndpointTypes { ENDPOINT = 'endpoint', CONNECT = 'connect', - ALL_CONNECT = 'all_connect' +} + +export enum BackupEndpointConnectionTypes { + NONE = 'NONE', + CURRENT = 'CURRENT', + ALL = 'ALL' } export interface BackupEndpointsConfig { @@ -17,17 +22,13 @@ export interface BackupEndpointsConfig { export interface BaseEndpointConfig { [BackupEndpointTypes.ENDPOINT]: boolean; - [BackupEndpointTypes.CONNECT]: boolean; - [BackupEndpointTypes.ALL_CONNECT]: boolean; + [BackupEndpointTypes.CONNECT]: BackupEndpointConnectionTypes; } -// type BackupEndpoint = Omit; - export interface BackupEndpointConfigUI extends BaseEndpointConfig { entity: EndpointModel; } -// @Injectable() export class BackupRestoreEndpointService { createError(err: any): string { @@ -44,170 +45,4 @@ export class BackupRestoreEndpointService { } return err.message; } - - // hasChanges = new BehaviorSubject(false); - // hasChanges$ = this.hasChanges.asObservable(); - // allChanged = new BehaviorSubject(false); - // allChanged$ = this.allChanged.asObservable(); - - // state: BackupEndpointsConfig = {}; - // password: string; - - - // constructor( - // private store: Store, - // private http: HttpClient - // ) { - - // } - - // // State Related - // initialize(endpoints: EndpointModel[]) { - // endpoints.forEach(entity => { - // this.state[entity.guid] = { - // [BackupRestoreTypes.ENDPOINT]: false, - // [BackupRestoreTypes.CONNECT]: false, - // [BackupRestoreTypes.ALL_CONNECT]: false, - // entity - // }; - // }); - // this.validate(); - // } - - // validate() { - // const endpoints = Object.values(this.state); - // endpoints.forEach(endpoint => { - // if (!endpoint[BackupRestoreTypes.ENDPOINT]) { - // endpoint[BackupRestoreTypes.CONNECT] = false; - // endpoint[BackupRestoreTypes.ALL_CONNECT] = false; - // } - // if (endpoint[BackupRestoreTypes.ALL_CONNECT] && this.canBackup(endpoint.entity, BackupRestoreTypes.CONNECT)) { - // endpoint[BackupRestoreTypes.CONNECT] = true; - // } - // }); - - // const hasChanges = !!endpoints.find(endpoint => - // endpoint[BackupRestoreTypes.ENDPOINT] || - // endpoint[BackupRestoreTypes.CONNECT] || - // endpoint[BackupRestoreTypes.ALL_CONNECT] - // ); - // this.hasChanges.next(hasChanges); - // const allChanged = endpoints.every(endpoint => { - // const e = !this.canBackup(endpoint.entity, BackupRestoreTypes.ENDPOINT) || endpoint[BackupRestoreTypes.ENDPOINT]; - // const c = !this.canBackup(endpoint.entity, BackupRestoreTypes.CONNECT) || endpoint[BackupRestoreTypes.CONNECT]; - // const aC = !this.canBackup(endpoint.entity, BackupRestoreTypes.ALL_CONNECT) || endpoint[BackupRestoreTypes.ALL_CONNECT]; - // return e && c && aC; - // } - - // ); - // this.allChanged.next(allChanged); - // } - - // canBackup(endpoint: EndpointModel, type: BackupRestoreTypes): boolean { - // // Can always back up endpoint - // if (type === BackupRestoreTypes.ENDPOINT) { - // return true; - // } - - // // All other settings require endpoint to be backed up - // if (!this.state[endpoint.guid][BackupRestoreTypes.ENDPOINT]) { - // return false; - // } - - // const epType = entityCatalog.getEndpoint(endpoint.cnsi_type, endpoint.sub_type).definition; - // // The endpoint type supports connection details - // if (epType.unConnectable) { - // return false; - // } - - // // Are all connection details backed up anyway? - // // Does the user have connection details for this endpoint? - // if (type === BackupRestoreTypes.CONNECT) { - // return !this.state[endpoint.guid][BackupRestoreTypes.ALL_CONNECT] && - // endpoint.connectionStatus === 'connected'; - // // return !this.service.state[endpoint.guid][BackupRestoreTypes.CONNECT]; - // } - - // return true; - // } - - // selectAll() { - // Object.values(this.state).forEach(endpoint => { - // if (this.canBackup(endpoint.entity, BackupRestoreTypes.ENDPOINT)) { - // endpoint[BackupRestoreTypes.ENDPOINT] = true; - // } - // if (this.canBackup(endpoint.entity, BackupRestoreTypes.CONNECT)) { - // endpoint[BackupRestoreTypes.CONNECT] = true; - // } - // if (this.canBackup(endpoint.entity, BackupRestoreTypes.ALL_CONNECT)) { - // endpoint[BackupRestoreTypes.ALL_CONNECT] = true; - // } - // }); - // this.validate(); - // } - - // selectNone() { - // Object.values(this.state).forEach(endpoint => { - // endpoint[BackupRestoreTypes.ENDPOINT] = false; - // endpoint[BackupRestoreTypes.CONNECT] = false; - // endpoint[BackupRestoreTypes.ALL_CONNECT] = false; - // }); - // this.validate(); - // } - - // // Request Related - - // createBackup(): Observable { - // const url = '/pp/v1/backup/endpoints'; - // const fromObject = {}; - // const params: HttpParams = new HttpParams({ - // fromObject, - // encoder: new BrowserStandardEncoder() - // }); - - // return this.getSessionData().pipe( - // switchMap(ses => this.http.post(url, this.createBodyToSend(ses), { - // params - // })), - // map(res => { - // console.log('Response: ', res); - // return new Blob([JSON.stringify(res)]); - // }), - // first(), - // ); - // } - - // private createBodyToSend(sd: SessionData): BackupEndpointRequestData { - // const state: BackupEndpointsConfig = Object.entries(this.state).reduce((res, [endpointId, endpoint]) => { - // const { entity, ...rest } = endpoint; - // const requestConfig: BackupEndpointConfigRequest = { - // ...rest, - // }; - // res[endpointId] = requestConfig; - // return res; - // }, {}); - // return { - // state, - // userId: this.getUserIdFromSessionData(sd), - // password: this.password - // }; - // } - - // private getUserIdFromSessionData(sd: SessionData): string { - // if (sd && sd.user) { - // return sd.user.guid; - // } - // return null; - // } - - // private getSessionData(): Observable { - // return this.store.select(s => s.auth).pipe( - // filter(auth => !!(auth && auth.sessionData)), - // map((auth: AuthState) => auth.sessionData), - // first() - // ); - // } - - - } 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 0bfb63a132..e35d5af48a 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 @@ -6,15 +6,10 @@ import { first, map, tap } from 'rxjs/operators'; import { AppState } from '../../../../../../store/src/app-state'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; import { getEventFiles } from '../../../../core/browser-helper'; import { ConfirmationDialogConfig } from '../../../../shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../shared/components/confirmation-dialog.service'; -import { ITableListDataSource } from '../../../../shared/components/list/data-sources-controllers/list-data-source-types'; -import { ITableColumn } from '../../../../shared/components/list/list-table/table.types'; import { StepOnNextFunction, StepOnNextResult } from '../../../../shared/components/stepper/step/step.component'; -import { BackupRestoreCellComponent } from '../backup-restore-cell/backup-restore-cell.component'; -import { BackupEndpointTypes } from '../backup-restore-endpoints.service'; import { RestoreEndpointsService } from '../restore-endpoints.service'; @@ -29,34 +24,6 @@ import { RestoreEndpointsService } from '../restore-endpoints.service'; export class RestoreEndpointsComponent implements OnInit { // Step 1 - columns: ITableColumn[] = [ - { - columnId: 'name', - headerCell: () => 'Name', - cellDefinition: { - valuePath: 'name' - } - }, - { - columnId: 'endpoint', - headerCell: () => 'Restore', - cellComponent: BackupRestoreCellComponent, - cellConfig: { - type: BackupEndpointTypes.ENDPOINT, - - } - }, - { - columnId: 'connect', - headerCell: () => 'Include Connection', - cellComponent: BackupRestoreCellComponent, - cellConfig: { - type: BackupEndpointTypes.CONNECT - } - }, - // TODO: RC disable backup token if unconnectable - ]; - endpointDataSource: ITableListDataSource; fileValid$: Observable; fileName: string; diff --git a/src/frontend/packages/core/src/features/endpoints/endpoints-page/endpoints-page.component.html b/src/frontend/packages/core/src/features/endpoints/endpoints-page/endpoints-page.component.html index ee90c52f27..c8e3f991c3 100644 --- a/src/frontend/packages/core/src/features/endpoints/endpoints-page/endpoints-page.component.html +++ b/src/frontend/packages/core/src/features/endpoints/endpoints-page/endpoints-page.component.html @@ -1,9 +1,14 @@

Endpoints

- +
diff --git a/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts b/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts index c3704479ff..307379946a 100644 --- a/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts +++ b/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts @@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../core/core.module'; import { SharedModule } from '../../shared/shared.module'; +import { BackupConnectionCellComponent } from './backup-restore/backup-connection-cell/backup-connection-cell.component'; import { BackupEndpointsComponent } from './backup-restore/backup-endpoints/backup-endpoints.component'; import { BackupRestoreCellComponent } from './backup-restore/backup-restore-cell/backup-restore-cell.component'; import { @@ -37,13 +38,15 @@ import { EndpointsRoutingModule } from './endpoints.routing'; BackupEndpointsComponent, RestoreEndpointsComponent, BackupRestoreCellComponent, + BackupConnectionCellComponent, ], entryComponents: [ ConnectEndpointDialogComponent, CredentialsAuthFormComponent, SSOAuthFormComponent, NoneAuthFormComponent, - BackupRestoreCellComponent + BackupRestoreCellComponent, + BackupConnectionCellComponent ] }) export class EndpointsModule { } 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 67ef1c43ca..44e7281b6a 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 @@ -1,8 +1,6 @@ import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; +import { filter } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; @@ -10,13 +8,12 @@ import { entityCatalog } from '../../../../../../../store/src/entity-catalog/ent 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 { AuthState } from '../../../../../../../store/src/reducers/auth.reducer'; import { EndpointModel } from '../../../../../../../store/src/types/endpoint.types'; import { getFullEndpointApiUrl } from '../../../../../features/endpoints/endpoint-helpers'; import { FavoritesConfigMapper } from '../../../favorites-meta-card/favorite-config-mapper'; import { createTableColumnFavorite } from '../../list-table/table-cell-favorite/table-cell-favorite.component'; import { ITableColumn } from '../../list-table/table.types'; -import { IGlobalListAction, IListAction, IListConfig, ListViewTypes } from '../../list.component.types'; +import { IListAction, IListConfig, ListViewTypes } from '../../list.component.types'; import { EndpointCardComponent } from './endpoint-card/endpoint-card.component'; import { EndpointListHelper } from './endpoint-list.helpers'; import { EndpointsDataSource } from './endpoints-data-source'; @@ -32,19 +29,6 @@ export class EndpointsListConfigService implements IListConfig { private singleActions: IListAction[]; - private globalActions: IGlobalListAction[] = [{ - action: () => this.router.navigate(['endpoints/backup-restore']), - icon: 'settings_backup_restore', - label: 'Backup/Restore Endpoints', - description: 'Backup or Restore Endpoints', - visible$: this.store.select(s => s.auth).pipe( - filter(auth => !!auth && !!auth.sessionData), - map((auth: AuthState) => auth.sessionData), - map(session => session.user && session.user.admin) - ), - enabled$: of(true), // Table is not shown when there's no endpoints, so this should always be true - }]; - public readonly columns: ITableColumn[] = [ { columnId: 'name', @@ -105,7 +89,6 @@ export class EndpointsListConfigService implements IListConfig { } ]; - isLocal = true; dataSource: EndpointsDataSource; viewType = ListViewTypes.BOTH; @@ -123,7 +106,7 @@ export class EndpointsListConfigService implements IListConfig { internalEventMonitorFactory: InternalEventMonitorFactory, endpointListHelper: EndpointListHelper, favoritesConfigMapper: FavoritesConfigMapper, - private router: Router + // private router: Router ) { this.singleActions = endpointListHelper.endpointActions(); const favoriteCell = createTableColumnFavorite( @@ -139,7 +122,7 @@ export class EndpointsListConfigService implements IListConfig { ); } - public getGlobalActions = () => this.globalActions; + public getGlobalActions = () => []; public getMultiActions = () => []; public getSingleActions = () => this.singleActions; public getColumns = () => this.columns; diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index 048a912ce8..779645b1ba 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -637,6 +637,14 @@ func (p *portalProxy) updateEndpoint(c echo.Context) error { return nil } +type BackupConnectionType string + +const ( + BACKUP_CONNECTION_NONE BackupConnectionType = "NONE" + BACKUP_CONNECTION_CURRENT = "CURRENT" + BACKUP_CONNECTION_ALL = "ALL" +) + // TODO: RC position type BackupDataRequest struct { State map[string]BackupEndpointsState `json:"state"` @@ -645,9 +653,8 @@ type BackupDataRequest struct { } type BackupEndpointsState struct { - Endpoint bool `json:"endpoint"` - Connect bool `json:"connect"` - AllConnect bool `json:"all_connect"` + Endpoint bool `json:"endpoint"` + Connect BackupConnectionType `json:"connect"` } type BackupRestoreState struct { @@ -727,7 +734,8 @@ func (p *portalProxy) createBackup(data *BackupDataRequest) (*BackupRestoreState } } - if endpoint.AllConnect { + switch connectionType := endpoint.Connect; connectionType { + case BACKUP_CONNECTION_ALL: // allTokensFrom = append(allTokensFrom, endpointID) if tokenRecords, ok := p.getCNSITokenRecordsBackup(endpointID); ok { log.Warn("tokens for AllConnect") @@ -736,7 +744,7 @@ func (p *portalProxy) createBackup(data *BackupDataRequest) (*BackupRestoreState log.Warn("No tokens for AllConnect") // TODO: RC } - } else if endpoint.Connect { + case BACKUP_CONNECTION_CURRENT: // userTokenFrom = append(userTokenFrom, endpointID) if tokenRecord, ok := p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { log.Warn("tokens for Connect") @@ -759,6 +767,39 @@ func (p *portalProxy) createBackup(data *BackupDataRequest) (*BackupRestoreState // return nil, nil, false } } + + // if endpoint.Connect == BACKUP_CONNECTION_ALL { + // // allTokensFrom = append(allTokensFrom, endpointID) + // if tokenRecords, ok := p.getCNSITokenRecordsBackup(endpointID); ok { + // log.Warn("tokens for AllConnect") + // tokens = append(tokens, tokenRecords...) + // } else { + // log.Warn("No tokens for AllConnect") + // // TODO: RC + // } + // } else if endpoint.Connect { + // // userTokenFrom = append(userTokenFrom, endpointID) + // if tokenRecord, ok := p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { + // log.Warn("tokens for Connect") + // // var btr BackupTokenRecord + // // TODO: RC Q This will be the linked token as if it were the users token + // var btr = interfaces.BackupTokenRecord{ + // // tokenRecord: tokenRecord, + // TokenRecord: tokenRecord, + // EndpointGUID: endpointID, + // TokenType: "CNSI", + // UserGUID: data.UserID, + // } + + // tokens = append(tokens, btr) + // } else { + // log.Warnf("No tokens for Connect: %+v,%+v", endpointID, data.UserID) + // // TODO: RC + // // msg := "Unable to retrieve CNSI token record." + // // log.Debug(msg) + // // return nil, nil, false + // } + // } } log.Infof("endpoints: %+v", endpoints) From 4f3c6b4eda806662d46d10d0254157d9ae33758b Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Wed, 15 Apr 2020 15:18:48 +0100 Subject: [PATCH 020/176] Add docs for max list feature --- docs/cf-entity-scaling.md | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docs/cf-entity-scaling.md diff --git a/docs/cf-entity-scaling.md b/docs/cf-entity-scaling.md new file mode 100644 index 0000000000..6055137d25 --- /dev/null +++ b/docs/cf-entity-scaling.md @@ -0,0 +1,43 @@ +# Cloud Foundry Scaling - How Stratos Handles Large Lists + +Stratos presents collections of entities via the Stratos list component. The list component presents the collection in a paginated, sortable and searchable way in either a set of cards or a table. +In order to achieve this, due to the limitations of the APIs used, the list may fetch all entities (as opposed to fetching entities for the visible page only) and paginate, sort and search locally. + +## Protecting Stratos from Large Collections +In some cases the number of entities in a collection can be incredibly high. Stratos can decide to not fetch them all in order to protect the CF from +a substantial number of requests. To do this the first page is fetched and the total number of entities is checked against a limit. If under +the limit the remaining pages are asynchronously fetched. If over then the remaining pages are ignored and the user is informed that the list could not fetch all entities. + +Depending on the list, the user can then try to filter the collection such that the number of entities is below the limit. Depending on configuration +the user also has the option to fetch all entities regardless of the limit. + +## Applicable Lists +Currently, in 3.1.0, this large collection protection is only applicable to the following lists + +- Application Wall +- Marketplace (Services) +- Services (Service & User Provided Service Instances) +- CF, Organisation and Space Users +- CF Routes + +In the future we hope to expand this to all lists. + +## Determining the List Limit +The limit at which we won't fetch all entities is determined, in least important to most important order, by + +1) The global CF default - 600 +2) The Jetstream override for all lists - by default not set + +In the future we hope to allow each end user of Stratos to determine their own limit (if they have the correct permissions). + +## Fetch All feature +If the list hits the limit the user will be presented with a button to `Fetch All` entities. Clicking this button ensures the list reverts +back as if there were no limit and thus fetching all entities. This feature is disabled by default and can be enabled by a Jetstream override. + +## Configuration +The Jetstream overrides can be set via environment variable, or if in helm, as values. + +Environment Variable|Helm Value|Description|Default| +|---|---|---|---| +|`UI_LIST_MAX_SIZE`|`console.ui.listMaxSize`|Override the default maximum number of entities that a configured list can fetch. When a list meets this amount additional pages are not fetched|| +|`UI_LIST_ALLOW_LOAD_MAXED`|`console.ui.listAllowLoadMaxed`|If the maximum list size is met give the user the option to fetch all results|false| \ No newline at end of file From ca7929bae59641d77cd4587f06118de019ea0bb5 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 14 Apr 2020 17:25:36 +0100 Subject: [PATCH 021/176] Add db version check --- .../backup-endpoints.service.ts | 16 ++- .../restore-endpoints.service.ts | 107 ++++++++++++++---- .../restore-endpoints.component.html | 26 +++-- .../restore-endpoints.component.scss | 9 +- .../restore-endpoints.component.ts | 54 +-------- .../store/src/reducers/auth.reducer.ts | 2 +- src/jetstream/cnsi.go | 98 +++++++++++----- 7 files changed, 197 insertions(+), 115 deletions(-) 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 9b5479d444..51b4d4ecf5 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 @@ -19,12 +19,10 @@ import { BaseEndpointConfig, } from './backup-restore-endpoints.service'; -interface BackupEndpointConfigRequest extends BaseEndpointConfig { - // connectedUser: string; -} -interface BackupEndpointRequestData { - state: BackupEndpointsConfig; + +interface BackupRequest { + state: BackupEndpointsConfig; userId: string; password: string; } @@ -144,10 +142,10 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { ); } - private createBodyToSend(sd: SessionData): BackupEndpointRequestData { - const state: BackupEndpointsConfig = Object.entries(this.state).reduce((res, [endpointId, endpoint]) => { + private createBodyToSend(sd: SessionData): BackupRequest { + const state: BackupEndpointsConfig = Object.entries(this.state).reduce((res, [endpointId, endpoint]) => { const { entity, ...rest } = endpoint; - const requestConfig: BackupEndpointConfigRequest = { + const requestConfig: BaseEndpointConfig = { ...rest, }; res[endpointId] = requestConfig; @@ -156,7 +154,7 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { return { state, userId: this.getUserIdFromSessionData(sd), - password: this.password + password: this.password, }; } diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts index ca3daa19b9..b0b977d388 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts @@ -1,31 +1,79 @@ import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; -import { BehaviorSubject, Observable } from 'rxjs'; +import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; import { GeneralEntityAppState } from '../../../../../store/src/app-state'; +import { selectSessionData } from '../../../../../store/src/reducers/auth.reducer'; +import { SessionData } from '../../../../../store/src/types/auth.types'; +import { LoggerService } from '../../../core/logger.service'; import { BrowserStandardEncoder } from '../../../helper'; import { BackupRestoreEndpointService } from './backup-restore-endpoints.service'; +interface BackupContent { + payload: string; + dbVersion: number; +} + interface RestoreEndpointsData { data: string; password: string; + ignoreDbVersion: boolean; } @Injectable() export class RestoreEndpointsService extends BackupRestoreEndpointService { - validFile = new BehaviorSubject(false); - validFile$ = this.validFile.asObservable(); + // Step 1 + validFileContent = new BehaviorSubject(false); + validFileContent$: Observable = this.validFileContent.asObservable(); + + file = new BehaviorSubject<{ + name: string, + content: BackupContent + }>(null); + file$ = this.file.asObservable(); + + validDb = new BehaviorSubject(false); + validDb$: Observable; + currentDbVersion$: Observable; + ignoreDbVersion = new BehaviorSubject(false); + ignoreDbVersion$ = this.ignoreDbVersion.asObservable(); + + // Step 2 password: string; // TODO: RC use set password in both services - fileName: string; - private fileContent: string; constructor( private store: Store, - private http: HttpClient + private http: HttpClient, + private logger: LoggerService ) { super(); + this.setupStep1(); + } + + private setupStep1() { + this.currentDbVersion$ = this.store.select(selectSessionData()).pipe( + map((sd: SessionData) => sd.version.database_version) + ); + + this.validDb$ = combineLatest([ + this.file$, + this.currentDbVersion$ + ]).pipe( + map(([file, currentDbVersion]) => { + return file && file.content.dbVersion === currentDbVersion; + }) + ); + + this.validFileContent$ = combineLatest([ + this.file$, + this.validDb$, + this.ignoreDbVersion$ + ]).pipe( + map(([file, validDb, ignoreDb]) => !!file && (ignoreDb || validDb)) + ); } setFile(file): Promise { @@ -43,17 +91,28 @@ export class RestoreEndpointsService extends BackupRestoreEndpointService { } private setFileResult(content: string, fileName: string) { - if (!!content) { - this.validFile.next(true); - this.fileName = fileName; - this.fileContent = content; + let parsedContent: BackupContent; + try { + parsedContent = JSON.parse(content); + } catch (e) { + this.logger.warn('Failed to parse file contents: ', e); + } + + if (!!parsedContent) { + this.file.next({ + name: fileName, + content: parsedContent + }); } else { - this.validFile.next(false); - this.fileName = ''; - this.fileContent = ''; + this.file.next(null); } + + // this.updateFileContentValidation(); } + setIgnoreDbVersion(ignore: boolean) { + this.ignoreDbVersion.next(ignore); + } restoreBackup(): Observable { const url = '/pp/v1/endpoints/restore'; @@ -62,15 +121,19 @@ export class RestoreEndpointsService extends BackupRestoreEndpointService { fromObject, encoder: new BrowserStandardEncoder() }); - return this.http.post(url, this.createBodyToSend(), { - params - }); - } - createBodyToSend(): RestoreEndpointsData { - return { - data: this.fileContent, - password: this.password - }; + return combineLatest([ + this.file$, + this.ignoreDbVersion$ + ]).pipe( + switchMap(([file, ignoreDb]) => { + const body: RestoreEndpointsData = { + data: JSON.stringify(file.content), + password: this.password, + ignoreDbVersion: ignoreDb + }; + return this.http.post(url, body, { params }); + }) + ); } } diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html index 7b9ef8f1f0..2611a539fd 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html @@ -3,15 +3,27 @@

Restore Endpoints

- +
-

Provide the backup file to restore from.

-
- Choose - - {{service.fileName}} +
+

Provide the backup file to restore from.

+
+ Choose + + {{file.name}} +
+ +
+

The database version of Stratos ({{service.currentDbVersion$ | async}}) and the backup + ({{file.content.dbVersion}}) are different. Restoring this file may have adverse affects. +

+ + Ignore different database versions + +
+
diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss index 89184f73a4..60b6ddd949 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss @@ -2,8 +2,13 @@ flex: 1; } .file-step { - display: flex; - flex-direction: column; + + &, + &__chunk { + display: flex; + flex-direction: column; + } + &__input { &--input { height: 0; 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 e35d5af48a..8762a498f2 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,11 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { Store } from '@ngrx/store'; +import { MatCheckboxChange } from '@angular/material'; import { Observable, of, Subject } from 'rxjs'; import { first, map, tap } from 'rxjs/operators'; -import { AppState } from '../../../../../../store/src/app-state'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { getEventFiles } from '../../../../core/browser-helper'; import { ConfirmationDialogConfig } from '../../../../shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../shared/components/confirmation-dialog.service'; @@ -21,11 +19,7 @@ import { RestoreEndpointsService } from '../restore-endpoints.service'; RestoreEndpointsService ] }) -export class RestoreEndpointsComponent implements OnInit { - - // Step 1 - fileValid$: Observable; - fileName: string; +export class RestoreEndpointsComponent { // Step 2 passwordValid$: Observable; @@ -33,29 +27,9 @@ export class RestoreEndpointsComponent implements OnInit { constructor( public service: RestoreEndpointsService, - store: Store, - paginationMonitorFactory: PaginationMonitorFactory, private confirmDialog: ConfirmationDialogService, ) { - - // const endpoints$ = of([]); - // this.endpointDataSource = { - // isTableLoading$: of(false), - // connect: () => endpoints$.pipe( - // map(endpoints => endpoints.sort((a, b) => a.name.localeCompare(b.name))) - // ), - // disconnect: () => { }, - // trackBy: (index, row) => row.guid - // }; - - this.setupFileStep(); - this.setupPasswordStep(); - - } - - setupFileStep() { - this.fileValid$ = this.service.validFile$; } setupPasswordStep() { @@ -70,33 +44,17 @@ export class RestoreEndpointsComponent implements OnInit { ); } - ngOnInit() { - } - onFileChange(event) { const files = getEventFiles(event); if (!files.length) { return; } const file = files[0]; - console.log(event, file); this.service.setFile(file); + } - // console.log(files); - // TODO: RC file load - get content of file - // TODO: RC file load - validate correct file - // TODO: RC file load - parse file - // TODO: RC file load - enable next step - - - // const utils = new DeployApplicationFsUtils(); - // utils.handleFileInputSelection(files).pipe( - // filter(res => !!res), - // first() - // ).subscribe((res) => { - // this.propagateChange(res); - // this.sourceData$.next(res); - // }); + onIgnoreDbChange(event: MatCheckboxChange) { + this.service.setIgnoreDbVersion(event.checked); } restore: StepOnNextFunction = () => { diff --git a/src/frontend/packages/store/src/reducers/auth.reducer.ts b/src/frontend/packages/store/src/reducers/auth.reducer.ts index 06294413ef..c8ae1c2dd7 100644 --- a/src/frontend/packages/store/src/reducers/auth.reducer.ts +++ b/src/frontend/packages/store/src/reducers/auth.reducer.ts @@ -103,5 +103,5 @@ export function authReducer(state: AuthState = defaultState, action): AuthState } export function selectSessionData() { - return (state: AuthOnlyAppState) => state.auth.sessionData; + return (state: AuthOnlyAppState): SessionData => state.auth.sessionData; } diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index 779645b1ba..d32e53fa6d 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -3,6 +3,7 @@ package main import ( "crypto/x509" "encoding/json" + "errors" "fmt" "io/ioutil" "net/http" @@ -646,25 +647,34 @@ const ( ) // TODO: RC position -type BackupDataRequest struct { - State map[string]BackupEndpointsState `json:"state"` - UserID string `json:"userId"` - Password string `json:"password"` -} - type BackupEndpointsState struct { Endpoint bool `json:"endpoint"` Connect BackupConnectionType `json:"connect"` } -type BackupRestoreState struct { +// Sent to backup +type BackupRequest struct { + State map[string]BackupEndpointsState `json:"state"` + UserID string `json:"userId"` + DBVersion string `json:"dbVersion"` + Password string `json:"password"` +} + +type BackupRequestEndpointsResponse struct { Endpoints []*interfaces.CNSIRecord Tokens []interfaces.BackupTokenRecord } -type RestoreDataRequest struct { - Data string `json:"data"` - Password string `json:"password"` +type BackupContent struct { + payload BackupRequestEndpointsResponse `json:"payload"` + DBVersion int64 `json:"dbVersion"` +} + +type RestoreRequest struct { + // Data - Encrypted version of BackupContent + Data string `json:"data"` + Password string `json:"password"` + IgnoreDbVersion bool `json:"ignoreDbVersion"` } // TODO: RC split out to new file? @@ -677,7 +687,7 @@ func (p *portalProxy) backupEndpoints(c echo.Context) error { return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") } - data := &BackupDataRequest{} + data := &BackupRequest{} if err = json.Unmarshal(body, data); err != nil { return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") } @@ -692,6 +702,8 @@ func (p *portalProxy) backupEndpoints(c echo.Context) error { return err } + log.Infof("response: %+v", response) + // Send back the response to the client // TODO: RC Missing client_secret when serialised, `-` in definition jsonString, err := json.Marshal(response) @@ -699,16 +711,15 @@ func (p *portalProxy) backupEndpoints(c echo.Context) error { return interfaces.NewHTTPError(http.StatusInternalServerError, "Failed to serialize response") } - // Encrypt data (see above) // TODO: RC leave until last - encryptedResponse := jsonString + log.Infof("jsonString: %+v", jsonString) // Return data c.Response().Header().Set("Content-Type", "application/json") - c.Response().Write(encryptedResponse) + c.Response().Write(jsonString) return nil } -func (p *portalProxy) createBackup(data *BackupDataRequest) (*BackupRestoreState, error) { +func (p *portalProxy) createBackup(data *BackupRequest) (*BackupContent, error) { log.Debug("createBackup") allEndpoints, err := p.ListEndpoints() if err != nil { @@ -807,11 +818,28 @@ func (p *portalProxy) createBackup(data *BackupDataRequest) (*BackupRestoreState // log.Infof("userTokenFrom: %+v", userTokenFrom) log.Infof("tokens: %+v", tokens) - response := &BackupRestoreState{ + payload := &BackupRequestEndpointsResponse{ Endpoints: endpoints, Tokens: tokens, } + // Encrypt data (see above) // TODO: RC leave until last + // encryptedPayload := payload + + versions, err := p.getVersionsData() + if err != nil { + return nil, errors.New("Could not find database version") + } + + // log.Infof("payload: %+v", payload) + + response := &BackupContent{ + payload: *payload, + DBVersion: versions.DatabaseVersion, + } + + // log.Infof("response: %+v", response) + return response, nil } @@ -854,18 +882,14 @@ func (p *portalProxy) restoreEndpoints(c echo.Context) error { return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") } - data := &RestoreDataRequest{} + data := &RestoreRequest{} if err = json.Unmarshal(body, data); err != nil { return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") } - backup := &BackupRestoreState{} - if err = json.Unmarshal([]byte(data.Data), backup); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid backup - could not parse JSON") - } - - err = p.restoreBackup(backup) + err = p.restoreBackup(data) if err != nil { + // TODO: RC write error? return err } @@ -875,14 +899,36 @@ func (p *portalProxy) restoreEndpoints(c echo.Context) error { } -func (p *portalProxy) restoreBackup(backup *BackupRestoreState) error { +func (p *portalProxy) restoreBackup(backup *RestoreRequest) error { log.Debug("restoreBackup") + + // TODO: RC check return types of these functions... if we return shadow error + + data := &BackupContent{} + if err := json.Unmarshal([]byte(backup.Data), backup); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid backup - could not parse JSON") + } + + if backup.IgnoreDbVersion == false { + versions, err := p.getVersionsData() + if err != nil { + return errors.New("Could not find database version") + } + + if versions.DatabaseVersion != data.DBVersion { + errorStr := fmt.Sprintf("Incompatible database versions. Expected %+v but got %+v", versions.DatabaseVersion, data.DBVersion) + return interfaces.NewHTTPShadowError(http.StatusBadRequest, errorStr, errorStr) + } + } + + unencryptedBackup := data.payload + cnsiRepo, err := cnsis.NewPostgresCNSIRepository(p.DatabaseConnectionPool) if err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) } - for _, endpoint := range backup.Endpoints { + for _, endpoint := range unencryptedBackup.Endpoints { if err := cnsiRepo.Overwrite(*endpoint, p.Config.EncryptionKeyInBytes); err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", endpoint.Name) } @@ -893,7 +939,7 @@ func (p *portalProxy) restoreBackup(backup *BackupRestoreState) error { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) } - for _, tr := range backup.Tokens { + for _, tr := range unencryptedBackup.Tokens { if err := tokenRepo.SaveCNSIToken(tr.EndpointGUID, tr.UserGUID, tr.TokenRecord, p.Config.EncryptionKeyInBytes); err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite token", "Failed to overwrite token: %+v", tr.TokenRecord.TokenGUID) } From a5cfd7a682446168c3d823596ecc7b6effc517f8 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Thu, 16 Apr 2020 15:39:55 +0100 Subject: [PATCH 022/176] Fix autoscaler issue with the mat-select fill --- protractor.conf.js | 4 ++-- src/test-e2e/po/form.po.ts | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/protractor.conf.js b/protractor.conf.js index dd282d35ae..ddd98076e7 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -199,10 +199,10 @@ const config = { }).getJasmine2Reporter()); jasmine.getEnv().addReporter(new SpecReporter({ spec: { - displayStacktrace: 'pretty', + displayStacktrace: 'raw', }, summary: { - displayStacktrace: 'pretty', + displayStacktrace: 'raw', }, customProcessors: specReporterCustomProcessors })); diff --git a/src/test-e2e/po/form.po.ts b/src/test-e2e/po/form.po.ts index f9697d2e42..6695d20590 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; @@ -109,6 +111,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(); @@ -229,7 +240,16 @@ export class FormComponent extends Component { ctrl.click(); const selectMenu = new Component(element(by.css('.mat-select-panel'))); selectMenu.waitUntilShown(); - selectMenu.all(by.tagName('mat-option')).map(this.mapField).then(options => { + // 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 + const containsSpace = strValue.indexOf(' '); + if (containsSpace >= 0) { + strValue = strValue.slice(0, containsSpace); + } + ctrl.sendKeys(strValue); + 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(); From 6b9e79a6b976af98ea282d52f28ff4eb6108df71 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Thu, 16 Apr 2020 16:08:04 +0100 Subject: [PATCH 023/176] Tidy up #1 --- .../backup-connection-cell.component.html | 2 +- .../backup-connection-cell.component.ts | 2 +- .../backup-endpoints.service.ts | 25 +- .../backup-endpoints.component.ts | 18 +- .../backup-restore-endpoints.service.ts | 48 --- .../backup-restore/backup-restore.types.ts | 25 ++ .../restore-endpoints.service.ts | 10 +- .../restore-endpoints.component.html | 7 +- .../restore-endpoints.component.ts | 8 +- .../packages/core/src/jetstream.helpers.ts | 17 + src/jetstream/cnsi.go | 336 +----------------- src/jetstream/cnsi_token_backup.go | 303 ++++++++++++++++ src/jetstream/repository/cnsis/pgsql_cnsis.go | 11 - .../repository/tokens/pgsql_tokens.go | 149 -------- src/jetstream/repository/tokens/tokens.go | 2 - 15 files changed, 397 insertions(+), 566 deletions(-) delete mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore.types.ts create mode 100644 src/jetstream/cnsi_token_backup.go diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html index 752618ca1a..818fadc297 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html @@ -2,7 +2,7 @@ None - Current User + Current User All Users \ No newline at end of file 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 60a5190361..528b256c22 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 @@ -3,7 +3,7 @@ import { Component } from '@angular/core'; import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; import { TableCellCustom } from '../../../../shared/components/list/list.types'; import { BackupEndpointsService } from '../backup-endpoints.service'; -import { BackupEndpointConnectionTypes, BackupEndpointTypes } from '../backup-restore-endpoints.service'; +import { BackupEndpointConnectionTypes, BackupEndpointTypes } from '../backup-restore.types'; @Component({ selector: 'app-backup-connection-cell', 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 51b4d4ecf5..ee1f06fc80 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 @@ -15,10 +15,8 @@ import { BackupEndpointConnectionTypes, BackupEndpointsConfig, BackupEndpointTypes, - BackupRestoreEndpointService, BaseEndpointConfig, -} from './backup-restore-endpoints.service'; - +} from './backup-restore.types'; interface BackupRequest { @@ -28,7 +26,7 @@ interface BackupRequest { } @Injectable() -export class BackupEndpointsService extends BackupRestoreEndpointService { +export class BackupEndpointsService { hasChanges = new BehaviorSubject(false); hasChanges$ = this.hasChanges.asObservable(); @@ -42,7 +40,6 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { private store: Store, private http: HttpClient ) { - super(); } // State Related @@ -106,7 +103,7 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { endpoint[BackupEndpointTypes.ENDPOINT] = true; } if (this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT)) { - endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.CURRENT; + endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.ALL; } }); this.validate(); @@ -120,6 +117,10 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { this.validate(); } + hasConnectionDetails(): boolean { + return !!Object.values(this.state).find(e => e[BackupEndpointTypes.CONNECT] !== BackupEndpointConnectionTypes.NONE); + } + // Request Related createBackup(): Observable { @@ -144,11 +145,13 @@ export class BackupEndpointsService extends BackupRestoreEndpointService { private createBodyToSend(sd: SessionData): BackupRequest { const state: BackupEndpointsConfig = Object.entries(this.state).reduce((res, [endpointId, endpoint]) => { - const { entity, ...rest } = endpoint; - const requestConfig: BaseEndpointConfig = { - ...rest, - }; - res[endpointId] = requestConfig; + if (endpoint[BackupEndpointTypes.ENDPOINT]) { + const { entity, ...rest } = endpoint; + const requestConfig: BaseEndpointConfig = { + ...rest, + }; + res[endpointId] = requestConfig; + } return res; }, {}); return { 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 a32fa6f617..882d6113f8 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 @@ -11,6 +11,7 @@ import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity 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'; +import { httpErrorResponseToSafeString } from '../../../../jetstream.helpers'; import { ConfirmationDialogConfig } from '../../../../shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../shared/components/confirmation-dialog.service'; import { ITableListDataSource } from '../../../../shared/components/list/data-sources-controllers/list-data-source-types'; @@ -19,7 +20,7 @@ import { StepOnNextFunction, StepOnNextResult } from '../../../../shared/compone import { BackupConnectionCellComponent } from '../backup-connection-cell/backup-connection-cell.component'; import { BackupEndpointsService } from '../backup-endpoints.service'; import { BackupRestoreCellComponent } from '../backup-restore-cell/backup-restore-cell.component'; -import { BackupEndpointTypes } from '../backup-restore-endpoints.service'; +import { BackupEndpointTypes } from '../backup-restore.types'; @Component({ selector: 'app-backup-endpoints', @@ -133,10 +134,9 @@ export class BackupEndpointsComponent implements OnInit { } onNext: StepOnNextFunction = () => { - // TODO: RC Complete/Finish token warning const confirmation = new ConfirmationDialogConfig( 'Backup', - 'Backing up connection details ?????????', + 'This backup contains endpoint connection details. The contents will be encrypted, but please still ensure the safety of the file', 'Continue', true ); @@ -157,13 +157,14 @@ export class BackupEndpointsComponent implements OnInit { const downloadURL = window.URL.createObjectURL(data); const link = document.createElement('a'); link.href = downloadURL; - const dateTime = moment().format('YYYYMMDD-HHmmss'); // TODO: RC timezone? + // Time of client, not server + const dateTime = moment().format('YYYYMMDD-HHmmss'); link.download = `stratos_backup_${dateTime}.bk`; link.click(); }; const backupFailure = err => { - const errorMessage = this.service.createError(err); + const errorMessage = httpErrorResponseToSafeString(err); result.next({ success: false, message: `Failed to create backup` + (errorMessage ? `: ${errorMessage}` : '') @@ -173,8 +174,11 @@ export class BackupEndpointsComponent implements OnInit { const createBackup = () => this.service.createBackup().pipe(first()).subscribe(backupSuccess, backupFailure); - // TODO: RC tie in progress indicator (not sure if possible) - this.confirmDialog.openWithCancel(confirmation, createBackup, userCancelledDialog); + if (this.service.hasConnectionDetails()) { + this.confirmDialog.openWithCancel(confirmation, createBackup, userCancelledDialog); + } else { + createBackup(); + } // TODO: RC Remove console.log return result.asObservable().pipe(tap(console.log)); diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts deleted file mode 100644 index abb46f3628..0000000000 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { HttpErrorResponse } from '@angular/common/http'; - -import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; -import { isHttpErrorResponse } from '../../../jetstream.helpers'; - -// TODO: RC move to types - -export enum BackupEndpointTypes { - ENDPOINT = 'endpoint', - CONNECT = 'connect', -} - -export enum BackupEndpointConnectionTypes { - NONE = 'NONE', - CURRENT = 'CURRENT', - ALL = 'ALL' -} - -export interface BackupEndpointsConfig { - [endpointId: string]: T; -} - -export interface BaseEndpointConfig { - [BackupEndpointTypes.ENDPOINT]: boolean; - [BackupEndpointTypes.CONNECT]: BackupEndpointConnectionTypes; -} - -export interface BackupEndpointConfigUI extends BaseEndpointConfig { - entity: EndpointModel; -} - -export class BackupRestoreEndpointService { - - createError(err: any): string { - // TODO: RC tidy. move generic - const httpResponse: HttpErrorResponse = isHttpErrorResponse(err); - if (httpResponse) { - if (httpResponse.error) { - if (typeof (httpResponse.error) === 'string') { - return httpResponse.error + ` (${httpResponse.status})`; - } - return httpResponse.error.error + ` (${httpResponse.status})`; - } - return JSON.stringify(httpResponse.error) + ` (${httpResponse.status})`; - } - return err.message; - } -} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore.types.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore.types.ts new file mode 100644 index 0000000000..edda11d612 --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore.types.ts @@ -0,0 +1,25 @@ +import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; + +export enum BackupEndpointTypes { + ENDPOINT = 'endpoint', + CONNECT = 'connect', +} + +export enum BackupEndpointConnectionTypes { + NONE = 'NONE', + CURRENT = 'CURRENT', + ALL = 'ALL' +} + +export interface BackupEndpointsConfig { + [endpointId: string]: T; +} + +export interface BaseEndpointConfig { + [BackupEndpointTypes.ENDPOINT]: boolean; + [BackupEndpointTypes.CONNECT]: BackupEndpointConnectionTypes; +} + +export interface BackupEndpointConfigUI extends BaseEndpointConfig { + entity: EndpointModel; +} diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts index b0b977d388..50d678f33d 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts @@ -9,7 +9,6 @@ import { selectSessionData } from '../../../../../store/src/reducers/auth.reduce import { SessionData } from '../../../../../store/src/types/auth.types'; import { LoggerService } from '../../../core/logger.service'; import { BrowserStandardEncoder } from '../../../helper'; -import { BackupRestoreEndpointService } from './backup-restore-endpoints.service'; interface BackupContent { payload: string; @@ -23,7 +22,7 @@ interface RestoreEndpointsData { } @Injectable() -export class RestoreEndpointsService extends BackupRestoreEndpointService { +export class RestoreEndpointsService { // Step 1 validFileContent = new BehaviorSubject(false); @@ -42,14 +41,13 @@ export class RestoreEndpointsService extends BackupRestoreEndpointService { ignoreDbVersion$ = this.ignoreDbVersion.asObservable(); // Step 2 - password: string; // TODO: RC use set password in both services + private password: string; constructor( private store: Store, private http: HttpClient, private logger: LoggerService ) { - super(); this.setupStep1(); } @@ -114,6 +112,10 @@ export class RestoreEndpointsService extends BackupRestoreEndpointService { this.ignoreDbVersion.next(ignore); } + setPassword(password: string) { + this.password = password; + } + restoreBackup(): Observable { const url = '/pp/v1/endpoints/restore'; const fromObject = {}; diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html index 2611a539fd..c99ad6600f 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html @@ -31,7 +31,12 @@

Restore Endpoints

Provide the password that was given at the time the backup was created

- + Password + +
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 8762a498f2..bfd419aad2 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 @@ -5,6 +5,7 @@ import { Observable, of, Subject } from 'rxjs'; import { first, map, tap } from 'rxjs/operators'; import { getEventFiles } from '../../../../core/browser-helper'; +import { httpErrorResponseToSafeString } from '../../../../jetstream.helpers'; import { ConfirmationDialogConfig } from '../../../../shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../shared/components/confirmation-dialog.service'; import { StepOnNextFunction, StepOnNextResult } from '../../../../shared/components/stepper/step/step.component'; @@ -24,6 +25,7 @@ export class RestoreEndpointsComponent { // Step 2 passwordValid$: Observable; passwordForm: FormGroup; + show = false; constructor( public service: RestoreEndpointsService, @@ -38,7 +40,7 @@ export class RestoreEndpointsComponent { }); this.passwordValid$ = this.passwordForm.statusChanges.pipe( map(() => { - this.service.password = this.passwordForm.controls.password.value; + this.service.setPassword(this.passwordForm.controls.password.value); return this.passwordForm.valid; }) ); @@ -80,18 +82,16 @@ export class RestoreEndpointsComponent { }; const backupFailure = err => { - const errorMessage = this.service.createError(err); + const errorMessage = httpErrorResponseToSafeString(err); result.next({ success: false, message: `Failed to restore backup` + (errorMessage ? `: ${errorMessage}` : '') }); return of(false); }; - // TODO: RC make generic in base const createBackup = () => this.service.restoreBackup().pipe(first()).subscribe(restoreSuccess, backupFailure); - // TODO: RC tie in progress indicator (not sure if possible) this.confirmDialog.openWithCancel(confirmation, createBackup, userCancelledDialog); // TODO: RC Remove console.log diff --git a/src/frontend/packages/core/src/jetstream.helpers.ts b/src/frontend/packages/core/src/jetstream.helpers.ts index 36bbac53ea..1a29978099 100644 --- a/src/frontend/packages/core/src/jetstream.helpers.ts +++ b/src/frontend/packages/core/src/jetstream.helpers.ts @@ -53,3 +53,20 @@ export function isHttpErrorResponse(obj: any): HttpErrorResponse { ) ? obj as HttpErrorResponse : null; } +/** + * Attempt to create a sensible string explaining the error object returned from a failed http request + * @param err The raw error from a http request + */ +export function httpErrorResponseToSafeString(err: any): string { + const httpResponse: HttpErrorResponse = isHttpErrorResponse(err); + if (httpResponse) { + if (httpResponse.error) { + if (typeof (httpResponse.error) === 'string') { + return httpResponse.error + ` (${httpResponse.status})`; + } + return httpResponse.error.error + ` (${httpResponse.status})`; + } + return JSON.stringify(httpResponse.error) + ` (${httpResponse.status})`; + } + return err.message; +} diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index d32e53fa6d..f5c6c501a3 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -3,9 +3,7 @@ package main import ( "crypto/x509" "encoding/json" - "errors" "fmt" - "io/ioutil" "net/http" "net/url" "strconv" @@ -638,340 +636,24 @@ func (p *portalProxy) updateEndpoint(c echo.Context) error { return nil } -type BackupConnectionType string - -const ( - BACKUP_CONNECTION_NONE BackupConnectionType = "NONE" - BACKUP_CONNECTION_CURRENT = "CURRENT" - BACKUP_CONNECTION_ALL = "ALL" -) - -// TODO: RC position -type BackupEndpointsState struct { - Endpoint bool `json:"endpoint"` - Connect BackupConnectionType `json:"connect"` -} - -// Sent to backup -type BackupRequest struct { - State map[string]BackupEndpointsState `json:"state"` - UserID string `json:"userId"` - DBVersion string `json:"dbVersion"` - Password string `json:"password"` -} - -type BackupRequestEndpointsResponse struct { - Endpoints []*interfaces.CNSIRecord - Tokens []interfaces.BackupTokenRecord -} - -type BackupContent struct { - payload BackupRequestEndpointsResponse `json:"payload"` - DBVersion int64 `json:"dbVersion"` -} - -type RestoreRequest struct { - // Data - Encrypted version of BackupContent - Data string `json:"data"` - Password string `json:"password"` - IgnoreDbVersion bool `json:"ignoreDbVersion"` -} - -// TODO: RC split out to new file? func (p *portalProxy) backupEndpoints(c echo.Context) error { - log.Debug("backupEndpoints") - - // Check we can unmarshall the request - body, err := ioutil.ReadAll(c.Request().Body) - if err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") - } - - data := &BackupRequest{} - if err = json.Unmarshal(body, data); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") - } - // log.Infof("BODY: %+v", data) - - if data.State == nil || len(data.State) == 0 { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - no endpoints to backup") - } - - response, err := p.createBackup(data) - if err != nil { - return err - } - - log.Infof("response: %+v", response) - - // Send back the response to the client - // TODO: RC Missing client_secret when serialised, `-` in definition - jsonString, err := json.Marshal(response) - if err != nil { - return interfaces.NewHTTPError(http.StatusInternalServerError, "Failed to serialize response") - } - - log.Infof("jsonString: %+v", jsonString) - - // Return data - c.Response().Header().Set("Content-Type", "application/json") - c.Response().Write(jsonString) - return nil -} - -func (p *portalProxy) createBackup(data *BackupRequest) (*BackupContent, error) { - log.Debug("createBackup") - allEndpoints, err := p.ListEndpoints() - if err != nil { - return nil, interfaces.NewHTTPError(http.StatusBadGateway, "Failed to fetch endpoints") - } - - // Fetch/Format required data - endpoints := make([]*interfaces.CNSIRecord, 0) - // allTokensFrom := make([]string, 0) - // userTokenFrom := make([]string, 0) - tokens := make([]interfaces.BackupTokenRecord, 0) - - for endpointID, endpoint := range data.State { - - if !endpoint.Endpoint { - continue - } - - for _, e := range allEndpoints { - if endpointID == e.GUID { - endpoints = append(endpoints, e) - break - } - } - - switch connectionType := endpoint.Connect; connectionType { - case BACKUP_CONNECTION_ALL: - // allTokensFrom = append(allTokensFrom, endpointID) - if tokenRecords, ok := p.getCNSITokenRecordsBackup(endpointID); ok { - log.Warn("tokens for AllConnect") - tokens = append(tokens, tokenRecords...) - } else { - log.Warn("No tokens for AllConnect") - // TODO: RC - } - case BACKUP_CONNECTION_CURRENT: - // userTokenFrom = append(userTokenFrom, endpointID) - if tokenRecord, ok := p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { - log.Warn("tokens for Connect") - // var btr BackupTokenRecord - // TODO: RC Q This will be the linked token as if it were the users token - var btr = interfaces.BackupTokenRecord{ - // tokenRecord: tokenRecord, - TokenRecord: tokenRecord, - EndpointGUID: endpointID, - TokenType: "CNSI", - UserGUID: data.UserID, - } - - tokens = append(tokens, btr) - } else { - log.Warnf("No tokens for Connect: %+v,%+v", endpointID, data.UserID) - // TODO: RC - // msg := "Unable to retrieve CNSI token record." - // log.Debug(msg) - // return nil, nil, false - } - } - - // if endpoint.Connect == BACKUP_CONNECTION_ALL { - // // allTokensFrom = append(allTokensFrom, endpointID) - // if tokenRecords, ok := p.getCNSITokenRecordsBackup(endpointID); ok { - // log.Warn("tokens for AllConnect") - // tokens = append(tokens, tokenRecords...) - // } else { - // log.Warn("No tokens for AllConnect") - // // TODO: RC - // } - // } else if endpoint.Connect { - // // userTokenFrom = append(userTokenFrom, endpointID) - // if tokenRecord, ok := p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { - // log.Warn("tokens for Connect") - // // var btr BackupTokenRecord - // // TODO: RC Q This will be the linked token as if it were the users token - // var btr = interfaces.BackupTokenRecord{ - // // tokenRecord: tokenRecord, - // TokenRecord: tokenRecord, - // EndpointGUID: endpointID, - // TokenType: "CNSI", - // UserGUID: data.UserID, - // } - - // tokens = append(tokens, btr) - // } else { - // log.Warnf("No tokens for Connect: %+v,%+v", endpointID, data.UserID) - // // TODO: RC - // // msg := "Unable to retrieve CNSI token record." - // // log.Debug(msg) - // // return nil, nil, false - // } - // } - } - - log.Infof("endpoints: %+v", endpoints) - // log.Infof("allTokensFrom: %+v", allTokensFrom) - // log.Infof("userTokenFrom: %+v", userTokenFrom) - log.Infof("tokens: %+v", tokens) - - payload := &BackupRequestEndpointsResponse{ - Endpoints: endpoints, - Tokens: tokens, - } + log.Debug("BackupEndpoints") - // Encrypt data (see above) // TODO: RC leave until last - // encryptedPayload := payload - - versions, err := p.getVersionsData() - if err != nil { - return nil, errors.New("Could not find database version") - } - - // log.Infof("payload: %+v", payload) - - response := &BackupContent{ - payload: *payload, - DBVersion: versions.DatabaseVersion, - } - - // log.Infof("response: %+v", response) - - return response, nil -} - -// func (p *portalProxy) GetCNSITokens(cnsiGUID string) ([]interfaces.TokenRecord, bool) { -// log.Debug("GetCNSITokens") -// tokenRepo, err := tokens.NewPgsqlTokenRepository(p.DatabaseConnectionPool) -// if err != nil { -// return make([]interfaces.TokenRecord, 0), false -// } - -// trs, err := tokenRepo.FindAllCNSITokenIncludeDisconnected(cnsiGUID, p.Config.EncryptionKeyInBytes) -// if err != nil { -// return make([]interfaces.TokenRecord, 0), false -// } - -// return trs, true -// } - -func (p *portalProxy) getCNSITokenRecordsBackup(endpointID string) ([]interfaces.BackupTokenRecord, bool) { - log.Debug("getCNSITokenRecordsBackup") - tokenRepo, err := tokens.NewPgsqlTokenRepository(p.DatabaseConnectionPool) - if err != nil { - return make([]interfaces.BackupTokenRecord, 0), false - } - - trs, err := tokenRepo.FindAllCNSITokenBackup(endpointID, p.Config.EncryptionKeyInBytes) - if err != nil { - return make([]interfaces.BackupTokenRecord, 0), false + ctb := &cnsiTokenBackup{ + databaseConnectionPool: p.DatabaseConnectionPool, + p: p, } - return trs, true + return ctb.BackupEndpoints(c) } func (p *portalProxy) restoreEndpoints(c echo.Context) error { log.Debug("restoreEndpoints") - // Check we can unmarshall the request - body, err := ioutil.ReadAll(c.Request().Body) - if err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") - } - - data := &RestoreRequest{} - if err = json.Unmarshal(body, data); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") - } - - err = p.restoreBackup(data) - if err != nil { - // TODO: RC write error? - return err - } - - // log.Warnf("BACKUP DATA: %+v", backup) - c.Response().WriteHeader(http.StatusOK) - return nil - -} - -func (p *portalProxy) restoreBackup(backup *RestoreRequest) error { - log.Debug("restoreBackup") - - // TODO: RC check return types of these functions... if we return shadow error - - data := &BackupContent{} - if err := json.Unmarshal([]byte(backup.Data), backup); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid backup - could not parse JSON") - } - - if backup.IgnoreDbVersion == false { - versions, err := p.getVersionsData() - if err != nil { - return errors.New("Could not find database version") - } - - if versions.DatabaseVersion != data.DBVersion { - errorStr := fmt.Sprintf("Incompatible database versions. Expected %+v but got %+v", versions.DatabaseVersion, data.DBVersion) - return interfaces.NewHTTPShadowError(http.StatusBadRequest, errorStr, errorStr) - } - } - - unencryptedBackup := data.payload - - cnsiRepo, err := cnsis.NewPostgresCNSIRepository(p.DatabaseConnectionPool) - if err != nil { - return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) - } - - for _, endpoint := range unencryptedBackup.Endpoints { - if err := cnsiRepo.Overwrite(*endpoint, p.Config.EncryptionKeyInBytes); err != nil { - return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", endpoint.Name) - } - } - - tokenRepo, err := tokens.NewPgsqlTokenRepository(p.DatabaseConnectionPool) - if err != nil { - return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) + ctb := &cnsiTokenBackup{ + databaseConnectionPool: p.DatabaseConnectionPool, + p: p, } - for _, tr := range unencryptedBackup.Tokens { - if err := tokenRepo.SaveCNSIToken(tr.EndpointGUID, tr.UserGUID, tr.TokenRecord, p.Config.EncryptionKeyInBytes); err != nil { - return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite token", "Failed to overwrite token: %+v", tr.TokenRecord.TokenGUID) - } - } - - return nil + return ctb.RestoreEndpoints(c) } - -// find := func(a interfaces.CNSIRecord) bool { -// return endpointID == a.GUID -// } - -// endpointPos := sliceContainsFn(find, allEndpoints) -// if endpointPos >= 0 { -// endpoints = append(endpoints, endpoints[endpointPos]) -// } - -// // TODO:RC pos -// func sliceContains(what interface{}, where []interface{}) (idx int) { -// for i, v := range where { -// if v == what { -// return i -// } -// } -// return -1 -// } - -// func sliceContainsFn(is func(a interface{}) bool, where []interface{}) (idx int) { -// for i, v := range where { -// if is(v) { -// return i -// } -// } -// return -1 -// } diff --git a/src/jetstream/cnsi_token_backup.go b/src/jetstream/cnsi_token_backup.go new file mode 100644 index 0000000000..8e23318e48 --- /dev/null +++ b/src/jetstream/cnsi_token_backup.go @@ -0,0 +1,303 @@ +package main + +import ( + "database/sql" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + + "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/cnsis" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/interfaces" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/tokens" + "github.com/labstack/echo" + log "github.com/sirupsen/logrus" +) + +type cnsiTokenBackup struct { + databaseConnectionPool *sql.DB + p *portalProxy +} + +// BackupConnectionType - Determine what kind of connection details are stored for an endpoint +type BackupConnectionType string + +const ( + BACKUP_CONNECTION_NONE BackupConnectionType = "NONE" + BACKUP_CONNECTION_CURRENT = "CURRENT" + BACKUP_CONNECTION_ALL = "ALL" +) + +// BackupEndpointsState - For a given endpoint define what's backed up +type BackupEndpointsState struct { + Endpoint bool `json:"endpoint"` + Connect BackupConnectionType `json:"connect"` +} + +// BackupRequest - Request from client to create a back up file +type BackupRequest struct { + State map[string]BackupEndpointsState `json:"state"` + UserID string `json:"userId"` + DBVersion string `json:"dbVersion"` + Password string `json:"password"` +} + +// BackupContentPayload - Encrypted part of the backup +type BackupContentPayload struct { + Endpoints []*interfaces.CNSIRecord + Tokens []interfaces.BackupTokenRecord +} + +// BackupContent - Everything that's backed up and stored in a file client side +type BackupContent struct { + Payload BackupContentPayload `json:"payload"` + DBVersion int64 `json:"dbVersion"` +} + +// RestoreRequest - Request from client to restore content from payload +type RestoreRequest struct { + // Payload - Encrypted version of BackupContent + Payload string `json:"data"` + Password string `json:"password"` + IgnoreDbVersion bool `json:"ignoreDbVersion"` +} + +func (ctb *cnsiTokenBackup) BackupEndpoints(c echo.Context) error { + log.Debug("BackupEndpoints") + + // Check we can unmarshall the request + body, err := ioutil.ReadAll(c.Request().Body) + if err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") + } + + data := &BackupRequest{} + if err = json.Unmarshal(body, data); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") + } + + if data.State == nil || len(data.State) == 0 { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - no endpoints to backup") + } + + response, err := ctb.createBackup(data) + if err != nil { + return err + } + + log.Infof("response: %+v", response) // TODO: RC REMOVE + + // Send back the response to the client + // TODO: RC Missing client_secret when serialised, `-` in definition + jsonString, err := json.Marshal(response) + if err != nil { + return interfaces.NewHTTPError(http.StatusInternalServerError, "Failed to serialize response") + } + + log.Infof("jsonString: %+v", jsonString) // TODO: RC REMOVE + + // Return data + c.Response().Header().Set("Content-Type", "application/json") + c.Response().Write(jsonString) + return nil +} + +func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, error) { + log.Debug("createBackup") + allEndpoints, err := ctb.p.ListEndpoints() + if err != nil { + return nil, interfaces.NewHTTPError(http.StatusBadGateway, "Failed to fetch endpoints") + } + + // Fetch/Format required data + endpoints := make([]*interfaces.CNSIRecord, 0) + tokens := make([]interfaces.BackupTokenRecord, 0) + + for endpointID, endpoint := range data.State { + + if !endpoint.Endpoint { + continue + } + + for _, e := range allEndpoints { + if endpointID == e.GUID { + endpoints = append(endpoints, e) + break + } + } + + switch connectionType := endpoint.Connect; connectionType { + case BACKUP_CONNECTION_ALL: + // allTokensFrom = append(allTokensFrom, endpointID) + if tokenRecords, ok := ctb.getCNSITokenRecordsBackup(endpointID); ok { + log.Warn("tokens for AllConnect") // TODO: RC REMOVE + tokens = append(tokens, tokenRecords...) + } else { + log.Warn("No tokens for AllConnect") // TODO: RC REMOVE + } + case BACKUP_CONNECTION_CURRENT: + // userTokenFrom = append(userTokenFrom, endpointID) + if tokenRecord, ok := ctb.p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { + log.Warn("tokens for Connect") + // TODO: RC Q This will be the linked token as if it were the users token + var btr = interfaces.BackupTokenRecord{ + // tokenRecord: tokenRecord, + TokenRecord: tokenRecord, + EndpointGUID: endpointID, + TokenType: "CNSI", + UserGUID: data.UserID, + } + + tokens = append(tokens, btr) + } else { + log.Infof("Request to back up connected user's (%+v) token for endpoint (%+v) failed. No token for user.", endpointID, data.UserID) + } + } + + } + + log.Infof("endpoints: %+v", endpoints) // TODO: RC REMOVE + log.Infof("tokens: %+v", tokens) // TODO: RC REMOVE + + payload := &BackupContentPayload{ + Endpoints: endpoints, + Tokens: tokens, + } + + // Encrypt data (see above) // TODO: RC leave until last + // encryptedPayload := payload + + versions, err := ctb.p.getVersionsData() + if err != nil { + return nil, errors.New("Could not find database version") + } + + // log.Infof("payload: %+v", payload) + + response := &BackupContent{ + Payload: *payload, + DBVersion: versions.DatabaseVersion, + } + + // log.Infof("response: %+v", response) + + return response, nil +} + +func (ctb *cnsiTokenBackup) getCNSITokenRecordsBackup(endpointID string) ([]interfaces.BackupTokenRecord, bool) { + log.Debug("getCNSITokenRecordsBackup") + tokenRepo, err := tokens.NewPgsqlTokenRepository(ctb.databaseConnectionPool) + if err != nil { + return make([]interfaces.BackupTokenRecord, 0), false + } + + trs, err := tokenRepo.FindAllCNSITokenBackup(endpointID, ctb.p.Config.EncryptionKeyInBytes) + if err != nil { + return make([]interfaces.BackupTokenRecord, 0), false + } + + return trs, true +} + +func (ctb *cnsiTokenBackup) RestoreEndpoints(c echo.Context) error { + log.Debug("RestoreEndpoints") + + // Check we can unmarshall the request + body, err := ioutil.ReadAll(c.Request().Body) + if err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") + } + + data := &RestoreRequest{} + if err = json.Unmarshal(body, data); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") + } + + err = ctb.restoreBackup(data) + if err != nil { + return err + } + + // log.Warnf("BACKUP DATA: %+v", backup) // TODO: RC REMOVE + c.Response().WriteHeader(http.StatusOK) + return nil + +} + +func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { + log.Debug("restoreBackup") + + // TODO: RC Q all errors are NewHTTPError + + data := &BackupContent{} + if err := json.Unmarshal([]byte(backup.Payload), backup); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid backup - could not parse JSON") + } + + if backup.IgnoreDbVersion == false { + versions, err := ctb.p.getVersionsData() + if err != nil { + return errors.New("Could not find database version") + } + + if versions.DatabaseVersion != data.DBVersion { + errorStr := fmt.Sprintf("Incompatible database versions. Expected %+v but got %+v", versions.DatabaseVersion, data.DBVersion) + return interfaces.NewHTTPShadowError(http.StatusBadRequest, errorStr, errorStr) + } + } + + unencryptedBackup := data.Payload + + cnsiRepo, err := cnsis.NewPostgresCNSIRepository(ctb.databaseConnectionPool) + if err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) + } + + for _, endpoint := range unencryptedBackup.Endpoints { + if err := cnsiRepo.Overwrite(*endpoint, ctb.p.Config.EncryptionKeyInBytes); err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", endpoint.Name) + } + } + + tokenRepo, err := tokens.NewPgsqlTokenRepository(ctb.databaseConnectionPool) + if err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) + } + + for _, tr := range unencryptedBackup.Tokens { + if err := tokenRepo.SaveCNSIToken(tr.EndpointGUID, tr.UserGUID, tr.TokenRecord, ctb.p.Config.EncryptionKeyInBytes); err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite token", "Failed to overwrite token: %+v", tr.TokenRecord.TokenGUID) + } + } + + return nil +} + +// find := func(a interfaces.CNSIRecord) bool { +// return endpointID == a.GUID +// } + +// endpointPos := sliceContainsFn(find, allEndpoints) +// if endpointPos >= 0 { +// endpoints = append(endpoints, endpoints[endpointPos]) +// } + +// // TODO:RC pos +// func sliceContains(what interface{}, where []interface{}) (idx int) { +// for i, v := range where { +// if v == what { +// return i +// } +// } +// return -1 +// } + +// func sliceContainsFn(is func(a interface{}) bool, where []interface{}) (idx int) { +// for i, v := range where { +// if is(v) { +// return i +// } +// } +// return -1 +// } diff --git a/src/jetstream/repository/cnsis/pgsql_cnsis.go b/src/jetstream/repository/cnsis/pgsql_cnsis.go index 6ba5344004..9582f3e1a4 100644 --- a/src/jetstream/repository/cnsis/pgsql_cnsis.go +++ b/src/jetstream/repository/cnsis/pgsql_cnsis.go @@ -363,21 +363,10 @@ func (p *PostgresCNSIRepository) Overwrite(endpoint interfaces.CNSIRecord, encry log.Errorf("Unknown error attempting to find CNSI: %v", err) } - // if _, err := p.Find(endpoint.GUID, encryptionKey); err != nil { - // // Found, so update endpoint - // // TODO: RC ALL STRINGS? - // return p.Update(endpoint, encryptionKey) - // } else { - // // Not Found, create endpoint - // return p.Save(endpoint.GUID, endpoint, encryptionKey) - // // TODO: RC Q could actually be error - // } - switch count { case 0: return p.Save(endpoint.GUID, endpoint, encryptionKey) default: - return p.Update(endpoint, encryptionKey) } } diff --git a/src/jetstream/repository/tokens/pgsql_tokens.go b/src/jetstream/repository/tokens/pgsql_tokens.go index ddb7dfc3f3..427541747c 100644 --- a/src/jetstream/repository/tokens/pgsql_tokens.go +++ b/src/jetstream/repository/tokens/pgsql_tokens.go @@ -43,15 +43,6 @@ var findCNSITokenConnected = `SELECT token_guid, auth_token, refresh_token, toke FROM tokens WHERE cnsi_guid = $1 AND (user_guid = $2 OR user_guid = $3) AND token_type = 'cnsi' AND disconnected = '0'` -// TODO: RC -var findAllCNSIToken2 = `SELECT token_guid, auth_token, refresh_token, token_expiry, disconnected, auth_type, meta_data, user_guid, linked_token - FROM tokens - WHERE cnsi_guid = $1 AND token_type = 'cnsi'` - -var findAllCNSITokenConnected = `SELECT token_guid, auth_token, refresh_token, token_expiry, disconnected, auth_type, meta_data, user_guid, linked_token - FROM tokens - WHERE cnsi_guid = $1 AND token_type = 'cnsi' AND disconnected = '0'` - var findAllCNSIToken = `SELECT user_guid, token_guid, auth_token, refresh_token, token_expiry, disconnected, auth_type, meta_data, user_guid, linked_token FROM tokens WHERE cnsi_guid = $1 AND token_type = 'cnsi'` @@ -95,15 +86,12 @@ func InitRepositoryProvider(databaseProvider string) { updateAuthToken = datastore.ModifySQLStatement(updateAuthToken, databaseProvider) findCNSIToken = datastore.ModifySQLStatement(findCNSIToken, databaseProvider) findCNSITokenConnected = datastore.ModifySQLStatement(findCNSITokenConnected, databaseProvider) - findAllCNSIToken2 = datastore.ModifySQLStatement(findAllCNSIToken2, databaseProvider) - findAllCNSITokenConnected = datastore.ModifySQLStatement(findAllCNSITokenConnected, databaseProvider) countCNSITokens = datastore.ModifySQLStatement(countCNSITokens, databaseProvider) insertCNSIToken = datastore.ModifySQLStatement(insertCNSIToken, databaseProvider) updateCNSIToken = datastore.ModifySQLStatement(updateCNSIToken, databaseProvider) deleteCNSIToken = datastore.ModifySQLStatement(deleteCNSIToken, databaseProvider) deleteCNSITokens = datastore.ModifySQLStatement(deleteCNSITokens, databaseProvider) updateToken = datastore.ModifySQLStatement(updateToken, databaseProvider) - findAllCNSIToken = datastore.ModifySQLStatement(findAllCNSIToken, databaseProvider) } // saveAuthToken - Save the Auth token to the datastore @@ -329,129 +317,6 @@ func (p *PgsqlTokenRepository) SaveCNSIToken(cnsiGUID string, userGUID string, t return nil } -// TODO: RC remove all `all` -func (p *PgsqlTokenRepository) FindAllCNSIToken(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) { - log.Debug("FindAllCNSIToken") - return p.findAllCNSIToken(cnsiGUID, encryptionKey, false) -} - -func (p *PgsqlTokenRepository) FindAllCNSITokenIncludeDisconnected(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) { - log.Debug("FindAllCNSITokenIncludeDisconnected") - return p.findAllCNSIToken(cnsiGUID, encryptionKey, true) -} - -func (p *PgsqlTokenRepository) findAllCNSIToken(cnsiGUID string, encryptionKey []byte, includeDisconnected bool) ([]interfaces.TokenRecord, error) { - log.Debug("findAllCNSIToken") - if cnsiGUID == "" { - msg := "Unable to find CNSI Token without a valid CNSI GUID." - log.Debug(msg) - return make([]interfaces.TokenRecord, 0), errors.New(msg) - } - - var rows *sql.Rows - var err error - if includeDisconnected { - rows, err = p.db.Query(findAllCNSIToken, cnsiGUID) - } else { - rows, err = p.db.Query(findAllCNSITokenConnected, cnsiGUID) - } - if err != nil { - msg := "Unable to Find All CNSI tokens: %v" - if err == sql.ErrNoRows { - log.Debugf(msg, err) - } else { - log.Errorf(msg, err) - } - return make([]interfaces.TokenRecord, 0), fmt.Errorf(msg, err) - } - - // TODO: RC Q should this close come before returning? it doesn't in cnsi List(encryptionKey []byte) ([]*interfaces.CNSIRecord, error) { - defer rows.Close() - - trs := make([]interfaces.TokenRecord, 0) - for rows.Next() { - // temp vars to retrieve db data - var ( - tokenGUID sql.NullString - ciphertextAuthToken []byte - ciphertextRefreshToken []byte - tokenExpiry sql.NullInt64 - disconnected bool - authType string - metadata sql.NullString - tokenUserGUID sql.NullString - linkedTokenGUID sql.NullString - ) - err = rows.Scan(&tokenGUID, &ciphertextAuthToken, &ciphertextRefreshToken, &tokenExpiry, &disconnected, &authType, &metadata, &tokenUserGUID, &linkedTokenGUID) - if err != nil { - return nil, fmt.Errorf("Unable to scan CNSI records: %v", err) - } - - log.Debug("Decrypting Auth Token") - plaintextAuthToken, err := crypto.DecryptToken(encryptionKey, ciphertextAuthToken) - if err != nil { - return make([]interfaces.TokenRecord, 0), err - } - - log.Debug("Decrypting Refresh Token") - plaintextRefreshToken, err := crypto.DecryptToken(encryptionKey, ciphertextRefreshToken) - if err != nil { - return make([]interfaces.TokenRecord, 0), err - } - - // Build a new TokenRecord based on the decrypted tokens - tr := new(interfaces.TokenRecord) - if tokenGUID.Valid { - tr.TokenGUID = tokenGUID.String - } - tr.AuthToken = plaintextAuthToken - tr.RefreshToken = plaintextRefreshToken - if tokenExpiry.Valid { - tr.TokenExpiry = tokenExpiry.Int64 - } - tr.Disconnected = disconnected - tr.AuthType = authType - if metadata.Valid { - tr.Metadata = metadata.String - } - if tokenUserGUID.Valid { - tr.SystemShared = tokenUserGUID.String == SystemSharedUserGuid - } - if linkedTokenGUID.Valid { - tr.LinkedGUID = linkedTokenGUID.String - } - - trs = append(trs, *tr) - - } - - // TODO: RC merge with find single - // TODO: RC Use? - // // If this token is linked - fetch that token and use it instead - // // Currently we don't recurse - we only support one level of linked token - you can't link to another linked token - // if linkedTokenGUID.Valid { - // if includeDisconnected { - // err = p.db.QueryRow(getToken, userGUID, linkedTokenGUID.String).Scan(&tokenGUID, &ciphertextAuthToken, &ciphertextRefreshToken, &tokenExpiry, &disconnected, &authType, &metadata, &tokenUserGUID, &linkedTokenGUID) - // } else { - // err = p.db.QueryRow(getTokenConnected, userGUID, linkedTokenGUID.String).Scan(&tokenGUID, &ciphertextAuthToken, &ciphertextRefreshToken, &tokenExpiry, &disconnected, &authType, &metadata, &tokenUserGUID, &linkedTokenGUID) - // } - - // if err != nil { - // msg := "Unable to Find CNSI token: %v" - // if err == sql.ErrNoRows { - // log.Debugf(msg, err) - // } else { - // log.Errorf(msg, err) - // } - // return interfaces.TokenRecord{}, fmt.Errorf(msg, err) - // } - // } - - // TODO: RC Finish off - - return trs, nil -} - func (p *PgsqlTokenRepository) FindCNSIToken(cnsiGUID string, userGUID string, encryptionKey []byte) (interfaces.TokenRecord, error) { log.Debug("FindCNSIToken") return p.findCNSIToken(cnsiGUID, userGUID, encryptionKey, false) @@ -775,17 +640,3 @@ func (p *PgsqlTokenRepository) UpdateTokenAuth(userGUID string, tr interfaces.To return nil } - -// func (p *PgsqlTokenRepository) Overwrite(tr interfaces.TokenRecord, encryptionKey []byte) error { -// log.Debug("Overwrite Token") - -// if _, err := p.FindCNSITokenIncludeDisconnected(endpointGuid, userGuid, encryptionKey); err != nil { -// // Found, so update endpoint -// // TODO: RC ALL STRINGS? -// return p. Update(endpoint, encryptionKey) -// } else { -// // Not Found, create endpoint -// return p.SaveCNSIToken(endpointGuid, userGuid, tr, encryptionKey) -// // TODO: RC Q could actually be error -// } -// } diff --git a/src/jetstream/repository/tokens/tokens.go b/src/jetstream/repository/tokens/tokens.go index 354baa58b6..f473885e15 100644 --- a/src/jetstream/repository/tokens/tokens.go +++ b/src/jetstream/repository/tokens/tokens.go @@ -18,8 +18,6 @@ type Repository interface { FindCNSIToken(cnsiGUID string, userGUID string, encryptionKey []byte) (interfaces.TokenRecord, error) FindCNSITokenIncludeDisconnected(cnsiGUID string, userGUID string, encryptionKey []byte) (interfaces.TokenRecord, error) - FindAllCNSIToken(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) - FindAllCNSITokenIncludeDisconnected(cnsiGUID string, encryptionKey []byte) ([]interfaces.TokenRecord, error) FindAllCNSITokenBackup(cnsiGUID string, encryptionKey []byte) ([]interfaces.BackupTokenRecord, error) DeleteCNSIToken(cnsiGUID string, userGUID string) error DeleteCNSITokens(cnsiGUID string) error From 0821dac2ba4cca40bbf5754f33c99ec337919db7 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Thu, 16 Apr 2020 16:54:13 +0100 Subject: [PATCH 024/176] Bump rxjs-tslint --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index db55ac40e9..f0bb97db88 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ "replace-in-file": "^5.0.2", "request": "^2.88.2", "request-promise-native": "^1.0.8", - "rxjs-tslint": "^0.1.7", + "rxjs-tslint": "^0.1.8", "sass-lint": "^1.12.1", "stratos-protractor-reporter": "^1.2.3", "ts-node": "~8.8.2", From d78b23c5d267b0f7eedc91236aa0a4121a217862 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Thu, 16 Apr 2020 18:08:49 +0100 Subject: [PATCH 025/176] Tidying & bug fixes. Handle client_secret --- .../backup-connection-cell.component.html | 5 +- .../backup-connection-cell.component.ts | 13 ++- .../backup-endpoints.service.ts | 14 ++- .../backup-endpoints.component.html | 5 +- .../backup-restore-cell.component.ts | 2 +- .../restore-endpoints.component.ts | 7 +- src/jetstream/cnsi_token_backup.go | 108 ++++++++++-------- 7 files changed, 95 insertions(+), 59 deletions(-) diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html index 818fadc297..c964d79408 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html @@ -1,8 +1,9 @@ - + None Current User All Users - \ No newline at end of file + +N/A \ No newline at end of file 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 528b256c22..67c64ab19e 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,5 +1,6 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; import { TableCellCustom } from '../../../../shared/components/list/list.types'; import { BackupEndpointsService } from '../backup-endpoints.service'; @@ -10,8 +11,9 @@ import { BackupEndpointConnectionTypes, BackupEndpointTypes } from '../backup-re templateUrl: './backup-connection-cell.component.html', styleUrls: ['./backup-connection-cell.component.scss'] }) -export class BackupConnectionCellComponent extends TableCellCustom { +export class BackupConnectionCellComponent extends TableCellCustom implements OnInit { + connectable = false; backupType = BackupEndpointTypes; connectionTypes = BackupEndpointConnectionTypes; selected: BackupEndpointConnectionTypes; @@ -19,4 +21,11 @@ export class BackupConnectionCellComponent extends TableCellCustom { - const e = !this.canBackup(endpoint.entity, BackupEndpointTypes.ENDPOINT) || endpoint[BackupEndpointTypes.ENDPOINT]; - const c = !this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT) || endpoint[BackupEndpointTypes.CONNECT] !== BackupEndpointConnectionTypes.NONE; + const e = !this.canBackupEndpoint(endpoint.entity, BackupEndpointTypes.ENDPOINT) || endpoint[BackupEndpointTypes.ENDPOINT]; + const c = !this.canBackupEndpoint(endpoint.entity, BackupEndpointTypes.CONNECT) || endpoint[BackupEndpointTypes.CONNECT] !== BackupEndpointConnectionTypes.NONE; return e && c; } @@ -77,7 +77,7 @@ export class BackupEndpointsService { this.allChanged.next(allChanged); } - canBackup(endpoint: EndpointModel, type: BackupEndpointTypes): boolean { + canBackupEndpoint(endpoint: EndpointModel, type: BackupEndpointTypes): boolean { // Can always back up endpoint if (type === BackupEndpointTypes.ENDPOINT) { return true; @@ -97,12 +97,16 @@ export class BackupEndpointsService { return true; } + canBackup(): boolean { + return !!Object.values(this.state).length; + } + selectAll() { Object.values(this.state).forEach(endpoint => { - if (this.canBackup(endpoint.entity, BackupEndpointTypes.ENDPOINT)) { + if (this.canBackupEndpoint(endpoint.entity, BackupEndpointTypes.ENDPOINT)) { endpoint[BackupEndpointTypes.ENDPOINT] = true; } - if (this.canBackup(endpoint.entity, BackupEndpointTypes.CONNECT)) { + if (this.canBackupEndpoint(endpoint.entity, BackupEndpointTypes.CONNECT)) { endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.ALL; } }); diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html index 14a8f6bf96..5344aaa34a 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html @@ -6,7 +6,7 @@

Backup Endpoints

path: '/endpoints/backup-restore' }"> -
+

Select the endpoints and connection details that you would like to backup

+ +

There are no endpoints to backup

+
diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts index 97a05e5198..0a1b80d52d 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts @@ -20,6 +20,6 @@ export class BackupRestoreCellComponent extends TableCellCustom { } disabled(): boolean { - return !this.service.canBackup(this.row, this.config.type); + return !this.service.canBackupEndpoint(this.row, this.config.type); } } 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 bfd419aad2..53fca1dcc1 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,9 +1,12 @@ import { Component } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { MatCheckboxChange } from '@angular/material'; +import { Store } from '@ngrx/store'; import { Observable, of, Subject } from 'rxjs'; import { first, map, tap } from 'rxjs/operators'; +import { GetAllEndpoints } from '../../../../../../store/src/actions/endpoint.actions'; +import { GeneralEntityAppState } from '../../../../../../store/src/app-state'; import { getEventFiles } from '../../../../core/browser-helper'; import { httpErrorResponseToSafeString } from '../../../../jetstream.helpers'; import { ConfirmationDialogConfig } from '../../../../shared/components/confirmation-dialog.config'; @@ -28,6 +31,7 @@ export class RestoreEndpointsComponent { show = false; constructor( + private store: Store, public service: RestoreEndpointsService, private confirmDialog: ConfirmationDialogService, ) { @@ -62,7 +66,7 @@ export class RestoreEndpointsComponent { restore: StepOnNextFunction = () => { const confirmation = new ConfirmationDialogConfig( 'Restore', - 'This will overwrite any matching endpoints and connection details', + 'This will overwrite any matching endpoints and connection details.', 'Continue', true ); @@ -75,6 +79,7 @@ export class RestoreEndpointsComponent { }; const restoreSuccess = data => { + this.store.dispatch(new GetAllEndpoints()); result.next({ success: true, redirect: true, diff --git a/src/jetstream/cnsi_token_backup.go b/src/jetstream/cnsi_token_backup.go index 8e23318e48..b3d25e6543 100644 --- a/src/jetstream/cnsi_token_backup.go +++ b/src/jetstream/cnsi_token_backup.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "net/http" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/crypto" "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/cnsis" "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/interfaces" "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/tokens" @@ -45,20 +46,20 @@ type BackupRequest struct { // BackupContentPayload - Encrypted part of the backup type BackupContentPayload struct { - Endpoints []*interfaces.CNSIRecord + Endpoints []map[string]interface{} Tokens []interfaces.BackupTokenRecord } // BackupContent - Everything that's backed up and stored in a file client side type BackupContent struct { - Payload BackupContentPayload `json:"payload"` - DBVersion int64 `json:"dbVersion"` + Payload []byte `json:"payload"` + DBVersion int64 `json:"dbVersion"` } // RestoreRequest - Request from client to restore content from payload type RestoreRequest struct { - // Payload - Encrypted version of BackupContent - Payload string `json:"data"` + // Data - Content of backup file. This should be of type BackupContent (//TODO: RC test as BackupContent) + Data string `json:"data"` Password string `json:"password"` IgnoreDbVersion bool `json:"ignoreDbVersion"` } @@ -89,7 +90,6 @@ func (ctb *cnsiTokenBackup) BackupEndpoints(c echo.Context) error { log.Infof("response: %+v", response) // TODO: RC REMOVE // Send back the response to the client - // TODO: RC Missing client_secret when serialised, `-` in definition jsonString, err := json.Marshal(response) if err != nil { return interfaces.NewHTTPError(http.StatusInternalServerError, "Failed to serialize response") @@ -111,7 +111,7 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e } // Fetch/Format required data - endpoints := make([]*interfaces.CNSIRecord, 0) + endpoints := make([]map[string]interface{}, 0) tokens := make([]interfaces.BackupTokenRecord, 0) for endpointID, endpoint := range data.State { @@ -122,19 +122,19 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e for _, e := range allEndpoints { if endpointID == e.GUID { - endpoints = append(endpoints, e) + endpoints = append(endpoints, serializeEndpoint(e)) break } } switch connectionType := endpoint.Connect; connectionType { case BACKUP_CONNECTION_ALL: - // allTokensFrom = append(allTokensFrom, endpointID) if tokenRecords, ok := ctb.getCNSITokenRecordsBackup(endpointID); ok { log.Warn("tokens for AllConnect") // TODO: RC REMOVE tokens = append(tokens, tokenRecords...) } else { - log.Warn("No tokens for AllConnect") // TODO: RC REMOVE + text := fmt.Sprintf("Failed to fetch tokens for endpoint %+v", endpointID) + return nil, interfaces.NewHTTPError(http.StatusBadGateway, text) } case BACKUP_CONNECTION_CURRENT: // userTokenFrom = append(userTokenFrom, endpointID) @@ -151,10 +151,10 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e tokens = append(tokens, btr) } else { - log.Infof("Request to back up connected user's (%+v) token for endpoint (%+v) failed. No token for user.", endpointID, data.UserID) + text := fmt.Sprintf("Request to back up connected user's (%+v) token for endpoint (%+v) failed.", endpointID, data.UserID) + return nil, interfaces.NewHTTPError(http.StatusBadGateway, text) } } - } log.Infof("endpoints: %+v", endpoints) // TODO: RC REMOVE @@ -166,7 +166,9 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e } // Encrypt data (see above) // TODO: RC leave until last - // encryptedPayload := payload + + bPayload, _ := json.Marshal(payload) + encryptedPayload, err := crypto.EncryptToken(encryptionKey, fmt.Sprintf("%+v", bPayload)) //TODO: RC error handling versions, err := ctb.p.getVersionsData() if err != nil { @@ -176,7 +178,7 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e // log.Infof("payload: %+v", payload) response := &BackupContent{ - Payload: *payload, + Payload: encryptedPayload, DBVersion: versions.DatabaseVersion, } @@ -231,7 +233,7 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { // TODO: RC Q all errors are NewHTTPError data := &BackupContent{} - if err := json.Unmarshal([]byte(backup.Payload), backup); err != nil { + if err := json.Unmarshal([]byte(backup.Data), data); err != nil { return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid backup - could not parse JSON") } @@ -247,16 +249,25 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { } } - unencryptedBackup := data.Payload + unencryptedBackup, err := crypto.DecryptToken(encryptionKey, data.Payload) //TODO: RC error handling, comments + if err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to decrypt payload", "Failed to decrypt payload: %+v", err) + } + + payload := &BackupContentPayload{} + if err = json.Unmarshal([]byte(unencryptedBackup), payload); err != nil { + return interfaces.NewHTTPError(http.StatusBadRequest, "Could not parse payload") + } cnsiRepo, err := cnsis.NewPostgresCNSIRepository(ctb.databaseConnectionPool) if err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) } - for _, endpoint := range unencryptedBackup.Endpoints { - if err := cnsiRepo.Overwrite(*endpoint, ctb.p.Config.EncryptionKeyInBytes); err != nil { - return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", endpoint.Name) + for _, endpoint := range payload.Endpoints { + e := deSerializeEndpoint(endpoint) + if err := cnsiRepo.Overwrite(e, ctb.p.Config.EncryptionKeyInBytes); err != nil { + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", e.Name) } } @@ -265,7 +276,7 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) } - for _, tr := range unencryptedBackup.Tokens { + for _, tr := range payload.Tokens { if err := tokenRepo.SaveCNSIToken(tr.EndpointGUID, tr.UserGUID, tr.TokenRecord, ctb.p.Config.EncryptionKeyInBytes); err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite token", "Failed to overwrite token: %+v", tr.TokenRecord.TokenGUID) } @@ -274,30 +285,33 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { return nil } -// find := func(a interfaces.CNSIRecord) bool { -// return endpointID == a.GUID -// } - -// endpointPos := sliceContainsFn(find, allEndpoints) -// if endpointPos >= 0 { -// endpoints = append(endpoints, endpoints[endpointPos]) -// } - -// // TODO:RC pos -// func sliceContains(what interface{}, where []interface{}) (idx int) { -// for i, v := range where { -// if v == what { -// return i -// } -// } -// return -1 -// } - -// func sliceContainsFn(is func(a interface{}) bool, where []interface{}) (idx int) { -// for i, v := range where { -// if is(v) { -// return i -// } -// } -// return -1 -// } +// Work around the omission of the client secret when serialising the cnsi record +func serializeEndpoint(endpoint *interfaces.CNSIRecord) map[string]interface{} { + // encode the original + m, _ := json.Marshal(endpoint) + + // decode it back to get a map + var a interface{} + json.Unmarshal(m, &a) + newEndpoint := a.(map[string]interface{}) + + // Replace the map key + newEndpoint["client_secret"] = endpoint.ClientSecret + + return newEndpoint +} + +// Work around the omission of the client secret when serialising the cnsi record +func deSerializeEndpoint(endpoint map[string]interface{}) interfaces.CNSIRecord { + // encode the endpoint map + m, _ := json.Marshal(endpoint) + + // decode it back to get a record with all values except client secret + var a interfaces.CNSIRecord + json.Unmarshal(m, &a) + + // manually add the client secret + a.ClientSecret = fmt.Sprintf("%v", endpoint["client_secret"]) + log.Errorf("CLIENT SECRET: %+v", a.ClientSecret) // TODO: RC REMOVE + return a +} From 7d62b61766e03a44483ebf6c91a8f05551369f00 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Fri, 17 Apr 2020 11:44:41 +0100 Subject: [PATCH 026/176] Update to 9.1.2 --- package-lock.json | 425 ++++++++++++++++++++++++++++++++++------------ package.json | 42 ++--- 2 files changed, 342 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3520d7ddb3..e611c6e04e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -294,14 +294,14 @@ } }, "@angular/animations": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.1.tgz", - "integrity": "sha512-IvKv8sV0ymbzDEX2ZLW+F6nOTQqDYallHexuzRVT9txvNE8TNHyySvLcyC5dTmX9fj9LA72NZ6nFyhxq0LFvtQ==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.2.tgz", + "integrity": "sha512-5UJ8SzCtFj4vZChVsni4K9oa4qE9tQ67bwnP6DKxkLEJKQWWyasYp+2siAi/7zD2ro2XA0qRMYhgQz5Vj6eBoQ==" }, "@angular/cdk": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.0.tgz", - "integrity": "sha512-jeeznvNDpR9POuxzz8Y0zFvMynG9HCJo3ZPTqOjlOq8Lj8876+rLsHDvKEMeLdwlkdi1EweYJW1CLQzI+TwqDA==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.1.tgz", + "integrity": "sha512-aSG1UNPszkSnpNuDCNd7ZgT29oQ8vqHPmoqjvJI0JkEv3i6uEs5tRuhWl3TK39wDNuwdlq0AY47XTa/0Ppb5RQ==", "requires": { "parse5": "^5.0.0" } @@ -379,19 +379,19 @@ } }, "@angular/common": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.1.tgz", - "integrity": "sha512-bS13veMs7//YqYjYJ+JI78ylaCyVcdFKZKikd5SZa6+r6fajcyvLnSKqrKypG3O1BeJ8vOG/Pq54P5gWhbR6eA==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.2.tgz", + "integrity": "sha512-MAQW0DGq2NhvJSETLTwuImdzwI+wboG+5Uzgc0L8C/hX7SrEE65Hmz4nIjmGi2CPGLpodfWEcCPlV0R0dHun4A==" }, "@angular/compiler": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.1.tgz", - "integrity": "sha512-u1IP6IzUgK6lIzrG1cxp96umXgtThyhuFn/KPoyVt7wPxZ6vVR0ZxjM7zycEcrMGzk0nf0nyOKaksJk9sTXTbg==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.2.tgz", + "integrity": "sha512-82DitvlZA5DoE++qiiJdgx6HE71h96sfLHCjjvYJHApoOcnX+zBZFBrflpbXK9W4YdvydU4Lc1Ql1eleQPeT/g==" }, "@angular/compiler-cli": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.1.tgz", - "integrity": "sha512-2jGp0ck2kkLNMzXUo/3iJkrQqJ7oGXE8h2tksxBsH2ptnhexRYTHZ626t7Np128tduY5JeC7J1Jxz7MUuYsJ2Q==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.2.tgz", + "integrity": "sha512-zC/oIuT68vtuiYrgXqWsDNi/0DQ1Ti6J6gMTrXVvZXlEDikEExTAJKrrBV5jo6B0bpUofe/dDcJaKR3Ys3cM3Q==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -714,9 +714,9 @@ } }, "@angular/core": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.1.tgz", - "integrity": "sha512-6lDlUlePafr/392hOvvTZZl6xPHT50U6658sHUAVIr0Un4mJ2MHNHKZtO45bpn3hM4gjFcYRQ7Rpd0umW74iTA==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.2.tgz", + "integrity": "sha512-nAqRl+5drAnZlBT7AgSo2JJubmPNrGCvhZ83dosPEUqJoLr69/lYipnF/iqKzYn5xo4MM1O27WIhSNDtDjBmzQ==" }, "@angular/flex-layout": { "version": "9.0.0-beta.29", @@ -724,49 +724,49 @@ "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" }, "@angular/forms": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.1.tgz", - "integrity": "sha512-NX+LuK8JFisiq3uHCOK6YoN/yIb2R9Ye5mwiOPkuZA3lZLKCnUXqCHZbM8VHy/WdjIxxeUaFMJc38yV8RVoabg==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.2.tgz", + "integrity": "sha512-/f2WhMiKDo1/RoisTI71Dy4Z4+sAsAuzgIxJEXvgDGSYvzLl9G8erFx4N6be8Cy/xXwErmp3JOwXIAXjzxF8tA==" }, "@angular/language-service": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.1.tgz", - "integrity": "sha512-T+/0X2VnmgW/vzynqYTVv29qtebNvrCB/yJqtNIlqXvBjcB8XRRwZPDZvRyl5BiwEPSsJnjdRFNH9krQHxYp+g==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.2.tgz", + "integrity": "sha512-0BnDIFbIAtFKS/2HDI0efcnW3DSkAAFhUWluBnssvwGzuMHikOKGeamuWM27ki3IzPQKGJ7fGS2fz8A7sMeIYQ==", "dev": true }, "@angular/material": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.0.tgz", - "integrity": "sha512-KKzEIVh6/m56m+Ao8p4PK0SyEr0574l3VP2swj1qPag3u+FYgemmXCGTaChrKdDsez+zeTCPXImBGXzE6NQ80Q==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.1.tgz", + "integrity": "sha512-nqn/0Eg04DxwnkRGSM1xnmGgtfHYOBcEPbFeTu8c1qAbjFEozd6tpw4y6dQrCCL/JLNIRQPsxsUsVnKeWDF/4Q==" }, "@angular/material-moment-adapter": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-9.2.0.tgz", - "integrity": "sha512-DruanWMcAzOy8mFZ6Xr9sRqJ+KjF0hvFshxqrv0SD/rVpf9oi8ADnuACmHYXN5dYr/YtgmHDywq0Z7USY7SIoA==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-9.2.1.tgz", + "integrity": "sha512-i3tbL3DJQspO23cPAgW6pAvztuv2D8tkGhxl+bTUlq8FgGBqKrOa0T/maN1fik46AXZojowUVZoCG7EvV2T7nQ==" }, "@angular/platform-browser": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.1.tgz", - "integrity": "sha512-tjALKhdAWPErj0euIIdvx/31AHEZ7is7ADsMu+nYn2NY2gcPUuiqq3RCUJVxBYJ2Cclq1nlF0i2rEDKh7TrBKg==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.2.tgz", + "integrity": "sha512-/3L4DdvnebvaJUurusaq8RJBFfr/SHWG6DMmV1VVpADxe8kjREyN0LdNDSkZgVf/QcUSwNEA6153iwcF92Otew==" }, "@angular/platform-browser-dynamic": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.1.tgz", - "integrity": "sha512-kEox5UOwkRLjGKXLh5o5SYopoAylpKgrXtRrKRKTCMmZTpYSe1bLlXMjpwMAMZ9ZFSTvWp9iX94aT5bJDpLrRQ==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.2.tgz", + "integrity": "sha512-BWHxy8S71z+NmUQmtR+/Dkohlj3LQIXltOqeVdCSpjV9cultBNN3bE1w0Rjp3BmCRGCIDH7qFlr4U5woHa7ldw==" }, "@angular/platform-server": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.1.1.tgz", - "integrity": "sha512-Azvras7WpRtVw4jfEfmlrz5JBIDpXCZMab/5A1dFv3Z9Dbykp5czkZ/XXCpMCVcli7xxthF1uv/FD4nQoJdzSw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.1.2.tgz", + "integrity": "sha512-GjDWEglkmBgpDZ5pWlaC4zMXUAXRmTsE2me277OGQlKKZwsBfFZWai0NHAbDVq0SE4/f3x0QKo33TxOy47LXng==", "requires": { "domino": "^2.1.2", "xhr2": "^0.2.0" } }, "@angular/router": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.1.tgz", - "integrity": "sha512-OQ5Ctd+swF7ZNlgUxrkGKk2B4yBFqJm0QCxkM86kFDCKQV/4OButZ+4HPy1HxeozBIAmm2pbQA+YjsAUs0VZcQ==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.2.tgz", + "integrity": "sha512-csxE4HkuhVR1X932Q3kSDqBoF7Awuq5dsjv0nFk78raiHgG3CNnfMLHt8xD9XtOmR7ZT+D4yh/YmIK6W7J5hbQ==" }, "@babel/code-frame": { "version": "7.5.5", @@ -1965,13 +1965,15 @@ } }, "@rollup/plugin-commonjs": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", - "integrity": "sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g==", + "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": { - "@rollup/pluginutils": "^3.0.0", + "@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" @@ -1987,12 +1989,12 @@ } }, "@rollup/plugin-node-resolve": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.1.tgz", - "integrity": "sha512-14ddhD7TnemeHE97a4rLOhobfYvUVcaYuqTnL8Ti7Jxi9V9Jr5LY7Gko4HZ5k4h4vqQM0gBQt6tsp9xXW94WPA==", + "version": "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": { - "@rollup/pluginutils": "^3.0.6", + "@rollup/pluginutils": "^3.0.8", "@types/resolve": "0.0.8", "builtin-modules": "^3.1.0", "is-module": "^1.0.0", @@ -2000,9 +2002,9 @@ }, "dependencies": { "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.0.tgz", + "integrity": "sha512-LarL/PIKJvc09k1jaeT4kQb/8/7P+qV4qSnN2K80AES+OHdfZELAKVOBjxsvtToT/uLOfFbvYvKfZmV8cee7nA==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -2011,12 +2013,59 @@ } }, "@rollup/pluginutils": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.8.tgz", - "integrity": "sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.9.tgz", + "integrity": "sha512-TLZavlfPAZYI7v33wQh4mTP6zojne14yok3DNSLcjoG/Hirxfkonn6icP5rrNWRn8nZsirJBFFpijVOJzkUHDg==", "dev": true, "requires": { - "estree-walker": "^1.0.1" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "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" + } + } } }, "@schematics/angular": { @@ -2070,9 +2119,9 @@ "dev": true }, "@swimlane/ngx-charts": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-13.0.2.tgz", - "integrity": "sha512-pKHw3DLsO2eso3SqMlHt9vumaU8gaDYZbrC8PNWteU49AFkX8kLVJIvsgjMSKwW/n3VpgHBpTMGnLkSlzHJORg==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-13.0.3.tgz", + "integrity": "sha512-WPgMZwqND/hGgxY+fJ+iN3ctL6Ps93kZ6j2jeWRgKfXdUVNnKQ4XeUBWpU+70jhq1i36PzYEg46evWdHp6vMuw==", "requires": { "d3-array": "^2.4.0", "d3-brush": "^1.1.5", @@ -2107,12 +2156,6 @@ "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.30", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.30.tgz", - "integrity": "sha512-8LhzvcjIoqoi1TghEkRMkbbmM+jhHnBokPGkJWjclMK+Ks0MxEBow3/p2/iFTZ+OIbJHQDSfpgdZEb+af3gfVw==", - "dev": true - }, "@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", @@ -2169,20 +2212,19 @@ } }, "@types/karma": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/karma/-/karma-4.4.1.tgz", - "integrity": "sha512-Y2jH6yMPqVMCeewC6gn5Q3hljcbtffyjnhQC8rhp9zdek2zUXh6e6+TDLNlO2lCiNmjzxANiRxQR0cRxkkIYmQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/karma/-/karma-5.0.0.tgz", + "integrity": "sha512-5quuLnxdJWkzJCEwFatOClM6O7EkeDWfXltGySb01LQnBVjtbLzIky9JLW0IKt+JfzurUjwj7b7Sb/Omsx4QYA==", "dev": true, "requires": { - "@types/bluebird": "*", "@types/node": "*", "log4js": "^4.0.0" } }, "@types/marked": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.7.3.tgz", - "integrity": "sha512-WXdEKuT3azHxLTThd5dwnpLt2Q9QiC8iKj09KZRtVqro3pX8hhY+GbD8FZOae6SBBEJ22yKJn3c7ejL0aucAcA==" + "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", @@ -9115,9 +9157,9 @@ } }, "is-installed-globally": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.1.tgz", - "integrity": "sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg==", + "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", @@ -10946,9 +10988,9 @@ "dev": true }, "mem": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-6.0.1.tgz", - "integrity": "sha512-uIRYASflIsXqvKe+7aXbLrydaRzz4qiK6amqZDQI++eRtW3UoKtnDcGeCAOREgll7YMxO5E4VB9+3B0LFmy96g==", + "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": { "map-age-cleaner": "^0.1.3", @@ -11400,9 +11442,9 @@ "dev": true }, "ng-packagr": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-9.1.0.tgz", - "integrity": "sha512-783WCTa+qQl8QQefQ3n8cDzYF3PpsQUnY87SwuXIxaJ1p8NjBq/3vCZmTiI3AXzDZFhRacbCqghtaJGU1qcFrQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-9.1.1.tgz", + "integrity": "sha512-20umbeklnsntUoTXBKuQQj4Oyw1tauVU7TZPRFC+n3bXuB29rb+91HIBtt8k7l0BuXN5G4HiXgmPW8xDGu7HWg==", "dev": true, "requires": { "@rollup/plugin-commonjs": "^11.0.2", @@ -11411,7 +11453,7 @@ "ajv": "^6.10.2", "autoprefixer": "^9.6.5", "browserslist": "^4.7.0", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "chokidar": "^3.2.1", "clean-css": "^4.1.11", "commander": "^4.0.0", @@ -11424,7 +11466,7 @@ "postcss-url": "^8.0.0", "read-pkg-up": "^5.0.0", "rimraf": "^3.0.0", - "rollup": "2.2.0", + "rollup": "2.6.1", "rollup-plugin-sourcemaps": "^0.5.0", "rxjs": "^6.5.0", "sass": "^1.23.0", @@ -11469,9 +11511,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -11587,9 +11629,9 @@ "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -11663,9 +11705,9 @@ } }, "rollup": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.2.0.tgz", - "integrity": "sha512-iAu/j9/WJ0i+zT0sAMuQnsEbmOKzdQ4Yxu5rbPs9aUCyqveI1Kw3H4Fi9NWfCOpb8luEySD2lDyFWL9CrLE8iw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.6.1.tgz", + "integrity": "sha512-1RhFDRJeg027YjBO6+JxmVWkEZY0ASztHhoEUEWxOwkh4mjO58TFD6Uo7T7Y3FbmDpRTfKhM5NVxJyimCn0Elg==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -12943,9 +12985,9 @@ "dev": true }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "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": { @@ -15255,24 +15297,153 @@ } }, "rxjs-tslint": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/rxjs-tslint/-/rxjs-tslint-0.1.7.tgz", - "integrity": "sha512-NnOfqutNfdT7VQnQm32JLYh2gDZjc0gdWZFtrxf/czNGkLKJ1nOO6jbKAFI09W0f9lCtv6P2ozxjbQH8TSPPFQ==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/rxjs-tslint/-/rxjs-tslint-0.1.8.tgz", + "integrity": "sha512-4MNcco1pugjNyjkUkvJ9ngJSMCuwmyc1g6EkEYzlTK0PrZxm8xVaBeBz5aPLE3AzldQbYkOErOVAayUlzQkjAg==", "dev": true, "requires": { "chalk": "^2.4.0", - "optimist": "^0.6.1", "tslint": "^5.9.1", "tsutils": "^2.25.0", - "typescript": ">=2.8.3" + "typescript": ">=2.8.3", + "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" + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "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 + }, + "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", + "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" + } + }, "tslint": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", @@ -15293,6 +15464,52 @@ "tslib": "^1.8.0", "tsutils": "^2.29.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": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -19140,9 +19357,9 @@ "dev": true }, "xterm": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.4.0.tgz", - "integrity": "sha512-JGIpigWM3EBWvnS3rtBuefkiToIILSK1HYMXy4BCsUpO+O4UeeV+/U1AdAXgCB6qJrnPNb7yLgBsVCQUNMteig==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.5.0.tgz", + "integrity": "sha512-4t12tsvtYnv13FBJwewddxdI/j4kSonmbQQv50j34R/rPIFbUNGtptbprmuUlTDAKvHLMDZ/Np2XcpNimga/HQ==" }, "xterm-addon-fit": { "version": "0.3.0", diff --git a/package.json b/package.json index f0bb97db88..dd48317e89 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,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=2692 --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", @@ -46,26 +46,26 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "@angular/animations": "^9.1.1", - "@angular/cdk": "^9.2.0", - "@angular/common": "^9.1.1", - "@angular/compiler": "^9.1.1", - "@angular/core": "^9.1.1", + "@angular/animations": "^9.1.2", + "@angular/cdk": "^9.2.1", + "@angular/common": "^9.1.2", + "@angular/compiler": "^9.1.2", + "@angular/core": "^9.1.2", "@angular/flex-layout": "^9.0.0-beta.29", - "@angular/forms": "^9.1.1", - "@angular/material": "^9.2.0", - "@angular/material-moment-adapter": "^9.2.0", - "@angular/platform-browser": "^9.1.1", - "@angular/platform-browser-dynamic": "^9.1.1", - "@angular/platform-server": "^9.1.1", - "@angular/router": "^9.1.1", + "@angular/forms": "^9.1.2", + "@angular/material": "^9.2.1", + "@angular/material-moment-adapter": "^9.2.1", + "@angular/platform-browser": "^9.1.2", + "@angular/platform-browser-dynamic": "^9.1.2", + "@angular/platform-server": "^9.1.2", + "@angular/router": "^9.1.2", "@ngrx/effects": "^9.1.0", "@ngrx/router-store": "^9.1.0", "@ngrx/store": "^9.1.0", "@ngrx/store-devtools": "^9.1.0", - "@swimlane/ngx-charts": "^13.0.2", + "@swimlane/ngx-charts": "^13.0.3", "@types/moment-timezone": "^0.5.13", - "@types/marked": "^0.7.3", + "@types/marked": "^0.7.4", "angular2-virtual-scroll": "^0.4.16", "core-js": "^3.6.5", "immer": "^6.0.3", @@ -86,7 +86,7 @@ "ts-md5": "^1.2.7", "tslib": "^1.10.0", "web-animations-js": "^2.3.2", - "xterm": "^4.4.0", + "xterm": "^4.5.0", "xterm-addon-fit": "^0.3.0", "zone.js": "~0.10.2" }, @@ -98,11 +98,11 @@ "@angular-devkit/build-ng-packagr": "~0.901.1", "@angular-devkit/schematics": "^9.1.1", "@angular/cli": "^9.1.1", - "@angular/compiler-cli": "^9.1.1", - "@angular/language-service": "^9.1.1", + "@angular/compiler-cli": "^9.1.2", + "@angular/language-service": "^9.1.2", "@types/jasmine": "^3.5.10", "@types/jasminewd2": "~2.0.8", - "@types/karma": "^4.4.1", + "@types/karma": "^5.0.0", "@types/node": "^13.11.1", "@types/request": "^2.48.4", "acorn": "^7.1.1", @@ -129,9 +129,9 @@ "karma-spec-reporter": "0.0.32", "kind-of": "^6.0.3", "lodash": "^4.17.13", - "mem": "6.0.1", + "mem": "6.1.0", "mktemp": "^1.0.0", - "ng-packagr": "^9.0.0", + "ng-packagr": "^9.1.1", "npm-run-all": "^4.1.5", "protractor": "^5.4.3", "ps-node": "^0.1.6", From 2191b38b14292ad0bbecbf875b90716e8185ae14 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Fri, 17 Apr 2020 11:46:36 +0100 Subject: [PATCH 027/176] Add minimum password length --- .../backup-endpoints/backup-endpoints.component.html | 11 +++++++---- .../backup-endpoints/backup-endpoints.component.ts | 2 +- .../restore-endpoints.component.html | 5 +++++ .../restore-endpoints/restore-endpoints.component.ts | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html index 5344aaa34a..7d237225f7 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html @@ -26,15 +26,18 @@

Backup Endpoints

Password - + + + Password is required + + Password must be at least {{passwordForm.controls.password.errors.minlength.requiredLength}} characters +
- - - \ No newline at end of file + \ No newline at end of file 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 882d6113f8..b0a0c1cd9c 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 @@ -120,7 +120,7 @@ export class BackupEndpointsComponent implements OnInit { setupPasswordStep() { this.passwordForm = new FormGroup({ - password: new FormControl('', [Validators.required]), + password: new FormControl('', [Validators.required, Validators.minLength(6)]), }); this.passwordValid$ = this.passwordForm.statusChanges.pipe( map(() => { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html index c99ad6600f..722d3a5e87 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html @@ -37,6 +37,11 @@

Restore Endpoints

[attr.aria-pressed]="!show"> {{!show ? 'visibility_off' : 'visibility'}} + + Password is required + + Password must be at least {{passwordForm.controls.password.errors.minlength.requiredLength}} characters +
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 53fca1dcc1..88430d66e8 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 @@ -40,7 +40,7 @@ export class RestoreEndpointsComponent { setupPasswordStep() { this.passwordForm = new FormGroup({ - password: new FormControl('', [Validators.required]), + password: new FormControl('', [Validators.required, Validators.minLength(6)]), }); this.passwordValid$ = this.passwordForm.statusChanges.pipe( map(() => { From 19fd37a2cd7f2a6c41f2e071493245b5dbfcff4b Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Fri, 17 Apr 2020 11:47:24 +0100 Subject: [PATCH 028/176] First pass encrypt/decrypt --- src/jetstream/cnsi.go | 2 + src/jetstream/cnsi_token_backup.go | 122 +++++++++++++++++++++-------- 2 files changed, 92 insertions(+), 32 deletions(-) diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index f5c6c501a3..afaaebf9cf 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -641,6 +641,7 @@ func (p *portalProxy) backupEndpoints(c echo.Context) error { ctb := &cnsiTokenBackup{ databaseConnectionPool: p.DatabaseConnectionPool, + encryptionKey: p.Config.EncryptionKeyInBytes, p: p, } @@ -652,6 +653,7 @@ func (p *portalProxy) restoreEndpoints(c echo.Context) error { ctb := &cnsiTokenBackup{ databaseConnectionPool: p.DatabaseConnectionPool, + encryptionKey: p.Config.EncryptionKeyInBytes, p: p, } diff --git a/src/jetstream/cnsi_token_backup.go b/src/jetstream/cnsi_token_backup.go index b3d25e6543..8eca908ec0 100644 --- a/src/jetstream/cnsi_token_backup.go +++ b/src/jetstream/cnsi_token_backup.go @@ -1,9 +1,9 @@ package main import ( + "crypto/md5" "database/sql" "encoding/json" - "errors" "fmt" "io/ioutil" "net/http" @@ -18,6 +18,7 @@ import ( type cnsiTokenBackup struct { databaseConnectionPool *sql.DB + encryptionKey []byte p *portalProxy } @@ -58,7 +59,7 @@ type BackupContent struct { // RestoreRequest - Request from client to restore content from payload type RestoreRequest struct { - // Data - Content of backup file. This should be of type BackupContent (//TODO: RC test as BackupContent) + // Data - Content of backup file. This should be of type BackupContent Data string `json:"data"` Password string `json:"password"` IgnoreDbVersion bool `json:"ignoreDbVersion"` @@ -70,12 +71,12 @@ func (ctb *cnsiTokenBackup) BackupEndpoints(c echo.Context) error { // Check we can unmarshall the request body, err := ioutil.ReadAll(c.Request().Body) if err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") + return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Invalid request body", "Invalid request body: %+v", err) } data := &BackupRequest{} if err = json.Unmarshal(body, data); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") + return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Invalid request body - could not parse JSON", "Invalid request body - could not parse JSON: %+v", err) } if data.State == nil || len(data.State) == 0 { @@ -92,7 +93,7 @@ func (ctb *cnsiTokenBackup) BackupEndpoints(c echo.Context) error { // Send back the response to the client jsonString, err := json.Marshal(response) if err != nil { - return interfaces.NewHTTPError(http.StatusInternalServerError, "Failed to serialize response") + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to serialize response", "Failed to serialize response: %+v", err) } log.Infof("jsonString: %+v", jsonString) // TODO: RC REMOVE @@ -107,7 +108,7 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e log.Debug("createBackup") allEndpoints, err := ctb.p.ListEndpoints() if err != nil { - return nil, interfaces.NewHTTPError(http.StatusBadGateway, "Failed to fetch endpoints") + return nil, interfaces.NewHTTPShadowError(http.StatusBadGateway, "Failed to fetch endpoints", "Failed to fetch endpoints: %+v", err) } // Fetch/Format required data @@ -157,32 +158,30 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e } } - log.Infof("endpoints: %+v", endpoints) // TODO: RC REMOVE - log.Infof("tokens: %+v", tokens) // TODO: RC REMOVE - payload := &BackupContentPayload{ Endpoints: endpoints, Tokens: tokens, } - // Encrypt data (see above) // TODO: RC leave until last - - bPayload, _ := json.Marshal(payload) - encryptedPayload, err := crypto.EncryptToken(encryptionKey, fmt.Sprintf("%+v", bPayload)) //TODO: RC error handling + // Encrypt the entire payload + encryptedPayload, err := encryptPayload(payload, data.Password, ctb.encryptionKey) + if err != nil { + return nil, interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not encrypt payload", "Could not encrypt payload: %+v", err) + } versions, err := ctb.p.getVersionsData() if err != nil { - return nil, errors.New("Could not find database version") + return nil, interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not find database version", "Could not find database version: %+v", err) } - // log.Infof("payload: %+v", payload) + // log.Infof("payload: %+v", payload) // TODO: RC REMOVE response := &BackupContent{ Payload: encryptedPayload, DBVersion: versions.DatabaseVersion, } - // log.Infof("response: %+v", response) + // log.Infof("response: %+v", response) // TODO: RC REMOVE return response, nil } @@ -194,7 +193,7 @@ func (ctb *cnsiTokenBackup) getCNSITokenRecordsBackup(endpointID string) ([]inte return make([]interfaces.BackupTokenRecord, 0), false } - trs, err := tokenRepo.FindAllCNSITokenBackup(endpointID, ctb.p.Config.EncryptionKeyInBytes) + trs, err := tokenRepo.FindAllCNSITokenBackup(endpointID, ctb.encryptionKey) if err != nil { return make([]interfaces.BackupTokenRecord, 0), false } @@ -208,12 +207,12 @@ func (ctb *cnsiTokenBackup) RestoreEndpoints(c echo.Context) error { // Check we can unmarshall the request body, err := ioutil.ReadAll(c.Request().Body) if err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body") + return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Invalid request body", "Invalid request body: %+v", err) } data := &RestoreRequest{} if err = json.Unmarshal(body, data); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - could not parse JSON") + return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Invalid request body - could not parse JSON", "Invalid request body - could not parse JSON: %+v", err) } err = ctb.restoreBackup(data) @@ -224,41 +223,40 @@ func (ctb *cnsiTokenBackup) RestoreEndpoints(c echo.Context) error { // log.Warnf("BACKUP DATA: %+v", backup) // TODO: RC REMOVE c.Response().WriteHeader(http.StatusOK) return nil - } func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { log.Debug("restoreBackup") - // TODO: RC Q all errors are NewHTTPError - data := &BackupContent{} if err := json.Unmarshal([]byte(backup.Data), data); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid backup - could not parse JSON") + return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Invalid backup - could not parse JSON", "Invalid backup - could not parse JSON: %+v", err) } + // Check that the db version of backup file matches the stratos db version if backup.IgnoreDbVersion == false { versions, err := ctb.p.getVersionsData() if err != nil { - return errors.New("Could not find database version") + return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Could not find database version", "Could not find database version: %+v", err) } if versions.DatabaseVersion != data.DBVersion { errorStr := fmt.Sprintf("Incompatible database versions. Expected %+v but got %+v", versions.DatabaseVersion, data.DBVersion) - return interfaces.NewHTTPShadowError(http.StatusBadRequest, errorStr, errorStr) + return interfaces.NewHTTPError(http.StatusBadRequest, errorStr) } } - unencryptedBackup, err := crypto.DecryptToken(encryptionKey, data.Payload) //TODO: RC error handling, comments + // Get the actual, unencrypted set of endpoints and tokens + payloadString, err := decryptPayload(data.Payload, backup.Password, ctb.encryptionKey) if err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to decrypt payload", "Failed to decrypt payload: %+v", err) } - payload := &BackupContentPayload{} - if err = json.Unmarshal([]byte(unencryptedBackup), payload); err != nil { - return interfaces.NewHTTPError(http.StatusBadRequest, "Could not parse payload") + if err = json.Unmarshal([]byte(*payloadString), payload); err != nil { + return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Failed to parse payload. This could be due to an incorrect password", "Failed to decrypt payload, possible incorrect password: %+v", err) } + // Insert/Update the endpoints and tokens cnsiRepo, err := cnsis.NewPostgresCNSIRepository(ctb.databaseConnectionPool) if err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to connect to db", "Failed to connect to db: %+v", err) @@ -266,7 +264,7 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { for _, endpoint := range payload.Endpoints { e := deSerializeEndpoint(endpoint) - if err := cnsiRepo.Overwrite(e, ctb.p.Config.EncryptionKeyInBytes); err != nil { + if err := cnsiRepo.Overwrite(e, ctb.encryptionKey); err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", e.Name) } } @@ -277,7 +275,7 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { } for _, tr := range payload.Tokens { - if err := tokenRepo.SaveCNSIToken(tr.EndpointGUID, tr.UserGUID, tr.TokenRecord, ctb.p.Config.EncryptionKeyInBytes); err != nil { + if err := tokenRepo.SaveCNSIToken(tr.EndpointGUID, tr.UserGUID, tr.TokenRecord, ctb.encryptionKey); err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite token", "Failed to overwrite token: %+v", tr.TokenRecord.TokenGUID) } } @@ -312,6 +310,66 @@ func deSerializeEndpoint(endpoint map[string]interface{}) interfaces.CNSIRecord // manually add the client secret a.ClientSecret = fmt.Sprintf("%v", endpoint["client_secret"]) - log.Errorf("CLIENT SECRET: %+v", a.ClientSecret) // TODO: RC REMOVE + // log.Errorf("CLIENT SECRET: %+v", a.ClientSecret) // TODO: RC REMOVE return a } + +func encryptPayload(payload *BackupContentPayload, password string, encryptionKey []byte) ([]byte, error) { + // First ensure the password is an ok length + secret, err := createHash(password, encryptionKey) + if err != nil { + log.Warningf("Could not create hash: %+v", err) + return nil, fmt.Errorf("Could not create hash") + } + + // log.Errorf("password: %+v", password) // TODO: RC REMOVE + // log.Errorf("secret: %+v", secret) // TODO: RC REMOVE + // log.Errorf("payload: %+v", payload) // TODO: RC REMOVE + // Create the text that will be encrypted + payloadBytes, err := json.Marshal(payload) + // log.Errorf("payloadBytes: %+v", string(payloadBytes)) // TODO: RC REMOVE + if err != nil { + return nil, fmt.Errorf("Could not marshal payload: %+v", err) + } + + // Encrypt + payloadEncrypted, err := crypto.EncryptToken(secret, string(payloadBytes)) + // log.Errorf("payloadEncrypted: %+v", string(payloadEncrypted)) // TODO: RC REMOVE + if err != nil { + return nil, fmt.Errorf("Could not encrypt payload: %+v", err) + } + + return payloadEncrypted, nil +} + +func decryptPayload(payloadEncrypted []byte, password string, encryptionKey []byte) (*string, error) { + // First ensure the password is an ok length + secret, err := createHash(password, encryptionKey) + if err != nil { + log.Warningf("Could not create hash: %+v", err) + return nil, fmt.Errorf("Could not create hash") + } + + // log.Errorf("password: %+v", password) // TODO: RC REMOVE + // log.Errorf("secret: %+v", secret) // TODO: RC REMOVE + // log.Errorf("payloadEncrypted: %+v", payloadEncrypted) // TODO: RC REMOVE + payloadUnencrypted, err := crypto.DecryptToken(secret, payloadEncrypted) + if err != nil { + return nil, fmt.Errorf("Failed to decrypt payload: %+v", err) + } + // log.Errorf("payloadUnencrypted: %+v", string(payloadUnencrypted)) // TODO: RC REMOVE + + return &payloadUnencrypted, nil +} + +// createHash - Ensure the token used by crypto is at an acceptable length +func createHash(password string, salt []byte) ([]byte, error) { + hasher := md5.New() + if _, err := hasher.Write([]byte(password)); err != nil { + return nil, fmt.Errorf("Failed to write password to hash") + } + if _, err := hasher.Write(salt); err != nil { + return nil, fmt.Errorf("Failed to write salt to hash") + } + return hasher.Sum(nil), nil +} From 5de414d55581b539faf2e2d08a8af28d582a077e Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Fri, 17 Apr 2020 14:02:45 +0100 Subject: [PATCH 029/176] Tidy up --- .../backup-endpoints.component.html | 2 +- .../backup-endpoints.component.ts | 7 ++-- .../restore-endpoints.component.ts | 5 ++- src/jetstream/cnsi_token_backup.go | 34 ++++--------------- src/jetstream/main.go | 1 - .../repository/tokens/pgsql_tokens.go | 1 - 6 files changed, 12 insertions(+), 38 deletions(-) diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html index 7d237225f7..bfbec70bda 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.html @@ -22,7 +22,7 @@

Backup Endpoints

-

Protect the backup by providing as password. You will need this password when restoring from this backup

+

Protect the backup by providing a password. You will need this password when restoring from this backup

Password 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 b0a0c1cd9c..6a64e5d9f1 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 @@ -3,7 +3,7 @@ import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Store } from '@ngrx/store'; import * as moment from 'moment'; import { Observable, of, Subject } from 'rxjs'; -import { filter, first, map, tap } from 'rxjs/operators'; +import { filter, first, map } from 'rxjs/operators'; import { GetAllEndpoints } from '../../../../../../store/src/actions/endpoint.actions'; import { AppState } from '../../../../../../store/src/app-state'; @@ -136,7 +136,7 @@ export class BackupEndpointsComponent implements OnInit { onNext: StepOnNextFunction = () => { const confirmation = new ConfirmationDialogConfig( 'Backup', - 'This backup contains endpoint connection details. The contents will be encrypted, but please still ensure the safety of the file', + 'The backup that is about to be created may contain credentials, tokens and other sensitive information. Although it is encrypted, you should take the appropriate steps to secure it. ', 'Continue', true ); @@ -180,8 +180,7 @@ export class BackupEndpointsComponent implements OnInit { createBackup(); } - // TODO: RC Remove console.log - return result.asObservable().pipe(tap(console.log)); + return result.asObservable(); } 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 88430d66e8..64b2e5e592 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 @@ -3,7 +3,7 @@ import { FormControl, FormGroup, Validators } from '@angular/forms'; import { MatCheckboxChange } from '@angular/material'; import { Store } from '@ngrx/store'; import { Observable, of, Subject } from 'rxjs'; -import { first, map, tap } from 'rxjs/operators'; +import { first, map } from 'rxjs/operators'; import { GetAllEndpoints } from '../../../../../../store/src/actions/endpoint.actions'; import { GeneralEntityAppState } from '../../../../../../store/src/app-state'; @@ -99,8 +99,7 @@ export class RestoreEndpointsComponent { this.confirmDialog.openWithCancel(confirmation, createBackup, userCancelledDialog); - // TODO: RC Remove console.log - return result.asObservable().pipe(tap(console.log)); + return result.asObservable(); } } diff --git a/src/jetstream/cnsi_token_backup.go b/src/jetstream/cnsi_token_backup.go index 8eca908ec0..3f4c4f77b9 100644 --- a/src/jetstream/cnsi_token_backup.go +++ b/src/jetstream/cnsi_token_backup.go @@ -68,7 +68,7 @@ type RestoreRequest struct { func (ctb *cnsiTokenBackup) BackupEndpoints(c echo.Context) error { log.Debug("BackupEndpoints") - // Check we can unmarshall the request + // Create the backup request struct from the body body, err := ioutil.ReadAll(c.Request().Body) if err != nil { return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Invalid request body", "Invalid request body: %+v", err) @@ -83,22 +83,18 @@ func (ctb *cnsiTokenBackup) BackupEndpoints(c echo.Context) error { return interfaces.NewHTTPError(http.StatusBadRequest, "Invalid request body - no endpoints to backup") } + // Create backup response, err := ctb.createBackup(data) if err != nil { return err } - log.Infof("response: %+v", response) // TODO: RC REMOVE - - // Send back the response to the client + // Send the response back to the client jsonString, err := json.Marshal(response) if err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to serialize response", "Failed to serialize response: %+v", err) } - log.Infof("jsonString: %+v", jsonString) // TODO: RC REMOVE - - // Return data c.Response().Header().Set("Content-Type", "application/json") c.Response().Write(jsonString) return nil @@ -131,25 +127,20 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e switch connectionType := endpoint.Connect; connectionType { case BACKUP_CONNECTION_ALL: if tokenRecords, ok := ctb.getCNSITokenRecordsBackup(endpointID); ok { - log.Warn("tokens for AllConnect") // TODO: RC REMOVE tokens = append(tokens, tokenRecords...) } else { text := fmt.Sprintf("Failed to fetch tokens for endpoint %+v", endpointID) return nil, interfaces.NewHTTPError(http.StatusBadGateway, text) } case BACKUP_CONNECTION_CURRENT: - // userTokenFrom = append(userTokenFrom, endpointID) if tokenRecord, ok := ctb.p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { log.Warn("tokens for Connect") - // TODO: RC Q This will be the linked token as if it were the users token var btr = interfaces.BackupTokenRecord{ - // tokenRecord: tokenRecord, TokenRecord: tokenRecord, EndpointGUID: endpointID, TokenType: "CNSI", UserGUID: data.UserID, } - tokens = append(tokens, btr) } else { text := fmt.Sprintf("Request to back up connected user's (%+v) token for endpoint (%+v) failed.", endpointID, data.UserID) @@ -158,6 +149,7 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e } } + // Create the payload, this will be encrypted payload := &BackupContentPayload{ Endpoints: endpoints, Tokens: tokens, @@ -169,20 +161,17 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e return nil, interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not encrypt payload", "Could not encrypt payload: %+v", err) } + // Add the db version to the response, this will allow client side up front validation versions, err := ctb.p.getVersionsData() if err != nil { return nil, interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not find database version", "Could not find database version: %+v", err) } - // log.Infof("payload: %+v", payload) // TODO: RC REMOVE - response := &BackupContent{ Payload: encryptedPayload, DBVersion: versions.DatabaseVersion, } - // log.Infof("response: %+v", response) // TODO: RC REMOVE - return response, nil } @@ -204,7 +193,7 @@ func (ctb *cnsiTokenBackup) getCNSITokenRecordsBackup(endpointID string) ([]inte func (ctb *cnsiTokenBackup) RestoreEndpoints(c echo.Context) error { log.Debug("RestoreEndpoints") - // Check we can unmarshall the request + // Create the restore request struct from the body body, err := ioutil.ReadAll(c.Request().Body) if err != nil { return interfaces.NewHTTPShadowError(http.StatusBadRequest, "Invalid request body", "Invalid request body: %+v", err) @@ -220,7 +209,6 @@ func (ctb *cnsiTokenBackup) RestoreEndpoints(c echo.Context) error { return err } - // log.Warnf("BACKUP DATA: %+v", backup) // TODO: RC REMOVE c.Response().WriteHeader(http.StatusOK) return nil } @@ -310,7 +298,6 @@ func deSerializeEndpoint(endpoint map[string]interface{}) interfaces.CNSIRecord // manually add the client secret a.ClientSecret = fmt.Sprintf("%v", endpoint["client_secret"]) - // log.Errorf("CLIENT SECRET: %+v", a.ClientSecret) // TODO: RC REMOVE return a } @@ -322,19 +309,14 @@ func encryptPayload(payload *BackupContentPayload, password string, encryptionKe return nil, fmt.Errorf("Could not create hash") } - // log.Errorf("password: %+v", password) // TODO: RC REMOVE - // log.Errorf("secret: %+v", secret) // TODO: RC REMOVE - // log.Errorf("payload: %+v", payload) // TODO: RC REMOVE // Create the text that will be encrypted payloadBytes, err := json.Marshal(payload) - // log.Errorf("payloadBytes: %+v", string(payloadBytes)) // TODO: RC REMOVE if err != nil { return nil, fmt.Errorf("Could not marshal payload: %+v", err) } // Encrypt payloadEncrypted, err := crypto.EncryptToken(secret, string(payloadBytes)) - // log.Errorf("payloadEncrypted: %+v", string(payloadEncrypted)) // TODO: RC REMOVE if err != nil { return nil, fmt.Errorf("Could not encrypt payload: %+v", err) } @@ -350,14 +332,10 @@ func decryptPayload(payloadEncrypted []byte, password string, encryptionKey []by return nil, fmt.Errorf("Could not create hash") } - // log.Errorf("password: %+v", password) // TODO: RC REMOVE - // log.Errorf("secret: %+v", secret) // TODO: RC REMOVE - // log.Errorf("payloadEncrypted: %+v", payloadEncrypted) // TODO: RC REMOVE payloadUnencrypted, err := crypto.DecryptToken(secret, payloadEncrypted) if err != nil { return nil, fmt.Errorf("Failed to decrypt payload: %+v", err) } - // log.Errorf("payloadUnencrypted: %+v", string(payloadUnencrypted)) // TODO: RC REMOVE return &payloadUnencrypted, nil } diff --git a/src/jetstream/main.go b/src/jetstream/main.go index ea8da57516..53c3045e2b 100644 --- a/src/jetstream/main.go +++ b/src/jetstream/main.go @@ -973,7 +973,6 @@ func (p *portalProxy) registerRoutes(e *echo.Echo, needSetupMiddleware bool) { // Apply edits for the given endpoint adminGroup.POST("/endpoint/:id", p.updateEndpoint) - // TODO: RC Q better as `/backup` & `/restore`? adminGroup.POST("/endpoints/backup", p.backupEndpoints) adminGroup.POST("/endpoints/restore", p.restoreEndpoints) diff --git a/src/jetstream/repository/tokens/pgsql_tokens.go b/src/jetstream/repository/tokens/pgsql_tokens.go index 427541747c..32c779e355 100644 --- a/src/jetstream/repository/tokens/pgsql_tokens.go +++ b/src/jetstream/repository/tokens/pgsql_tokens.go @@ -348,7 +348,6 @@ func (p *PgsqlTokenRepository) FindAllCNSITokenBackup(cnsiGUID string, encryptio return make([]interfaces.BackupTokenRecord, 0), fmt.Errorf(msg, err) } - // TODO: RC Q should this close come before returning? it doesn't in cnsi List(encryptionKey []byte) ([]*interfaces.CNSIRecord, error) { defer rows.Close() btrs := make([]interfaces.BackupTokenRecord, 0) From 68ef3c350dca9f7dd0db989168baeadb64a223b4 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Mon, 20 Apr 2020 13:48:09 +0100 Subject: [PATCH 030/176] Fix unit tests --- .../backup-connection-cell.component.spec.ts | 22 +++++++++++++++-- .../backup-endpoints.service.ts | 2 +- .../backup-endpoints.component.spec.ts | 14 +++++++++-- .../backup-restore-cell.component.spec.ts | 24 +++++++++++++++++-- ...backup-restore-endpoints.component.spec.ts | 14 +++++++++-- .../restore-endpoints.service.ts | 3 ++- .../restore-endpoints.component.spec.ts | 14 +++++++++-- 7 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts index 9f1d8760e4..09028f8d35 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.spec.ts @@ -1,5 +1,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; +import { BaseTestModulesNoShared } from '../../../../../test-framework/core-test.helper'; +import { BackupEndpointsService } from '../backup-endpoints.service'; import { BackupConnectionCellComponent } from './backup-connection-cell.component'; describe('BackupConnectionCellComponent', () => { @@ -8,14 +11,29 @@ describe('BackupConnectionCellComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ BackupConnectionCellComponent ] + declarations: [ + BackupConnectionCellComponent, + ], + imports: [ + ...BaseTestModulesNoShared + ], + providers: [ + BackupEndpointsService + ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(BackupConnectionCellComponent); component = fixture.componentInstance; + component.row = { + guid: 'test', + cnsi_type: 'metrics', + } as EndpointModel; + component.service.initialize([{ + guid: 'test' + } as EndpointModel]); fixture.detectChanges(); }); 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 faffbeeef1..adff809338 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 @@ -84,7 +84,7 @@ export class BackupEndpointsService { } // All other settings require endpoint to be backed up - if (!this.state[endpoint.guid][BackupEndpointTypes.ENDPOINT]) { + if (!this.state[endpoint.guid] || !this.state[endpoint.guid][BackupEndpointTypes.ENDPOINT]) { return false; } diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts index 16cf213f81..3ccb5308ed 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.spec.ts @@ -1,5 +1,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { TabNavService } from '../../../../../tab-nav.service'; +import { BaseTestModulesNoShared } from '../../../../../test-framework/core-test.helper'; +import { SharedModule } from '../../../../shared/shared.module'; import { BackupEndpointsComponent } from './backup-endpoints.component'; describe('BackupEndpointsComponent', () => { @@ -8,9 +11,16 @@ describe('BackupEndpointsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ BackupEndpointsComponent ] + declarations: [BackupEndpointsComponent], + imports: [ + ...BaseTestModulesNoShared, + SharedModule + ], + providers: [ + TabNavService + ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts index 1809ff8d89..4a8ded6022 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts @@ -1,5 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; +import { BaseTestModulesNoShared } from '../../../../../test-framework/core-test.helper'; +import { BackupEndpointsService } from '../backup-endpoints.service'; +import { BackupEndpointTypes } from '../backup-restore.types'; import { BackupRestoreCellComponent } from './backup-restore-cell.component'; describe('BackupRestoreCellComponent', () => { @@ -8,14 +12,30 @@ describe('BackupRestoreCellComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ BackupRestoreCellComponent ] + declarations: [BackupRestoreCellComponent], + imports: [ + ...BaseTestModulesNoShared + ], + providers: [ + BackupEndpointsService + ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(BackupRestoreCellComponent); component = fixture.componentInstance; + component.config = { + type: BackupEndpointTypes.ENDPOINT + }; + component.row = { + guid: 'test', + cnsi_type: 'metrics', + } as EndpointModel; + component.service.initialize([{ + guid: 'test' + } as EndpointModel]); fixture.detectChanges(); }); diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts index 587eefc846..528a5ee7a9 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.spec.ts @@ -1,5 +1,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { TabNavService } from '../../../../../tab-nav.service'; +import { BaseTestModulesNoShared } from '../../../../../test-framework/core-test.helper'; +import { SharedModule } from '../../../../shared/shared.module'; import { BackupRestoreEndpointsComponent } from './backup-restore-endpoints.component'; describe('BackupRestoreEndpointsComponent', () => { @@ -8,9 +11,16 @@ describe('BackupRestoreEndpointsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ BackupRestoreEndpointsComponent ] + declarations: [BackupRestoreEndpointsComponent], + imports: [ + ...BaseTestModulesNoShared, + SharedModule + ], + providers: [ + TabNavService + ], }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts index 50d678f33d..074111bbac 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts @@ -2,7 +2,7 @@ import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { filter, map, switchMap } from 'rxjs/operators'; import { GeneralEntityAppState } from '../../../../../store/src/app-state'; import { selectSessionData } from '../../../../../store/src/reducers/auth.reducer'; @@ -53,6 +53,7 @@ export class RestoreEndpointsService { private setupStep1() { this.currentDbVersion$ = this.store.select(selectSessionData()).pipe( + filter(sd => !!sd), map((sd: SessionData) => sd.version.database_version) ); diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts index b260285638..ff141f7953 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.spec.ts @@ -1,5 +1,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { TabNavService } from '../../../../../tab-nav.service'; +import { BaseTestModulesNoShared } from '../../../../../test-framework/core-test.helper'; +import { SharedModule } from '../../../../shared/shared.module'; import { RestoreEndpointsComponent } from './restore-endpoints.component'; describe('RestoreEndpointsComponent', () => { @@ -8,9 +11,16 @@ describe('RestoreEndpointsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ RestoreEndpointsComponent ] + declarations: [RestoreEndpointsComponent], + imports: [ + ...BaseTestModulesNoShared, + SharedModule + ], + providers: [ + TabNavService + ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { From 5736f8477ef0a561d9424b17a7ee8654b4584aed Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Mon, 20 Apr 2020 13:49:37 +0100 Subject: [PATCH 031/176] Re-add tests that now work --- .../autoscaler-metric-page.component.spec.ts | 10 ++-------- .../autoscaler-scale-history-page.component.spec.ts | 9 ++------- .../application-instance-chart.component.spec.ts | 3 +-- .../tabs/metrics-tab/metrics-tab.component.spec.ts | 3 +-- .../cloud-foundry-cell-apps.component.spec.ts | 7 ++----- .../cloud-foundry-cell-base.component.spec.ts | 11 +++++------ .../cloud-foundry-cell-charts.component.spec.ts | 7 ++----- .../cloud-foundry-cell-summary.component.spec.ts | 9 +++------ .../connect-endpoint-dialog.component.spec.ts | 9 +++++---- .../connect-endpoint.component.spec.ts | 5 ++--- .../create-endpoint-cf-step-1.component.spec.ts | 5 ++--- .../create-endpoint.component.spec.ts | 12 +++++++----- .../metrics/metrics/metrics.component.spec.ts | 5 ++--- .../metrics-chart/metrics-chart.component.spec.ts | 4 ++-- 14 files changed, 38 insertions(+), 61 deletions(-) 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 0c897ce7f2..e59ab50816 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 @@ -2,18 +2,17 @@ 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 { 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 { AutoscalerMetricPageComponent } from './autoscaler-metric-page.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('AutoscalerMetricPageComponent', () => { +describe('AutoscalerMetricPageComponent', () => { let component: AutoscalerMetricPageComponent; let fixture: ComponentFixture; @@ -47,10 +46,5 @@ xdescribe('AutoscalerMetricPageComponent', () => { expect(component).toBeTruthy(); }); - // TODO: Fix after metrics has been sorted - STRAT-152 (cause of `Cannot read property 'getEntityMonitor' of undefined` test failure) - it('Blocked', () => { - fail('Blocked: Requires metrics to be working (specifically metrics entities)'); - }); - afterAll(() => { }); }); 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 55eead24ce..043a399200 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 @@ -2,18 +2,17 @@ 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 { 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 { AutoscalerScaleHistoryPageComponent } from './autoscaler-scale-history-page.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('AutoscalerScaleHistoryPageComponent', () => { +describe('AutoscalerScaleHistoryPageComponent', () => { let component: AutoscalerScaleHistoryPageComponent; let fixture: ComponentFixture; @@ -47,9 +46,5 @@ xdescribe('AutoscalerScaleHistoryPageComponent', () => { expect(component).toBeTruthy(); }); - // TODO: Fix after metrics has been sorted - STRAT-152 (cause of `Cannot read property 'getEntityMonitor' of undefined` test failure) - it('Blocked', () => { - fail('Blocked: Requires metrics to be working (specifically metrics entities)'); - }); }); 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 4680ae8b5c..ebdde598a6 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 @@ -7,8 +7,7 @@ import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationInstanceChartComponent } from './application-instance-chart.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('ApplicationInstanceChartComponent', () => { +describe('ApplicationInstanceChartComponent', () => { let component: ApplicationInstanceChartComponent; let fixture: ComponentFixture; 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 bb8752a65f..fdc73fff41 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 @@ -17,8 +17,7 @@ import { applicationEntityType } from '../../../../../../cf-entity-types'; import { ApplicationEnvVarsHelper } from '../build-tab/application-env-vars.service'; import { MetricsTabComponent } from './metrics-tab.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('MetricsTabComponent', () => { +describe('MetricsTabComponent', () => { let component: MetricsTabComponent; let fixture: ComponentFixture; const appId = '1'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-apps/cloud-foundry-cell-apps.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-apps/cloud-foundry-cell-apps.component.spec.ts index ba1472e058..af4480e9dc 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-apps/cloud-foundry-cell-apps.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-apps/cloud-foundry-cell-apps.component.spec.ts @@ -1,13 +1,10 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - generateCfBaseTestModules, -} from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { generateCfBaseTestModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ActiveRouteCfCell } from '../../../../cf-page.types'; import { CloudFoundryCellAppsComponent } from './cloud-foundry-cell-apps.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('CloudFoundryCellAppsComponent', () => { +describe('CloudFoundryCellAppsComponent', () => { let component: CloudFoundryCellAppsComponent; let fixture: ComponentFixture; 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 93d7b9a131..205c8a732e 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 @@ -1,16 +1,14 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TabNavService } from '../../../../../../../../core/tab-nav.service'; -import { - generateCfBaseTestModules, -} from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { generateCfBaseTestModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CfUserService } from '../../../../../../shared/data-services/cf-user.service'; import { ActiveRouteCfOrgSpace } from '../../../../cf-page.types'; import { CloudFoundryEndpointService } from '../../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryCellService } from '../cloud-foundry-cell.service'; import { CloudFoundryCellBaseComponent } from './cloud-foundry-cell-base.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('CloudFoundryCellBaseComponent', () => { +describe('CloudFoundryCellBaseComponent', () => { let component: CloudFoundryCellBaseComponent; let fixture: ComponentFixture; @@ -22,7 +20,8 @@ xdescribe('CloudFoundryCellBaseComponent', () => { CloudFoundryEndpointService, CloudFoundryCellService, ActiveRouteCfOrgSpace, - TabNavService + TabNavService, + CfUserService ] }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-charts/cloud-foundry-cell-charts.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-charts/cloud-foundry-cell-charts.component.spec.ts index bf10e45c66..047523224d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-charts/cloud-foundry-cell-charts.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-charts/cloud-foundry-cell-charts.component.spec.ts @@ -1,14 +1,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - generateCfBaseTestModules, -} from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { generateCfBaseTestModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ActiveRouteCfCell } from '../../../../cf-page.types'; import { CloudFoundryCellService } from '../cloud-foundry-cell.service'; import { CloudFoundryCellChartsComponent } from './cloud-foundry-cell-charts.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('CloudFoundryCellChartsComponent', () => { +describe('CloudFoundryCellChartsComponent', () => { let component: CloudFoundryCellChartsComponent; let fixture: ComponentFixture; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-summary/cloud-foundry-cell-summary.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-summary/cloud-foundry-cell-summary.component.spec.ts index 8bf289dfb4..e8c160cbcf 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-summary/cloud-foundry-cell-summary.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-summary/cloud-foundry-cell-summary.component.spec.ts @@ -11,14 +11,12 @@ import { MetricsChartHelpers, } from '../../../../../../../../core/src/shared/components/metrics-chart/metrics.component.helpers'; import { MetricQueryType } from '../../../../../../../../core/src/shared/services/metrics-range-selector.types'; -import { - generateCfBaseTestModules, -} from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { MetricQueryConfig } from '../../../../../../../../store/src/actions/metrics.actions'; +import { generateCfBaseTestModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { FetchCFCellMetricsAction } from '../../../../../../actions/cf-metrics.actions'; import { ActiveRouteCfCell } from '../../../../cf-page.types'; import { CloudFoundryCellService } from '../cloud-foundry-cell.service'; import { CloudFoundryCellSummaryComponent } from './cloud-foundry-cell-summary.component'; -import { FetchCFCellMetricsAction } from '../../../../../../actions/cf-metrics.actions'; class MockCloudFoundryCellService { cfGuid = 'cfGuid'; @@ -60,8 +58,7 @@ class MockCloudFoundryCellService { } -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('CloudFoundryCellSummaryComponent', () => { +describe('CloudFoundryCellSummaryComponent', () => { let component: CloudFoundryCellSummaryComponent; let fixture: ComponentFixture; diff --git a/src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/connect-endpoint-dialog.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/connect-endpoint-dialog.component.spec.ts index 5f93a9992b..93034184a4 100644 --- a/src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/connect-endpoint-dialog.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/connect-endpoint-dialog.component.spec.ts @@ -4,10 +4,11 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreModule } from '../../../core/core.module'; +import { SidePanelService } from '../../../shared/services/side-panel.service'; import { SharedModule } from '../../../shared/shared.module'; import { ConnectEndpointComponent } from '../connect-endpoint/connect-endpoint.component'; import { ConnectEndpointConfig } from '../connect.service'; @@ -25,8 +26,7 @@ class MatDialogDataMock implements ConnectEndpointConfig { ssoAllowed = false; } -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('ConnectEndpointDialogComponent', () => { +describe('ConnectEndpointDialogComponent', () => { let component: ConnectEndpointDialogComponent; let fixture: ComponentFixture; @@ -34,7 +34,8 @@ xdescribe('ConnectEndpointDialogComponent', () => { const testingModule = TestBed.configureTestingModule({ providers: [ { provide: MatDialogRef, useClass: MatDialogRefMock }, - { provide: MAT_DIALOG_DATA, useClass: MatDialogDataMock } + { provide: MAT_DIALOG_DATA, useClass: MatDialogDataMock }, + SidePanelService ], declarations: [ ConnectEndpointDialogComponent, diff --git a/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.spec.ts index 3097c898b3..d265f5b75b 100644 --- a/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.spec.ts @@ -1,14 +1,13 @@ import { CommonModule } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreModule } from '../../../core/core.module'; import { SharedModule } from '../../../shared/shared.module'; import { ConnectEndpointComponent } from './connect-endpoint.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('ConnectEndpointComponent', () => { +describe('ConnectEndpointComponent', () => { let component: ConnectEndpointComponent; let fixture: ComponentFixture; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.spec.ts index 0c9396218b..0d1c1e7a2c 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.spec.ts @@ -1,15 +1,14 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute } from '@angular/router'; +import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreTestingModule } from '../../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreModule } from '../../../../core/core.module'; import { SharedModule } from '../../../../shared/shared.module'; import { CreateEndpointCfStep1Component } from './create-endpoint-cf-step-1.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('CreateEndpointCfStep1Component', () => { +describe('CreateEndpointCfStep1Component', () => { let component: CreateEndpointCfStep1Component; let fixture: ComponentFixture; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.spec.ts index 36294cefcf..dda3a78ace 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.spec.ts @@ -1,21 +1,21 @@ +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'; import { RouterTestingModule } from '@angular/router/testing'; +import { createBasicStoreModule } from '@stratos/store/testing'; import { TabNavService } from '../../../../tab-nav.service'; import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreModule } from '../../../core/core.module'; +import { SidePanelService } from '../../../shared/services/side-panel.service'; import { SharedModule } from '../../../shared/shared.module'; import { ConnectEndpointComponent } from '../connect-endpoint/connect-endpoint.component'; import { CreateEndpointCfStep1Component } from './create-endpoint-cf-step-1/create-endpoint-cf-step-1.component'; import { CreateEndpointConnectComponent } from './create-endpoint-connect/create-endpoint-connect.component'; import { CreateEndpointComponent } from './create-endpoint.component'; -import { HttpClientModule } from '@angular/common/http'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('CreateEndpointComponent', () => { +describe('CreateEndpointComponent', () => { let component: CreateEndpointComponent; let fixture: ComponentFixture; @@ -47,7 +47,9 @@ xdescribe('CreateEndpointComponent', () => { } } } - }, TabNavService], + }, + TabNavService, + SidePanelService], }) .compileComponents(); })); diff --git a/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.spec.ts b/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.spec.ts index 34602f97ab..f0097b1e8e 100644 --- a/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.spec.ts +++ b/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.spec.ts @@ -2,17 +2,16 @@ import { CommonModule } 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 { createBasicStoreModule } from '@stratos/store/testing'; import { TabNavService } from '../../../../tab-nav.service'; import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreModule } from '../../../core/core.module'; import { SharedModule } from '../../../shared/shared.module'; import { MetricsService } from '../services/metrics-service'; import { MetricsComponent } from './metrics.component'; -// TODO: Fix after metrics has been sorted - STRAT-152 -xdescribe('MetricsComponent', () => { +describe('MetricsComponent', () => { let component: MetricsComponent; let fixture: ComponentFixture; 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 36029be8ae..98fa58a275 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 @@ -1,15 +1,15 @@ 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 { createBasicStoreModule } from '@stratos/store/testing'; import { CoreModule } from '../../../core/core.module'; import { MDAppModule } from '../../../core/md.module'; import { SharedModule } from '../../shared.module'; import { MetricsChartComponent } from './metrics-chart.component'; import { MetricsLineChartConfig } from './metrics-chart.types'; -import { FetchApplicationMetricsAction } from '../../../../../cloud-foundry/src/actions/cf-metrics.actions'; // TODO: Fix after metrics has been sorted - STRAT-152 xdescribe('MetricsChartComponent', () => { From de03a0131ea651060b41359615e623b075883007 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Mon, 20 Apr 2020 15:12:58 +0100 Subject: [PATCH 032/176] Changes following review --- .../packages/core/sass/_all-theme.scss | 4 +- .../backup-checkbox-cell.component.html} | 0 .../backup-checkbox-cell.component.scss} | 0 .../backup-checkbox-cell.component.spec.ts} | 12 ++-- .../backup-checkbox-cell.component.ts} | 10 +-- .../backup-connection-cell.component.html | 3 +- .../backup-connection-cell.component.ts | 11 +++- .../backup-endpoints.service.ts | 63 +++++++++---------- .../backup-endpoints.component.ts | 21 +++---- .../backup-restore-endpoints.component.html | 3 +- .../backup-restore-endpoints.component.ts | 2 - .../restore-endpoints.service.ts | 25 ++++---- .../restore-endpoints.component.html | 24 ++++--- .../restore-endpoints.component.scss | 9 +++ .../restore-endpoints.component.theme.scss | 11 ++++ .../restore-endpoints.component.ts | 6 +- .../features/endpoints/endpoints.module.ts | 6 +- .../endpoint/endpoints-list-config.service.ts | 1 - .../store/src/types/endpoint.types.ts | 2 + src/jetstream/authcnsi.go | 2 +- src/jetstream/cnsi.go | 14 ++++- src/jetstream/cnsi_token_backup.go | 60 ++++++++---------- src/jetstream/repository/cnsis/cnsis.go | 2 +- src/jetstream/repository/cnsis/pgsql_cnsis.go | 5 +- .../repository/tokens/pgsql_tokens.go | 1 + src/jetstream/repository/tokens/tokens.go | 3 +- 26 files changed, 168 insertions(+), 132 deletions(-) rename src/frontend/packages/core/src/features/endpoints/backup-restore/{backup-restore-cell/backup-restore-cell.component.html => backup-checkbox-cell/backup-checkbox-cell.component.html} (100%) rename src/frontend/packages/core/src/features/endpoints/backup-restore/{backup-restore-cell/backup-restore-cell.component.scss => backup-checkbox-cell/backup-checkbox-cell.component.scss} (100%) rename src/frontend/packages/core/src/features/endpoints/backup-restore/{backup-restore-cell/backup-restore-cell.component.spec.ts => backup-checkbox-cell/backup-checkbox-cell.component.spec.ts} (74%) rename src/frontend/packages/core/src/features/endpoints/backup-restore/{backup-restore-cell/backup-restore-cell.component.ts => backup-checkbox-cell/backup-checkbox-cell.component.ts} (64%) create mode 100644 src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.theme.scss diff --git a/src/frontend/packages/core/sass/_all-theme.scss b/src/frontend/packages/core/sass/_all-theme.scss index 3daaa41180..a6fdef57e5 100644 --- a/src/frontend/packages/core/sass/_all-theme.scss +++ b/src/frontend/packages/core/sass/_all-theme.scss @@ -65,7 +65,8 @@ @import '../../cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-firehose/cloud-foundry-firehose.component.theme'; @import '../../cloud-foundry/src/features/service-catalog/service-catalog-page/service-catalog-page.component.theme'; @import '../../cloud-foundry/src/features/applications/application-wall/application-wall.component.theme'; -@import '../../core/src/features/error-page/error-page/error-page.component.theme.scss'; +@import '../../core/src/features/error-page/error-page/error-page.component.theme'; +@import '../../core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.theme'; // Defaults $side-nav-light-text: #fff; @@ -159,6 +160,7 @@ $side-nav-light-active: #484848; @include code-block-theme($theme, $app-theme); @include copy-to-clipboard-theme($theme, $app-theme); @include app-user-avatar-theme($theme, $app-theme); + @include restore-endpoints-theme($theme, $app-theme) } @function app-generate-nav-theme($theme, $nav-theme: null) { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.html similarity index 100% rename from src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.html rename to src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.html diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.scss rename to src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.scss diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.spec.ts similarity index 74% rename from src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts rename to src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.spec.ts index 4a8ded6022..448a1eac17 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.spec.ts @@ -4,15 +4,15 @@ import { EndpointModel } from '../../../../../../store/src/types/endpoint.types' import { BaseTestModulesNoShared } from '../../../../../test-framework/core-test.helper'; import { BackupEndpointsService } from '../backup-endpoints.service'; import { BackupEndpointTypes } from '../backup-restore.types'; -import { BackupRestoreCellComponent } from './backup-restore-cell.component'; +import { BackupCheckboxCellComponent } from './backup-checkbox-cell.component'; -describe('BackupRestoreCellComponent', () => { - let component: BackupRestoreCellComponent; - let fixture: ComponentFixture; +describe('BackupCheckboxCellComponent', () => { + let component: BackupCheckboxCellComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [BackupRestoreCellComponent], + declarations: [BackupCheckboxCellComponent], imports: [ ...BaseTestModulesNoShared ], @@ -24,7 +24,7 @@ describe('BackupRestoreCellComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(BackupRestoreCellComponent); + fixture = TestBed.createComponent(BackupCheckboxCellComponent); component = fixture.componentInstance; component.config = { type: BackupEndpointTypes.ENDPOINT diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.ts similarity index 64% rename from src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts rename to src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.ts index 0a1b80d52d..0098d10c9b 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-cell/backup-restore-cell.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-checkbox-cell/backup-checkbox-cell.component.ts @@ -5,18 +5,18 @@ import { TableCellCustom } from '../../../../shared/components/list/list.types'; import { BackupEndpointsService } from '../backup-endpoints.service'; @Component({ - selector: 'app-backup-restore-cell', - templateUrl: './backup-restore-cell.component.html', - styleUrls: ['./backup-restore-cell.component.scss'] + selector: 'app-backup-checkbox-cell', + templateUrl: './backup-checkbox-cell.component.html', + styleUrls: ['./backup-checkbox-cell.component.scss'] }) -export class BackupRestoreCellComponent extends TableCellCustom { +export class BackupCheckboxCellComponent extends TableCellCustom { constructor(public service: BackupEndpointsService) { super(); } validate() { - this.service.validate(); + this.service.stateUpdated(); } disabled(): boolean { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html index c964d79408..43e7eee490 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.html @@ -2,7 +2,8 @@ None - Current User + Current User All Users 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 67c64ab19e..978f098196 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,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; +import { EndpointModel, SystemSharedUserGuid } from '../../../../../../store/src/types/endpoint.types'; import { TableCellCustom } from '../../../../shared/components/list/list.types'; import { BackupEndpointsService } from '../backup-endpoints.service'; import { BackupEndpointConnectionTypes, BackupEndpointTypes } from '../backup-restore.types'; @@ -17,15 +17,20 @@ export class BackupConnectionCellComponent extends TableCellCustom; - userId: string; password: string; } @@ -51,10 +48,10 @@ export class BackupEndpointsService { entity }; }); - this.validate(); + this.stateUpdated(); } - validate() { + stateUpdated() { const endpoints = Object.values(this.state); endpoints.forEach(endpoint => { if (!endpoint[BackupEndpointTypes.ENDPOINT]) { @@ -69,7 +66,8 @@ export class BackupEndpointsService { this.hasChanges.next(hasChanges); const allChanged = endpoints.every(endpoint => { const e = !this.canBackupEndpoint(endpoint.entity, BackupEndpointTypes.ENDPOINT) || endpoint[BackupEndpointTypes.ENDPOINT]; - const c = !this.canBackupEndpoint(endpoint.entity, BackupEndpointTypes.CONNECT) || endpoint[BackupEndpointTypes.CONNECT] !== BackupEndpointConnectionTypes.NONE; + const c = !this.canBackupEndpoint(endpoint.entity, BackupEndpointTypes.CONNECT) || + endpoint[BackupEndpointTypes.CONNECT] !== BackupEndpointConnectionTypes.NONE; return e && c; } @@ -110,7 +108,7 @@ export class BackupEndpointsService { endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.ALL; } }); - this.validate(); + this.stateUpdated(); } selectNone() { @@ -118,7 +116,7 @@ export class BackupEndpointsService { endpoint[BackupEndpointTypes.ENDPOINT] = false; endpoint[BackupEndpointTypes.CONNECT] = BackupEndpointConnectionTypes.NONE; }); - this.validate(); + this.stateUpdated(); } hasConnectionDetails(): boolean { @@ -135,19 +133,18 @@ export class BackupEndpointsService { encoder: new BrowserStandardEncoder() }); - return this.getSessionData().pipe( - switchMap(ses => this.http.post(url, this.createBodyToSend(ses), { - params - })), - map(res => { - console.log('Response: ', res); - return new Blob([JSON.stringify(res)]); - }), + // return this.getSessionData().pipe( + // switchMap(ses => this.http.post(url, this.createBodyToSend(ses), { params })), + // map(res => new Blob([JSON.stringify(res)])), + // first(), + // ); + return this.http.post(url, this.createBodyToSend(), { params }).pipe( + map(res => new Blob([JSON.stringify(res)])), first(), ); } - private createBodyToSend(sd: SessionData): BackupRequest { + private createBodyToSend(): BackupRequest { const state: BackupEndpointsConfig = Object.entries(this.state).reduce((res, [endpointId, endpoint]) => { if (endpoint[BackupEndpointTypes.ENDPOINT]) { const { entity, ...rest } = endpoint; @@ -160,25 +157,25 @@ export class BackupEndpointsService { }, {}); return { state, - userId: this.getUserIdFromSessionData(sd), + // userId: this.getUserIdFromSessionData(sd), password: this.password, }; } - private getUserIdFromSessionData(sd: SessionData): string { - if (sd && sd.user) { - return sd.user.guid; - } - return null; - } - - private getSessionData(): Observable { - return this.store.select(s => s.auth).pipe( - filter(auth => !!(auth && auth.sessionData)), - map((auth: AuthState) => auth.sessionData), - first() - ); - } + // private getUserIdFromSessionData(sd: SessionData): string { + // if (sd && sd.user) { + // return sd.user.guid; + // } + // return null; + // } + + // private getSessionData(): Observable { + // return this.store.select(s => s.auth).pipe( + // filter(auth => !!(auth && auth.sessionData)), + // map((auth: AuthState) => auth.sessionData), + // first() + // ); + // } 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 6a64e5d9f1..1d24656803 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 @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Store } from '@ngrx/store'; import * as moment from 'moment'; @@ -17,9 +17,9 @@ import { ConfirmationDialogService } from '../../../../shared/components/confirm import { ITableListDataSource } from '../../../../shared/components/list/data-sources-controllers/list-data-source-types'; import { ITableColumn } from '../../../../shared/components/list/list-table/table.types'; import { StepOnNextFunction, StepOnNextResult } from '../../../../shared/components/stepper/step/step.component'; +import { BackupCheckboxCellComponent } from '../backup-checkbox-cell/backup-checkbox-cell.component'; import { BackupConnectionCellComponent } from '../backup-connection-cell/backup-connection-cell.component'; import { BackupEndpointsService } from '../backup-endpoints.service'; -import { BackupRestoreCellComponent } from '../backup-restore-cell/backup-restore-cell.component'; import { BackupEndpointTypes } from '../backup-restore.types'; @Component({ @@ -30,7 +30,7 @@ import { BackupEndpointTypes } from '../backup-restore.types'; BackupEndpointsService ] }) -export class BackupEndpointsComponent implements OnInit { +export class BackupEndpointsComponent { // Step 1 columns: ITableColumn[] = [ @@ -51,7 +51,7 @@ export class BackupEndpointsComponent implements OnInit { { columnId: 'endpoint', headerCell: () => 'Backup', - cellComponent: BackupRestoreCellComponent, + cellComponent: BackupCheckboxCellComponent, cellConfig: { type: BackupEndpointTypes.ENDPOINT } @@ -130,9 +130,6 @@ export class BackupEndpointsComponent implements OnInit { ); } - ngOnInit() { - } - onNext: StepOnNextFunction = () => { const confirmation = new ConfirmationDialogConfig( 'Backup', @@ -149,11 +146,6 @@ export class BackupEndpointsComponent implements OnInit { }; const backupSuccess = data => { - result.next({ - success: true, - redirect: true, - }); - const downloadURL = window.URL.createObjectURL(data); const link = document.createElement('a'); link.href = downloadURL; @@ -161,6 +153,11 @@ export class BackupEndpointsComponent implements OnInit { const dateTime = moment().format('YYYYMMDD-HHmmss'); link.download = `stratos_backup_${dateTime}.bk`; link.click(); + + result.next({ + success: true, + redirect: true, + }); }; const backupFailure = err => { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html index d1ea1197f7..089175d985 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.html @@ -5,8 +5,7 @@

Backup/Restore Endpoints

- -

Create a backup of Endpoints and their connection details or restore from an existing backup.

+

Create a backup of endpoints and their connection details or restore from an existing backup.

diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts index 90b1e4cc2d..615c1d2021 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-restore-endpoints/backup-restore-endpoints.component.ts @@ -17,8 +17,6 @@ interface IAppTileData extends ITileData { }) export class BackupRestoreEndpointsComponent { - // static BACKUP_RESTORE_PARAM = 'backup'; - public serviceType: string; public tileSelectorConfig: ITileConfig[]; diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts index 074111bbac..8fa35048c1 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints.service.ts @@ -36,6 +36,7 @@ export class RestoreEndpointsService { validDb = new BehaviorSubject(false); validDb$: Observable; + unparsableFileContent: string = null; currentDbVersion$: Observable; ignoreDbVersion = new BehaviorSubject(false); ignoreDbVersion$ = this.ignoreDbVersion.asObservable(); @@ -61,8 +62,9 @@ export class RestoreEndpointsService { this.file$, this.currentDbVersion$ ]).pipe( + filter(([file,]) => !!file && !!file.content), map(([file, currentDbVersion]) => { - return file && file.content.dbVersion === currentDbVersion; + return file && file.content && file.content.dbVersion === currentDbVersion; }) ); @@ -93,20 +95,17 @@ export class RestoreEndpointsService { let parsedContent: BackupContent; try { parsedContent = JSON.parse(content); - } catch (e) { - this.logger.warn('Failed to parse file contents: ', e); + this.unparsableFileContent = null; + } catch (err) { + this.logger.warn('Failed to parse file contents: ', err); + parsedContent = null; + this.unparsableFileContent = `${err instanceof Error ? err.message : String(err)}`; } - if (!!parsedContent) { - this.file.next({ - name: fileName, - content: parsedContent - }); - } else { - this.file.next(null); - } - - // this.updateFileContentValidation(); + this.file.next({ + name: fileName, + content: parsedContent + }); } setIgnoreDbVersion(ignore: boolean) { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html index 722d3a5e87..4e8e0bfbaf 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html @@ -15,13 +15,23 @@

Restore Endpoints

-
-

The database version of Stratos ({{service.currentDbVersion$ | async}}) and the backup - ({{file.content.dbVersion}}) are different. Restoring this file may have adverse affects. -

- - Ignore different database versions - +
+
+

+ warning The database version of Stratos + ({{service.currentDbVersion$ | async}}) and the backup + ({{file.content.dbVersion}}) are different. Restoring this file may have adverse affects. +

+ + Ignore different database versions + +
+
+

+ warning Unable to parse file contents. Reason: + {{service.unparsableFileContent}} +

+
diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss index 60b6ddd949..7fb53ed32c 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.scss @@ -20,4 +20,13 @@ } } + &__error { + p { + align-items: center; + display: flex; + } + mat-icon { + margin-right: 10px; + } + } } diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.theme.scss b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.theme.scss new file mode 100644 index 0000000000..335545c7ad --- /dev/null +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.theme.scss @@ -0,0 +1,11 @@ +@mixin restore-endpoints-theme($theme, $app-theme) { + $status-colors: map-get($app-theme, status); + $warn-color: map-get($status-colors, warning); + .file-step { + &__error { + mat-icon { + color: $warn-color; + } + } + } +} 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 64b2e5e592..2904f6024d 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 @@ -78,7 +78,7 @@ export class RestoreEndpointsComponent { }); }; - const restoreSuccess = data => { + const restoreSuccess = () => { this.store.dispatch(new GetAllEndpoints()); result.next({ success: true, @@ -95,9 +95,9 @@ export class RestoreEndpointsComponent { return of(false); }; - const createBackup = () => this.service.restoreBackup().pipe(first()).subscribe(restoreSuccess, backupFailure); + const restoreBackup = () => this.service.restoreBackup().pipe(first()).subscribe(restoreSuccess, backupFailure); - this.confirmDialog.openWithCancel(confirmation, createBackup, userCancelledDialog); + this.confirmDialog.openWithCancel(confirmation, restoreBackup, userCancelledDialog); return result.asObservable(); } diff --git a/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts b/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts index 307379946a..44a05e8e2a 100644 --- a/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts +++ b/src/frontend/packages/core/src/features/endpoints/endpoints.module.ts @@ -2,9 +2,9 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../core/core.module'; import { SharedModule } from '../../shared/shared.module'; +import { BackupCheckboxCellComponent } from './backup-restore/backup-checkbox-cell/backup-checkbox-cell.component'; import { BackupConnectionCellComponent } from './backup-restore/backup-connection-cell/backup-connection-cell.component'; import { BackupEndpointsComponent } from './backup-restore/backup-endpoints/backup-endpoints.component'; -import { BackupRestoreCellComponent } from './backup-restore/backup-restore-cell/backup-restore-cell.component'; import { BackupRestoreEndpointsComponent, } from './backup-restore/backup-restore-endpoints/backup-restore-endpoints.component'; @@ -37,7 +37,7 @@ import { EndpointsRoutingModule } from './endpoints.routing'; BackupRestoreEndpointsComponent, BackupEndpointsComponent, RestoreEndpointsComponent, - BackupRestoreCellComponent, + BackupCheckboxCellComponent, BackupConnectionCellComponent, ], entryComponents: [ @@ -45,7 +45,7 @@ import { EndpointsRoutingModule } from './endpoints.routing'; CredentialsAuthFormComponent, SSOAuthFormComponent, NoneAuthFormComponent, - BackupRestoreCellComponent, + BackupCheckboxCellComponent, BackupConnectionCellComponent ] }) 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 44e7281b6a..8483e01383 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 @@ -106,7 +106,6 @@ export class EndpointsListConfigService implements IListConfig { internalEventMonitorFactory: InternalEventMonitorFactory, endpointListHelper: EndpointListHelper, favoritesConfigMapper: FavoritesConfigMapper, - // private router: Router ) { this.singleActions = endpointListHelper.endpointActions(); const favoriteCell = createTableColumnFavorite( diff --git a/src/frontend/packages/store/src/types/endpoint.types.ts b/src/frontend/packages/store/src/types/endpoint.types.ts index 6ec7c8e09a..83bf97984a 100644 --- a/src/frontend/packages/store/src/types/endpoint.types.ts +++ b/src/frontend/packages/store/src/types/endpoint.types.ts @@ -60,6 +60,8 @@ export interface EndpointModel { metricsAvailable: boolean; } +export const SystemSharedUserGuid = '00000000-1111-2222-3333-444444444444'; + // Metadata for the user connected to an endpoint export interface EndpointUser { guid: string; diff --git a/src/jetstream/authcnsi.go b/src/jetstream/authcnsi.go index 39cf03db4b..55809904d3 100644 --- a/src/jetstream/authcnsi.go +++ b/src/jetstream/authcnsi.go @@ -261,7 +261,7 @@ func (p *portalProxy) DoLoginToCNSIwithConsoleUAAtoken(c echo.Context, theCNSIre func santizeInfoForSystemSharedTokenUser(cnsiUser *interfaces.ConnectedUser, isSysystemShared bool) { if isSysystemShared { - cnsiUser.GUID = tokens.SystemSharedUserGuid + cnsiUser.GUID = tokens.SystemSharedUserGuid // Used by front end also cnsiUser.Scopes = make([]string, 0) cnsiUser.Name = "system_shared" } diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index afaaebf9cf..3520a06ccf 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -637,11 +637,17 @@ func (p *portalProxy) updateEndpoint(c echo.Context) error { } func (p *portalProxy) backupEndpoints(c echo.Context) error { - log.Debug("BackupEndpoints") + log.Debug("backupEndpoints") + + userID, err := p.GetSessionStringValue(c, "user_id") + if err != nil { + return echo.NewHTTPError(http.StatusUnauthorized, "Could not find correct session value") + } ctb := &cnsiTokenBackup{ databaseConnectionPool: p.DatabaseConnectionPool, encryptionKey: p.Config.EncryptionKeyInBytes, + userID: userID, p: p, } @@ -651,9 +657,15 @@ func (p *portalProxy) backupEndpoints(c echo.Context) error { func (p *portalProxy) restoreEndpoints(c echo.Context) error { log.Debug("restoreEndpoints") + userID, err := p.GetSessionStringValue(c, "user_id") + if err != nil { + return echo.NewHTTPError(http.StatusUnauthorized, "Could not find correct session value") + } + ctb := &cnsiTokenBackup{ databaseConnectionPool: p.DatabaseConnectionPool, encryptionKey: p.Config.EncryptionKeyInBytes, + userID: userID, p: p, } diff --git a/src/jetstream/cnsi_token_backup.go b/src/jetstream/cnsi_token_backup.go index 3f4c4f77b9..0666493f47 100644 --- a/src/jetstream/cnsi_token_backup.go +++ b/src/jetstream/cnsi_token_backup.go @@ -1,7 +1,7 @@ package main import ( - "crypto/md5" + "crypto/sha256" "database/sql" "encoding/json" "fmt" @@ -19,6 +19,7 @@ import ( type cnsiTokenBackup struct { databaseConnectionPool *sql.DB encryptionKey []byte + userID string p *portalProxy } @@ -39,10 +40,8 @@ type BackupEndpointsState struct { // BackupRequest - Request from client to create a back up file type BackupRequest struct { - State map[string]BackupEndpointsState `json:"state"` - UserID string `json:"userId"` - DBVersion string `json:"dbVersion"` - Password string `json:"password"` + State map[string]BackupEndpointsState `json:"state"` + Password string `json:"password"` } // BackupContentPayload - Encrypted part of the backup @@ -133,17 +132,16 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e return nil, interfaces.NewHTTPError(http.StatusBadGateway, text) } case BACKUP_CONNECTION_CURRENT: - if tokenRecord, ok := ctb.p.GetCNSITokenRecordWithDisconnected(endpointID, data.UserID); ok { - log.Warn("tokens for Connect") + if tokenRecord, ok := ctb.p.GetCNSITokenRecordWithDisconnected(endpointID, ctb.userID); ok { var btr = interfaces.BackupTokenRecord{ TokenRecord: tokenRecord, EndpointGUID: endpointID, - TokenType: "CNSI", - UserGUID: data.UserID, + TokenType: "cnsi", + UserGUID: ctb.userID, } tokens = append(tokens, btr) } else { - text := fmt.Sprintf("Request to back up connected user's (%+v) token for endpoint (%+v) failed.", endpointID, data.UserID) + text := fmt.Sprintf("Request to back up connected user's (%+v) token for endpoint (%+v) failed.", endpointID, ctb.userID) return nil, interfaces.NewHTTPError(http.StatusBadGateway, text) } } @@ -156,7 +154,7 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e } // Encrypt the entire payload - encryptedPayload, err := encryptPayload(payload, data.Password, ctb.encryptionKey) + encryptedPayload, err := encryptPayload(payload, data.Password) if err != nil { return nil, interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not encrypt payload", "Could not encrypt payload: %+v", err) } @@ -235,7 +233,7 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { } // Get the actual, unencrypted set of endpoints and tokens - payloadString, err := decryptPayload(data.Payload, backup.Password, ctb.encryptionKey) + payloadString, err := decryptPayload(data.Payload, backup.Password) if err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to decrypt payload", "Failed to decrypt payload: %+v", err) } @@ -252,7 +250,7 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { for _, endpoint := range payload.Endpoints { e := deSerializeEndpoint(endpoint) - if err := cnsiRepo.Overwrite(e, ctb.encryptionKey); err != nil { + if err := cnsiRepo.SaveOrUpdate(e, ctb.encryptionKey); err != nil { return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Failed to overwrite endpoints", "Failed to overwrite endpoint: %+v", e.Name) } } @@ -273,15 +271,13 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { // Work around the omission of the client secret when serialising the cnsi record func serializeEndpoint(endpoint *interfaces.CNSIRecord) map[string]interface{} { - // encode the original + // Convert struct to generic map m, _ := json.Marshal(endpoint) - - // decode it back to get a map var a interface{} json.Unmarshal(m, &a) newEndpoint := a.(map[string]interface{}) - // Replace the map key + // Apply the correct client secret newEndpoint["client_secret"] = endpoint.ClientSecret return newEndpoint @@ -289,21 +285,19 @@ func serializeEndpoint(endpoint *interfaces.CNSIRecord) map[string]interface{} { // Work around the omission of the client secret when serialising the cnsi record func deSerializeEndpoint(endpoint map[string]interface{}) interfaces.CNSIRecord { - // encode the endpoint map + // Convert struct to endpoint m, _ := json.Marshal(endpoint) + var cnsi interfaces.CNSIRecord + json.Unmarshal(m, &cnsi) - // decode it back to get a record with all values except client secret - var a interfaces.CNSIRecord - json.Unmarshal(m, &a) - - // manually add the client secret - a.ClientSecret = fmt.Sprintf("%v", endpoint["client_secret"]) - return a + // Apply the correct client secret + cnsi.ClientSecret = fmt.Sprintf("%v", endpoint["client_secret"]) + return cnsi } -func encryptPayload(payload *BackupContentPayload, password string, encryptionKey []byte) ([]byte, error) { +func encryptPayload(payload *BackupContentPayload, password string) ([]byte, error) { // First ensure the password is an ok length - secret, err := createHash(password, encryptionKey) + secret, err := createHash(password) if err != nil { log.Warningf("Could not create hash: %+v", err) return nil, fmt.Errorf("Could not create hash") @@ -324,9 +318,9 @@ func encryptPayload(payload *BackupContentPayload, password string, encryptionKe return payloadEncrypted, nil } -func decryptPayload(payloadEncrypted []byte, password string, encryptionKey []byte) (*string, error) { +func decryptPayload(payloadEncrypted []byte, password string) (*string, error) { // First ensure the password is an ok length - secret, err := createHash(password, encryptionKey) + secret, err := createHash(password) if err != nil { log.Warningf("Could not create hash: %+v", err) return nil, fmt.Errorf("Could not create hash") @@ -341,13 +335,11 @@ func decryptPayload(payloadEncrypted []byte, password string, encryptionKey []by } // createHash - Ensure the token used by crypto is at an acceptable length -func createHash(password string, salt []byte) ([]byte, error) { - hasher := md5.New() +func createHash(password string) ([]byte, error) { + // Create a hash long enough to ensure with use AES-256 + hasher := sha256.New() if _, err := hasher.Write([]byte(password)); err != nil { return nil, fmt.Errorf("Failed to write password to hash") } - if _, err := hasher.Write(salt); err != nil { - return nil, fmt.Errorf("Failed to write salt to hash") - } return hasher.Sum(nil), nil } diff --git a/src/jetstream/repository/cnsis/cnsis.go b/src/jetstream/repository/cnsis/cnsis.go index b1e5bcc4bc..0605361d72 100644 --- a/src/jetstream/repository/cnsis/cnsis.go +++ b/src/jetstream/repository/cnsis/cnsis.go @@ -14,7 +14,7 @@ type Repository interface { Save(guid string, cnsiRecord interfaces.CNSIRecord, encryptionKey []byte) error Update(endpoint interfaces.CNSIRecord, encryptionKey []byte) error UpdateMetadata(guid string, metadata string) error - Overwrite(endpoint interfaces.CNSIRecord, encryptionKey []byte) error + SaveOrUpdate(endpoint interfaces.CNSIRecord, encryptionKey []byte) error } type Endpoint interface { diff --git a/src/jetstream/repository/cnsis/pgsql_cnsis.go b/src/jetstream/repository/cnsis/pgsql_cnsis.go index 9582f3e1a4..b68bf4933f 100644 --- a/src/jetstream/repository/cnsis/pgsql_cnsis.go +++ b/src/jetstream/repository/cnsis/pgsql_cnsis.go @@ -61,6 +61,7 @@ func InitRepositoryProvider(databaseProvider string) { deleteCNSI = datastore.ModifySQLStatement(deleteCNSI, databaseProvider) updateCNSI = datastore.ModifySQLStatement(updateCNSI, databaseProvider) updateCNSIMetadata = datastore.ModifySQLStatement(updateCNSIMetadata, databaseProvider) + countCNSI = datastore.ModifySQLStatement(countCNSI, databaseProvider) } // List - Returns a list of CNSI Records @@ -352,8 +353,8 @@ func (p *PostgresCNSIRepository) UpdateMetadata(guid string, metadata string) er return nil } -// Overwrite - Creates or Updates CNSI Record -func (p *PostgresCNSIRepository) Overwrite(endpoint interfaces.CNSIRecord, encryptionKey []byte) error { +// SaveOrUpdate - Creates or Updates CNSI Record +func (p *PostgresCNSIRepository) SaveOrUpdate(endpoint interfaces.CNSIRecord, encryptionKey []byte) error { log.Debug("Overwrite CNSI") // Is there an existing token? diff --git a/src/jetstream/repository/tokens/pgsql_tokens.go b/src/jetstream/repository/tokens/pgsql_tokens.go index 32c779e355..43a45459f9 100644 --- a/src/jetstream/repository/tokens/pgsql_tokens.go +++ b/src/jetstream/repository/tokens/pgsql_tokens.go @@ -86,6 +86,7 @@ func InitRepositoryProvider(databaseProvider string) { updateAuthToken = datastore.ModifySQLStatement(updateAuthToken, databaseProvider) findCNSIToken = datastore.ModifySQLStatement(findCNSIToken, databaseProvider) findCNSITokenConnected = datastore.ModifySQLStatement(findCNSITokenConnected, databaseProvider) + findAllCNSIToken = datastore.ModifySQLStatement(findAllCNSIToken, databaseProvider) countCNSITokens = datastore.ModifySQLStatement(countCNSITokens, databaseProvider) insertCNSIToken = datastore.ModifySQLStatement(insertCNSIToken, databaseProvider) updateCNSIToken = datastore.ModifySQLStatement(updateCNSIToken, databaseProvider) diff --git a/src/jetstream/repository/tokens/tokens.go b/src/jetstream/repository/tokens/tokens.go index f473885e15..114a77a9b7 100644 --- a/src/jetstream/repository/tokens/tokens.go +++ b/src/jetstream/repository/tokens/tokens.go @@ -9,7 +9,8 @@ type Token struct { Record interfaces.TokenRecord } -const SystemSharedUserGuid = "00000000-1111-2222-3333-444444444444" // User ID for the system shared user for endpoints +// SystemSharedUserGuid - User ID for the system shared user for endpoints. Also used by front end +const SystemSharedUserGuid = "00000000-1111-2222-3333-444444444444" // Repository is an application of the repository pattern for storing tokens type Repository interface { From efeca9fe44cad501abdf7c7b345e18b13d4f686b Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Mon, 20 Apr 2020 16:04:30 +0100 Subject: [PATCH 033/176] Move backup into it's own module --- .../restore-endpoints.component.html | 2 +- src/jetstream/cnsi.go | 36 ------ src/jetstream/load_plugins.go | 2 + src/jetstream/main.go | 3 - .../backup/backup_restore.go} | 35 ++---- src/jetstream/plugins/backup/main.go | 111 ++++++++++++++++++ src/jetstream/version_info.go | 2 +- 7 files changed, 128 insertions(+), 63 deletions(-) rename src/jetstream/{cnsi_token_backup.go => plugins/backup/backup_restore.go} (91%) create mode 100644 src/jetstream/plugins/backup/main.go diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html index 4e8e0bfbaf..1682c9b572 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.html @@ -28,7 +28,7 @@

Restore Endpoints

- warning Unable to parse file contents. Reason: + warningUnable to parse file contents. Reason:  {{service.unparsableFileContent}}

diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index 3520a06ccf..daf0ea3446 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -635,39 +635,3 @@ func (p *portalProxy) updateEndpoint(c echo.Context) error { return nil } - -func (p *portalProxy) backupEndpoints(c echo.Context) error { - log.Debug("backupEndpoints") - - userID, err := p.GetSessionStringValue(c, "user_id") - if err != nil { - return echo.NewHTTPError(http.StatusUnauthorized, "Could not find correct session value") - } - - ctb := &cnsiTokenBackup{ - databaseConnectionPool: p.DatabaseConnectionPool, - encryptionKey: p.Config.EncryptionKeyInBytes, - userID: userID, - p: p, - } - - return ctb.BackupEndpoints(c) -} - -func (p *portalProxy) restoreEndpoints(c echo.Context) error { - log.Debug("restoreEndpoints") - - userID, err := p.GetSessionStringValue(c, "user_id") - if err != nil { - return echo.NewHTTPError(http.StatusUnauthorized, "Could not find correct session value") - } - - ctb := &cnsiTokenBackup{ - databaseConnectionPool: p.DatabaseConnectionPool, - encryptionKey: p.Config.EncryptionKeyInBytes, - userID: userID, - p: p, - } - - return ctb.RestoreEndpoints(c) -} diff --git a/src/jetstream/load_plugins.go b/src/jetstream/load_plugins.go index 0c8b9fe639..c76b421c4f 100644 --- a/src/jetstream/load_plugins.go +++ b/src/jetstream/load_plugins.go @@ -2,6 +2,7 @@ package main import ( "github.com/cloudfoundry-incubator/stratos/src/jetstream/plugins/autoscaler" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/plugins/backup" "github.com/cloudfoundry-incubator/stratos/src/jetstream/plugins/cfapppush" "github.com/cloudfoundry-incubator/stratos/src/jetstream/plugins/cfappssh" "github.com/cloudfoundry-incubator/stratos/src/jetstream/plugins/cloudfoundry" @@ -34,6 +35,7 @@ func (pp *portalProxy) loadPlugins() { {"userinvite", userinvite.Init}, {"userfavorites", userfavorites.Init}, {"autoscaler", autoscaler.Init}, + {"backup", backup.Init}, } { plugin, err := p.Init(pp) pp.Plugins[p.Name] = plugin diff --git a/src/jetstream/main.go b/src/jetstream/main.go index 53c3045e2b..9b649da31d 100644 --- a/src/jetstream/main.go +++ b/src/jetstream/main.go @@ -973,9 +973,6 @@ func (p *portalProxy) registerRoutes(e *echo.Echo, needSetupMiddleware bool) { // Apply edits for the given endpoint adminGroup.POST("/endpoint/:id", p.updateEndpoint) - adminGroup.POST("/endpoints/backup", p.backupEndpoints) - adminGroup.POST("/endpoints/restore", p.restoreEndpoints) - adminGroup.POST("/unregister", p.unregisterCluster) // sessionGroup.DELETE("/cnsis", p.removeCluster) diff --git a/src/jetstream/cnsi_token_backup.go b/src/jetstream/plugins/backup/backup_restore.go similarity index 91% rename from src/jetstream/cnsi_token_backup.go rename to src/jetstream/plugins/backup/backup_restore.go index 0666493f47..7e6fd8df59 100644 --- a/src/jetstream/cnsi_token_backup.go +++ b/src/jetstream/plugins/backup/backup_restore.go @@ -1,4 +1,4 @@ -package main +package backup import ( "crypto/sha256" @@ -20,22 +20,23 @@ type cnsiTokenBackup struct { databaseConnectionPool *sql.DB encryptionKey []byte userID string - p *portalProxy + dbVersion int64 + p interfaces.PortalProxy } -// BackupConnectionType - Determine what kind of connection details are stored for an endpoint -type BackupConnectionType string +// ConnectionType - Determine what kind of connection details are stored for an endpoint +type ConnectionType string const ( - BACKUP_CONNECTION_NONE BackupConnectionType = "NONE" - BACKUP_CONNECTION_CURRENT = "CURRENT" - BACKUP_CONNECTION_ALL = "ALL" + BACKUP_CONNECTION_NONE ConnectionType = "NONE" + BACKUP_CONNECTION_CURRENT = "CURRENT" + BACKUP_CONNECTION_ALL = "ALL" ) // BackupEndpointsState - For a given endpoint define what's backed up type BackupEndpointsState struct { - Endpoint bool `json:"endpoint"` - Connect BackupConnectionType `json:"connect"` + Endpoint bool `json:"endpoint"` + Connect ConnectionType `json:"connect"` } // BackupRequest - Request from client to create a back up file @@ -160,14 +161,9 @@ func (ctb *cnsiTokenBackup) createBackup(data *BackupRequest) (*BackupContent, e } // Add the db version to the response, this will allow client side up front validation - versions, err := ctb.p.getVersionsData() - if err != nil { - return nil, interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not find database version", "Could not find database version: %+v", err) - } - response := &BackupContent{ Payload: encryptedPayload, - DBVersion: versions.DatabaseVersion, + DBVersion: ctb.dbVersion, } return response, nil @@ -221,13 +217,8 @@ func (ctb *cnsiTokenBackup) restoreBackup(backup *RestoreRequest) error { // Check that the db version of backup file matches the stratos db version if backup.IgnoreDbVersion == false { - versions, err := ctb.p.getVersionsData() - if err != nil { - return interfaces.NewHTTPShadowError(http.StatusInternalServerError, "Could not find database version", "Could not find database version: %+v", err) - } - - if versions.DatabaseVersion != data.DBVersion { - errorStr := fmt.Sprintf("Incompatible database versions. Expected %+v but got %+v", versions.DatabaseVersion, data.DBVersion) + if ctb.dbVersion != data.DBVersion { + errorStr := fmt.Sprintf("Incompatible database versions. Expected %+v but got %+v", ctb.dbVersion, data.DBVersion) return interfaces.NewHTTPError(http.StatusBadRequest, errorStr) } } diff --git a/src/jetstream/plugins/backup/main.go b/src/jetstream/plugins/backup/main.go new file mode 100644 index 0000000000..d2ddcf5dec --- /dev/null +++ b/src/jetstream/plugins/backup/main.go @@ -0,0 +1,111 @@ +package backup + +import ( + "database/sql" + "errors" + "net/http" + + goosedbversion "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/goose-db-version" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/interfaces" + "github.com/labstack/echo" + log "github.com/sirupsen/logrus" +) + +// BackupRestore - Backup or restore endpoints and tokens +type BackupRestore struct { + portalProxy interfaces.PortalProxy +} + +// Init creates a new Autoscaler +func Init(portalProxy interfaces.PortalProxy) (interfaces.StratosPlugin, error) { + return &BackupRestore{portalProxy: portalProxy}, nil +} + +// GetMiddlewarePlugin gets the middleware plugin for this plugin +func (br *BackupRestore) GetMiddlewarePlugin() (interfaces.MiddlewarePlugin, error) { + return nil, errors.New("Not implemented") +} + +// GetEndpointPlugin gets the endpoint plugin for this plugin +func (br *BackupRestore) GetEndpointPlugin() (interfaces.EndpointPlugin, error) { + return nil, errors.New("Not implemented") +} + +// GetRoutePlugin gets the route plugin for this plugin +func (br *BackupRestore) GetRoutePlugin() (interfaces.RoutePlugin, error) { + return br, nil +} + +// AddAdminGroupRoutes adds the admin routes for this plugin to the Echo server +func (br *BackupRestore) AddAdminGroupRoutes(echoGroup *echo.Group) { + echoGroup.POST("/endpoints/backup", br.backupEndpoints) + echoGroup.POST("/endpoints/restore", br.restoreEndpoints) +} + +// AddSessionGroupRoutes adds the session routes for this plugin to the Echo server +func (br *BackupRestore) AddSessionGroupRoutes(echoGroup *echo.Group) { + // no-op +} + +// Init performs plugin initialization +func (br *BackupRestore) Init() error { + return nil +} + +func (br *BackupRestore) backupEndpoints(c echo.Context) error { + log.Debug("backupEndpoints") + + userID, err := br.portalProxy.GetSessionStringValue(c, "user_id") + if err != nil { + return echo.NewHTTPError(http.StatusUnauthorized, "Could not find correct session value") + } + + version, err := getDBVersion(br.portalProxy.GetDatabaseConnection()) + if err != nil { + return interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not find database version", "Could not find database version: %+v", err) + } + + ctb := &cnsiTokenBackup{ + databaseConnectionPool: br.portalProxy.GetDatabaseConnection(), + encryptionKey: br.portalProxy.GetConfig().EncryptionKeyInBytes, + userID: userID, + dbVersion: version, + p: br.portalProxy, + } + + return ctb.BackupEndpoints(c) +} + +func (br *BackupRestore) restoreEndpoints(c echo.Context) error { + log.Debug("restoreEndpoints") + + userID, err := br.portalProxy.GetSessionStringValue(c, "user_id") + if err != nil { + return echo.NewHTTPError(http.StatusUnauthorized, "Could not find correct session value") + } + + version, err := getDBVersion(br.portalProxy.GetDatabaseConnection()) + if err != nil { + return interfaces.NewHTTPShadowError(http.StatusBadGateway, "Could not find database version", "Could not find database version: %+v", err) + } + + ctb := &cnsiTokenBackup{ + databaseConnectionPool: br.portalProxy.GetDatabaseConnection(), + encryptionKey: br.portalProxy.GetConfig().EncryptionKeyInBytes, + userID: userID, + dbVersion: version, + p: br.portalProxy, + } + + return ctb.RestoreEndpoints(c) +} + +func getDBVersion(databaseConnectionPool *sql.DB) (int64, error) { + dbVersionRepo, _ := goosedbversion.NewPostgresGooseDBVersionRepository(databaseConnectionPool) + databaseVersionRec, err := dbVersionRepo.GetCurrentVersion() + if err != nil { + return 0, errors.New("Error trying to get current database version") + } + + return databaseVersionRec.VersionID, nil +} diff --git a/src/jetstream/version_info.go b/src/jetstream/version_info.go index c62257d785..08fd2bd9c8 100644 --- a/src/jetstream/version_info.go +++ b/src/jetstream/version_info.go @@ -4,7 +4,7 @@ import ( "errors" "net/http" - "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/goose-db-version" + goosedbversion "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/goose-db-version" "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/interfaces" "github.com/labstack/echo" log "github.com/sirupsen/logrus" From 41245109ea2cd85fe8b6cdf5b26982919e78dbd0 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Fri, 24 Apr 2020 14:18:58 +0100 Subject: [PATCH 034/176] Fix table passing issue --- .../core/sass/components/mat-table.scss | 23 +++++++++++++++++++ .../app-action-monitor.component.ts | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/frontend/packages/core/sass/components/mat-table.scss b/src/frontend/packages/core/sass/components/mat-table.scss index 085ab2d61f..0c90ba46b7 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 { + padding: 10px 10px 10px 0; + } + + // Use margin, not padding for the left side of the first cell in the row/headwer/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/headwer/footer + .mat-cell:last-of-type, mat-footer-cell:last-of-type, mat-header-cell:last-of-type { + margin-right: 20px; + padding-right: 0; + } + +} \ No newline at end of file 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]; From d2690557001016992acb0967fdf85c6082429786 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Fri, 24 Apr 2020 14:20:08 +0100 Subject: [PATCH 035/176] Fix typo in comment --- src/frontend/packages/core/sass/components/mat-table.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/frontend/packages/core/sass/components/mat-table.scss b/src/frontend/packages/core/sass/components/mat-table.scss index 0c90ba46b7..ebb8b6457e 100644 --- a/src/frontend/packages/core/sass/components/mat-table.scss +++ b/src/frontend/packages/core/sass/components/mat-table.scss @@ -16,16 +16,16 @@ $mat-table-header-paginator-font-size: 13px; padding: 10px 10px 10px 0; } - // Use margin, not padding for the left side of the first cell in the row/headwer/footer + // 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/headwer/footer + // 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; } -} \ No newline at end of file +} From 403e9e06f8872c13fbe4e4c79461101bcacf4568 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 28 Apr 2020 10:57:49 +0100 Subject: [PATCH 036/176] Ensure we filter out maxed results for local lists - When apps collection is fetched and exceeds maxed allowed certain monitor observables were still firing with the partial collection of apps - This led to app based stats (like count and memory) to be shown on the space cards & summary - This was caused by a correction to the pagination monitor to use 'local' monitor observables instead of non-local - The now correct observable to use did not have a filter for maxed results, so emited the bad data --- src/frontend/packages/store/src/monitors/pagination-monitor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/packages/store/src/monitors/pagination-monitor.ts b/src/frontend/packages/store/src/monitors/pagination-monitor.ts index 03e06a4d68..3aded6a5a6 100644 --- a/src/frontend/packages/store/src/monitors/pagination-monitor.ts +++ b/src/frontend/packages/store/src/monitors/pagination-monitor.ts @@ -239,6 +239,7 @@ export class PaginationMonitor this.hasPage(pagination) && !LocalPaginationHelpers.isPaginationMaxed(pagination)), combineLatestOperator(entityObservable$), withLatestFrom(allEntitiesObservable$), map(([[pagination], allEntities]) => { From 7a82ca7a026d3bc7fe2b117c0c3c2399cf710267 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Thu, 30 Apr 2020 15:44:19 +0100 Subject: [PATCH 037/176] Provide typed way to access actions (and dispatch them), entity monitors/services and pagaintion monitors/services via the catalog entity - fixes #4246 --- .../src/cf-autoscaler-testing.module.ts | 2 +- .../autoscaler-tab-extension.component.ts | 2 +- .../src/store/autoscaler-entity-generator.ts | 2 +- .../src/store/autoscaler.effects.ts | 2 +- .../src/actions/application.actions.ts | 3 +- .../src/actions/cloud-foundry.actions.ts | 6 +- .../actions/deploy-applications.actions.ts | 27 +- .../src/actions/feature-flags.actions.ts | 7 +- .../src/actions/github.actions.ts | 13 +- .../src/actions/service-instances.actions.ts | 13 +- .../src/actions/service.actions.ts | 2 +- .../src/actions/space.actions.ts | 1 + .../cloud-foundry/src/actions/stack.action.ts | 9 +- .../cloud-foundry/src/cf-entity-catalog.ts | 247 +++++++++++ .../cloud-foundry/src/cf-entity-factory.ts | 41 +- .../cloud-foundry/src/cf-entity-generator.ts | 392 ++++++++++++------ .../src/cf-entity-relations.getters.ts | 4 +- .../src/cloud-foundry-test.module.ts | 2 +- .../cloud-foundry/src/cloud-foundry.module.ts | 6 +- .../application-env-var.action-builders.ts | 58 ++- .../application-stats.action-builders.ts | 10 +- .../application-summary.action-builders.ts | 8 +- .../application.action-builders.ts | 25 +- .../buildpack.action-builders.ts | 13 +- .../cf-info.action-builders.ts | 4 +- .../cf.action-builder.types.ts | 17 - .../domin.action-builder.ts | 34 +- .../feature-flag.action-builder.ts | 13 +- .../git-action-builder.ts | 38 +- .../organization.action-builders.ts | 4 +- .../quota-definition.action-builders.ts | 38 +- .../security-groups.action-builder.ts | 18 +- .../service-binding.action-builders.ts | 6 +- .../service-broker.entity-builders.ts | 17 +- .../service-instance.action.builders.ts | 4 +- ...service-plan-visibility.action-builders.ts | 12 +- .../service-plan.action-builders.ts | 13 +- .../service.entity-builders.ts | 24 +- .../space-quota.action-builders.ts | 2 +- .../space.action-builders.ts | 26 ++ .../stack-action-builders.ts | 4 +- .../user-provided-service.action-builders.ts | 33 +- .../user.action-builders.ts | 5 +- .../entity-relation-tree.helpers.ts | 19 - .../entity-relations/entity-relation-tree.ts | 2 +- .../entity-relations-from-parent.spec.ts | 2 +- .../entity-relations-validate.spec.ts | 2 +- .../src/entity-relations/entity-relations.ts | 13 +- .../processors/org-space-post-processor.ts | 2 +- .../application-delete.component.ts | 62 +-- ...te-instances-routes-list-config.service.ts | 61 +-- .../applications/application.service.ts | 114 ++--- .../application/application-base.component.ts | 7 - .../application-polling.service.ts | 15 +- .../application-tabs-base.component.ts | 2 +- .../build-tab/application-env-vars.service.ts | 29 +- .../tabs/build-tab/build-tab.component.ts | 19 +- .../tabs/gitscm-tab/gitscm-tab.component.ts | 55 +-- .../create-application-step3.component.html | 4 +- .../create-application-step3.component.ts | 75 ++-- ...ploy-application-options-step.component.ts | 44 +- .../deploy-application-step2.component.ts | 47 +-- .../deploy-application-step3.component.ts | 23 +- .../deploy-application-steps.types.ts | 22 +- .../routes/add-routes/add-routes.component.ts | 75 +--- .../cloud-foundry/add-edit-space-step-base.ts | 62 +-- .../create-organization-step.component.ts | 31 +- .../create-space-step.component.ts | 22 +- .../edit-organization-step.component.ts | 26 +- .../edit-space-step.component.ts | 52 +-- .../quota-definition-base.component.ts | 22 +- .../quota-definition.component.ts | 11 +- .../cloud-foundry-endpoint.service.ts | 79 +--- .../services/cloud-foundry-org-space-quota.ts | 4 +- .../cloud-foundry-organization.service.ts | 22 +- .../services/cloud-foundry-space.service.ts | 17 +- .../space-quota-definition.component.ts | 12 +- .../cloud-foundry-space-summary.component.ts | 4 +- ...-foundry-organization-summary.component.ts | 2 +- .../invite-users-create.component.ts | 36 +- .../users/manage-users/cf-roles.service.ts | 35 +- .../manage-users-confirm.component.ts | 2 +- .../service-base/service-base.component.ts | 19 +- .../service-catalog.helpers.ts | 11 +- .../service-catalog/services-helper.ts | 99 +---- .../service-catalog/services.service.ts | 67 +-- .../detach-service-instance.component.ts | 24 +- .../services/services-wall.service.ts | 49 +-- .../add-service-instance.component.ts | 80 +--- .../bind-apps-step.component.ts | 2 - ...instance-helper-service-factory.service.ts | 5 - .../create-service-instance-helper.service.ts | 140 +------ .../add-service-instance/csi-mode.service.ts | 18 +- .../specify-details-step.component.ts | 62 +-- ...specify-user-provided-details.component.ts | 11 +- .../card-cf-recent-apps.component.ts | 9 +- .../compact-app-card.component.ts | 1 - .../service-broker-card.component.ts | 21 +- .../cf-app-instances-data-source.ts | 8 +- .../cf-app-map-routes-list-config.service.ts | 12 +- .../cf-app-routes-list-config-base.ts | 8 +- .../app-service-binding-card.component.ts | 30 +- .../app-service-binding-data-source.ts | 27 +- .../cf-app-variables-data-source.ts | 21 +- .../cf-app-variables-list-config.service.ts | 25 +- .../list-types/app/card/card-app.component.ts | 1 - .../list-types/app/cf-apps-data-source.ts | 15 +- .../table-cell-app-status.component.ts | 1 - .../cf-buildpacks-data-source.ts | 9 +- .../cf-events/cf-events-data-source.ts | 13 +- .../cf-feature-flags-data-source.helpers.ts | 21 - .../cf-feature-flags-data-source.ts | 4 +- .../cf-feature-flags-list-config.service.ts | 4 +- .../cf-routes/cf-routes-data-source-base.ts | 11 +- .../cf-routes/cf-routes-data-source.ts | 10 +- .../cf-routes/cf-routes-list-config-base.ts | 10 +- .../cf-security-groups-data-source.ts | 8 +- .../cf-select-users-list-config.service.ts | 2 +- .../cf-service-card.component.ts | 4 +- .../cf-services/cf-services-data-source.ts | 9 +- .../cf-space-apps-data-source.service.ts | 15 +- .../cf-space-routes-data-source.ts | 13 +- ...cf-spaces-service-instances-data-source.ts | 10 +- ...aces-user-service-instances-data-source.ts | 13 +- ...ervice-instance-apps-attached.component.ts | 8 - .../cf-spaces-data-source.service.ts | 14 +- .../cf-stacks/cf-stacks-data-source.ts | 9 +- .../cf-org-permission-cell.component.ts | 7 +- .../cf-space-permission-cell.component.ts | 7 +- .../cf-users/cf-user-list-config.service.ts | 2 +- .../detach-apps/detach-apps-data-source.ts | 21 +- .../detach-apps-list-config.service.ts | 2 +- .../service-instances-data-source.ts | 7 +- .../service-plans-data-source.ts | 7 +- .../service-instance-card.component.ts | 3 - .../service-instances-wall-data-source.ts | 13 +- .../running-instances.component.ts | 14 +- .../service-plan-public.component.ts | 6 +- .../cf-org-space-service.service.ts | 14 +- .../shared/data-services/cf-user.service.ts | 34 +- .../service-action-helper.service.ts | 54 +-- .../store/effects/cloud-foundry.effects.ts | 20 +- .../src/store/effects/deploy-app.effects.ts | 38 +- .../src/store/effects/github.effects.ts | 19 +- .../src/store/effects/permissions.effect.ts | 8 +- .../src/store/types/github.types.ts | 4 +- .../cloud-foundry-endpoint-service.helper.ts | 4 +- .../packages/core/endpoints-health-checks.ts | 2 +- ...api-endpoint-type-select-page.component.ts | 2 +- .../api-entity-list-page.component.ts | 7 +- .../api-entity-type-select-page.component.ts | 11 +- src/frontend/packages/core/src/app.module.ts | 9 +- .../packages/core/src/base-entity-types.ts | 25 +- .../packages/core/src/core/cf-api.types.ts | 1 + .../packages/core/src/core/core.module.ts | 12 +- .../core/current-user-permissions.checker.ts | 25 +- .../core/src/core/endpoints.service.ts | 2 +- .../core/src/core/user-favorite-manager.ts | 2 +- .../core/src/core/user-profile.service.ts | 24 +- .../packages/core/src/core/utils.service.ts | 50 ++- .../create-quota-step.component.ts | 17 +- .../create-space-quota-step.component.ts | 20 +- .../edit-quota-step.component.ts | 35 +- .../edit-space-quota-step.component.ts | 38 +- .../quota-definition-form.component.ts | 49 +-- .../space-quota-definition-form.component.ts | 41 +- .../dashboard-base.component.ts | 12 +- .../backup-connection-cell.component.ts | 2 +- .../backup-endpoints.service.ts | 2 +- .../backup-endpoints.component.ts | 2 +- .../connect-endpoint.component.ts | 2 +- .../src/features/endpoints/connect.service.ts | 2 +- .../create-endpoint-base-step.component.ts | 2 +- .../create-endpoint-cf-step-1.component.ts | 6 +- .../create-endpoint.component.ts | 2 +- .../edit-endpoint-step.component.ts | 2 +- .../metrics/metrics/metrics.component.ts | 2 +- .../favorite-config-mapper.ts | 14 +- .../favorites-meta-card.component.ts | 2 +- .../list-data-source.ts | 2 +- .../local-list.helpers.ts | 2 +- .../table-cell-service.component.ts | 68 ++- .../endpoint-card/endpoint-card.component.ts | 6 +- .../endpoint/endpoint-list.helpers.ts | 4 +- .../endpoint/endpoints-list-config.service.ts | 2 +- .../table-cell-endpoint-details.component.ts | 2 +- .../table-cell-endpoint-name.component.ts | 4 +- .../table-cell-endpoint-status.component.ts | 2 +- .../github-commits-data-source.ts | 8 +- ...hub-commits-list-config-app-tab.service.ts | 39 +- .../shared/components/list/list.component.ts | 7 +- .../max-list-message.component.ts | 2 +- .../simple-list/entity-catalog-datasource.ts | 13 +- .../simple-list/simple-list.component.spec.ts | 19 +- .../list/simple-list/simple-list.component.ts | 15 +- .../shared/data-services/scm/github-scm.ts | 8 +- .../shared/data-services/scm/gitlab-scm.ts | 11 + .../core/src/shared/data-services/scm/scm.ts | 1 + .../services/cf-org-space-label.service.ts | 2 +- ...-foundry-user-provided-services.service.ts | 100 ++--- .../packages/core/src/shared/shared.module.ts | 7 +- .../application-service-helper.ts | 8 - .../core/test-framework/core-test.modules.ts | 2 +- .../entity-catalog-test-helpers.ts | 4 +- .../packages/store/src/effects/app.effects.ts | 9 +- .../store/src/effects/endpoint.effects.ts | 65 +-- .../store/src/effects/metrics.effects.ts | 12 +- .../store/src/effects/update-app-effects.ts | 18 +- .../src/effects/user-favorites-effect.ts | 2 +- .../store/src/effects/user-profile.effects.ts | 2 +- .../store/src/effects/users-roles.effects.ts | 11 +- .../store/src/entity-catalog-test.module.ts | 10 +- .../store/src/entity-catalog.actions.ts | 3 +- .../store/src/entity-catalog.module.ts | 4 +- .../action-dispatcher.spec.ts | 231 ++++++----- .../action-dispatcher/action-dispatcher.ts | 79 ---- .../action-orchestrator.ts | 24 +- .../action-builder-config.mapper.ts | 8 +- .../entity-catalog-entity-store-helpers.ts | 222 ++++++++++ .../entity-catalog-entity.ts | 106 +++-- .../entity-catalog-entity.types.ts | 120 ++++++ .../entity-catalog.service.ts | 22 + .../entity-catalog/entity-catalog.helper.ts | 10 + ...service.spec.ts => entity-catalog.spec.ts} | 12 +- .../entity-catalog.store-setup.ts | 15 - ...y-catalog.service.ts => entity-catalog.ts} | 47 ++- .../entity-catalog/entity-catalog.types.ts | 1 - .../base-single-entity-request.pipeline.ts | 10 +- .../entity-pagination-request-pipeline.ts | 7 +- .../endpoint-errors.handler.spec.ts | 2 +- .../endpoint-errors.handler.ts | 2 +- .../fail-entity-request.handler.spec.ts | 2 +- .../fail-entity-request.handler.ts | 2 +- .../forced-action-type.helpers.ts | 2 +- .../jetstream-error.handler.ts | 2 +- .../make-request-entity-request.pipe.ts | 2 +- .../map-multi-endpoint.pipes.ts | 4 +- .../start-entity-request.handler.spec.ts | 2 +- .../success-entity-request.handler.ts | 4 +- .../entity-request-pipeline.ts | 4 +- .../entity-request-pipeline.types.ts | 6 +- .../get-params.pipe.ts | 3 - .../pagination-iterator.pipe.ts | 2 +- .../pipeline-helpers.ts | 4 +- .../pipline-http-client.service.ts | 2 +- .../src/entity-service-factory.service.ts | 2 +- .../packages/store/src/entity-service.spec.ts | 26 +- .../packages/store/src/entity-service.ts | 7 +- .../entity-monitor.factory.service.ts | 18 +- .../monitors/pagination-monitor.factory.ts | 2 +- .../store/src/monitors/pagination-monitor.ts | 24 +- .../request-data-reducer.factory.ts | 4 +- .../api-request-reducer/request-helpers.ts | 7 +- .../api-request-reducer/succeed-request.ts | 2 +- .../api-request-reducers.generator.ts | 2 +- .../recently-visited.reducer.ts | 2 +- ...tion-reducer-clear-pagination-of-entity.ts | 2 +- ...agination-reducer-clear-pagination-type.ts | 2 +- ...gination-reducer-create-pagination.spec.ts | 2 +- .../pagination-reducer-create-pagination.ts | 2 +- .../pagination-reducer-max-reached.ts | 2 +- .../pagination-reducer-reset-pagination.ts | 2 +- .../pagination-reducer.helper.ts | 29 +- .../pagination-reducer.types.ts | 34 ++ .../pagination-reducer/pagination.reducer.ts | 2 +- .../selectors/current-user-role.selectors.ts | 2 - .../selectors/favorite-groups.selectors.ts | 4 +- .../store/testing/src/store-test-helper.ts | 2 +- .../store/testing/src/store-test.module.ts | 2 +- 269 files changed, 2609 insertions(+), 3008 deletions(-) create mode 100644 src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts delete mode 100644 src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts rename src/frontend/packages/store/src/entity-catalog/{ => entity-catalog-entity}/action-builder-config.mapper.ts (94%) create mode 100644 src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts rename src/frontend/packages/store/src/entity-catalog/{ => entity-catalog-entity}/entity-catalog-entity.ts (80%) create mode 100644 src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.types.ts create mode 100644 src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts rename src/frontend/packages/store/src/entity-catalog/{entity-catalog.service.spec.ts => entity-catalog.spec.ts} (95%) rename src/frontend/packages/store/src/entity-catalog/{entity-catalog.service.ts => entity-catalog.ts} (86%) 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/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts index f3cb8c050a..215b6a3a33 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts @@ -16,7 +16,7 @@ import { ConfirmationDialogConfig } from '../../../../core/src/shared/components 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.service'; +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 { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; 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..ec907724ab 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 @@ -5,7 +5,7 @@ import { IOrganization } from '../../../core/src/core/cf-api.types'; 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'; 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..094fbef14d 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts @@ -6,7 +6,7 @@ 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 { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { environment } from '../../../core/src/environments/environment'; import { isHttpErrorResponse } from '../../../core/src/jetstream.helpers'; import { AppState } from '../../../store/src/app-state'; 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..256ff8be9e 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts @@ -8,7 +8,7 @@ import { ICFAction } from '../../../store/src/types/request.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..c4832fe3c9 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 @@ -3,8 +3,8 @@ 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 { 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..98a6d9974b 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 = '') { 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/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..9aef2ed1d3 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts @@ -62,6 +62,7 @@ export class GetSpace extends CFStartAction implements ICFAction, EntityInlinePa GET_SPACE_FAILED ]; entity = [cfEntityFactory(spaceEntityType)]; + schemaKey = ''; 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/cloud-foundry/src/cf-entity-catalog.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts new file mode 100644 index 0000000000..ee85433d72 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts @@ -0,0 +1,247 @@ +import { + IService, + IServiceBinding, + IServiceBroker, + IServiceInstance, + IServicePlan, + IServicePlanVisibility, + IUserProvidedServiceInstance, +} from '../../core/src/core/cf-api-svc.types'; +import { + CfEvent, + IApp, + IAppSummary, + IBuildpack, + ICfV2Info, + IDomain, + IFeatureFlag, + IOrganization, + IOrgQuotaDefinition, + IPrivateDomain, + IRoute, + ISecurityGroup, + ISpace, + ISpaceQuotaDefinition, + IStack, +} from '../../core/src/core/cf-api.types'; +import { + StratosBaseCatalogEntity, + StratosCatalogEndpointEntity, +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { APIResource } from '../../store/src/types/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..98cb1f0234 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts @@ -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, }, @@ -199,24 +200,24 @@ const CFUserSchema = new CFUserEntitySchema({ audited_spaces: [createUserOrgSpaceSchema(spaceEntityType, {}, CfUserRoleParams.AUDITED_SPACES)], } }, { - idAttribute: getAPIResourceGuid, - processStrategy: (user: APIResource) => { - if (user.entity.username) { - return user; - } - const entity = { - ...user.entity, - username: user.metadata.guid - }; - - return user.metadata ? { - entity, - metadata: user.metadata - } : { - entity - }; + idAttribute: getAPIResourceGuid, + processStrategy: (user: APIResource) => { + if (user.entity.username) { + return user; } - }); + const entity = { + ...user.entity, + username: user.metadata.guid + }; + + return user.metadata ? { + entity, + metadata: user.metadata + } : { + entity + }; + } +}); entityCache[cfUserEntityType] = CFUserSchema; const coreSpaceSchemaParams = { 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..16f0adf123 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts @@ -9,9 +9,11 @@ import { IServiceBroker, IServiceInstance, IServicePlan, + IServicePlanVisibility, IUserProvidedServiceInstance, } from '../../core/src/core/cf-api-svc.types'; import { + CfEvent, IApp, IAppSummary, IBuildpack, @@ -34,8 +36,7 @@ import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, StratosCatalogEntity, -} from '../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition, StratosEndpointExtensionDefinition, @@ -49,7 +50,7 @@ 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'; +import { cfEntityCatalog } from './cf-entity-catalog'; import { cfEntityFactory } from './cf-entity-factory'; import { addCfQParams, addCfRelationParams } from './cf-entity-relations.getters'; import { @@ -90,41 +91,72 @@ import { import { CfErrorResponse, getCfError } from './cf-error-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 { CfEndpointDetailsComponent } from './shared/components/cf-endpoint-details/cf-endpoint-details.component'; import { updateApplicationRoutesReducer } from './store/reducers/application-route.reducer'; import { updateOrganizationQuotaReducer } from './store/reducers/organization-quota.reducer'; @@ -139,15 +171,20 @@ import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; import { CfUser } from './store/types/user.types'; 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, @@ -286,12 +323,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 +364,12 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD }; }, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appEnvVar = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + AppEnvVarActionBuilders, + AppEnvVarActionBuilders + >(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], @@ -333,8 +380,9 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, - } + }, }); + return cfEntityCatalog.appEnvVar; } function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -343,7 +391,7 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension schema: cfEntityFactory(appSummaryEntityType), endpoint: endpointDefinition, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appSummary = new StratosCatalogEntity(definition, { dataReducers: [ updateAppSummaryRoutesReducer, endpointDisconnectRemoveEntitiesReducer() @@ -357,6 +405,7 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension getGuid: metadata => metadata.guid, } }); + return cfEntityCatalog.appSummary; } function generateCFSpaceQuotaEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -365,12 +414,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 +432,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 +448,7 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini labelPlural: 'Cloud Foundry Infos', endpoint: endpointDefinition }; - return new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( + cfEntityCatalog.cfInfo = new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( cfInfoDefinition, { dataReducers: [ @@ -410,6 +464,7 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini } } ); + return cfEntityCatalog.cfInfo; } function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -420,7 +475,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 +489,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 +531,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 +553,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 +568,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 +586,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 +607,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 +630,11 @@ function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExten labelPlural: 'Service Bindings', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.serviceBinding = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBindingActionBuilders + >( definition, { dataReducers: [ @@ -562,12 +643,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 +661,11 @@ function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDef labelPlural: 'Services', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.service = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceActionBuilders + >( definition, { dataReducers: [ @@ -587,12 +674,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 +692,11 @@ function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensio labelPlural: 'Service Plans', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.servicePlan = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanActionBuilders + >( definition, { dataReducers: [ @@ -612,12 +705,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 +727,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 +741,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 +759,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 +784,11 @@ function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefi labelPlural: 'Domains', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.domain = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + DomainActionBuilders + >( definition, { dataReducers: [ @@ -690,12 +797,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 +822,7 @@ function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDef }; }, }; - return new StratosCatalogEntity( + cfEntityCatalog.gitCommit = new StratosCatalogEntity( definition, { dataReducers: [ @@ -729,6 +838,7 @@ function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDef } } ); + return cfEntityCatalog.gitCommit; } function generateGitRepoEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -739,21 +849,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 +873,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 +893,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 +925,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 +946,7 @@ function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.route; } function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -845,7 +957,11 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Stacks', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.stack = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + StackActionBuilders + >( definition, { dataReducers: [ @@ -861,6 +977,7 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.stack; } function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -890,29 +1007,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 +1052,11 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio } }; - return new StratosCatalogEntity>( + cfEntityCatalog.application = new StratosCatalogEntity< + IAppFavMetadata, + APIResource, + ApplicationActionBuilders + >( applicationDefinition, { dataReducers: [ @@ -953,6 +1079,7 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio actionBuilders: applicationActionBuilder }, ); + return cfEntityCatalog.application; } function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -966,7 +1093,7 @@ function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefin labelPlural: 'Spaces', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.space = new StratosCatalogEntity, SpaceActionBuilders>( spaceDefinition, { actionBuilders: spaceActionBuilders, @@ -991,6 +1118,7 @@ function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefin } } ); + return cfEntityCatalog.space; } function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -1001,7 +1129,11 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Organizations', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.org = new StratosCatalogEntity< + IOrgFavMetadata, + APIResource, + OrganizationActionBuilders + >( orgDefinition, { actionBuilders: organizationActionBuilders, @@ -1027,6 +1159,7 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.org; } function getOrgStatus(org: APIResource) { @@ -1044,7 +1177,7 @@ function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinitio labelPlural: 'CF Metrics', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.metric = new StratosCatalogEntity( definition, { dataReducers: [ @@ -1052,4 +1185,5 @@ function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinitio ], } ); + return cfEntityCatalog.metric; } diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts index 8dd4a54f6d..b8cf91950c 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts @@ -1,8 +1,8 @@ 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 { 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, 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..212a79c207 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 @@ -5,7 +5,7 @@ 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 { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; 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'; 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..6584848749 100644 --- a/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts +++ b/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts @@ -2,6 +2,9 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MDAppModule } from '../../core/src/core/md.module'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../core/src/shared/services/cloud-foundry-user-provided-services.service'; import { SharedModule } from '../../core/src/shared/shared.module'; import { CfValidateEntitiesStart } from '../../store/src/actions/request.actions'; import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; @@ -83,7 +86,8 @@ function infoValidator(action: ICFAction, dispatcher) { 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..f24837eca3 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,5 @@ 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 { @@ -12,9 +13,27 @@ import { } from '../actions/application.actions'; import { GetAllAppsInSpace } from '../actions/space.actions'; 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..936439cdd8 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 @@ -5,28 +5,26 @@ import { 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'; 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..07f8d28d7d 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,4 +1,5 @@ import { IUpdateOrganization } from '../../../core/src/core/cf-api.types'; +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { DeleteOrganization, GetAllOrganizations, @@ -6,9 +7,8 @@ import { UpdateOrganization, } from '../actions/organization.actions'; 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..d8508b1274 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,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 { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { CreateQuotaDefinition, - GetOrganizationSpaceQuotaDefinitions, + GetQuotaDefinition, GetQuotaDefinitions, UpdateQuotaDefinition, } from '../actions/quota-definitions.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; export interface QuotaDefinitionActionBuilder extends OrchestratedActionBuilders { + get: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetQuotaDefinition; create: ( id: string, endpointGuid: string, @@ -26,16 +31,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 +54,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..9b03e09ee8 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 @@ -3,7 +3,19 @@ import { FetchDomain } from '../actions/domains.actions'; import { GetAllSecurityGroups } from '../actions/security-groups-actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const securityGroupBuilders = { +export interface SecurityGroupBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid + ) => FetchDomain; + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, flatten }: CFBasePipelineRequestActionMeta + ) => GetAllSecurityGroups; +} + +export const securityGroupBuilders: SecurityGroupBuilders = { get: ( guid, endpointGuid @@ -13,6 +25,4 @@ export const securityGroupBuilders = { 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..ffd1b134c7 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,7 +1,7 @@ -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 { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { AssociateSpaceQuota, CreateSpaceQuotaDefinition, 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..e6983ad135 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 @@ -2,7 +2,10 @@ 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 { 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/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..b17c5d4bfa 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 @@ -7,7 +7,7 @@ import { EntityCatalogTestModuleManualStore, TEST_CATALOGUE_ENTITIES, } from '../../../store/src/entity-catalog-test.module'; -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 { createBasicStoreModule, 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..7c6d7e0b99 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 @@ -5,7 +5,7 @@ import { EntityCatalogTestModuleManualStore, TEST_CATALOGUE_ENTITIES, } from '../../../store/src/entity-catalog-test.module'; -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 { environment } from '../../../core/src/environments/environment'; import { 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.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts index 41846a8b01..f5210fadd0 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,7 +4,6 @@ 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, @@ -19,15 +18,14 @@ import { 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 { 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..29bf89725d 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,11 +2,10 @@ 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'; @@ -14,18 +13,15 @@ import { IServiceBinding } from '../../../../../../core/src/core/cf-api-svc.type 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 { 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.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts index 61bf728b50..83ac02da05 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 @@ -9,19 +9,14 @@ 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'; @@ -30,24 +25,19 @@ import { 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 { 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 { 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'; +} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { selectUpdateInfo } from '../../../../store/src/selectors/api.selectors'; 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 { cfEntityCatalog } from '../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { createEntityRelationKey } from '../../entity-relations/entity-relations.types'; import { AppStat } from '../../store/types/app-metadata.types'; import { @@ -60,13 +50,13 @@ export function createGetApplicationAction(guid: string, endpointGuid: string) { return new GetApplication( guid, endpointGuid, [ - createEntityRelationKey(applicationEntityType, routeEntityType), - createEntityRelationKey(applicationEntityType, spaceEntityType), - createEntityRelationKey(applicationEntityType, stackEntityType), - createEntityRelationKey(applicationEntityType, serviceBindingEntityType), - createEntityRelationKey(routeEntityType, domainEntityType), - createEntityRelationKey(spaceEntityType, organizationEntityType), - ] + createEntityRelationKey(applicationEntityType, routeEntityType), + createEntityRelationKey(applicationEntityType, spaceEntityType), + createEntityRelationKey(applicationEntityType, stackEntityType), + createEntityRelationKey(applicationEntityType, serviceBindingEntityType), + createEntityRelationKey(routeEntityType, domainEntityType), + createEntityRelationKey(spaceEntityType, organizationEntityType), + ] ); } @@ -87,21 +77,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 +131,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 +151,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 +182,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$; @@ -270,22 +227,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() ); 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..6d1beb833c 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 @@ -8,7 +8,6 @@ import { } 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 { ApplicationService, createGetApplicationAction } from '../application.service'; import { ApplicationEnvVarsHelper } from './application-tabs-base/tabs/build-tab/application-env-vars.service'; @@ -16,19 +15,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 +71,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-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..503d85ab9b 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 { 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.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts index c0b9a3e987..600bde7fc6 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 @@ -30,7 +30,7 @@ import { IHeaderBreadcrumb } from '../../../../../../core/src/shared/components/ 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'; 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.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts index dce77b69da..7c3d7744d6 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,10 +4,9 @@ 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'; @@ -16,11 +15,10 @@ import { ConfirmationDialogService } from '../../../../../../../../core/src/shar 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 { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; 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,18 +232,14 @@ 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); + const restageAppAction = cfEntityCatalog.application.actions.restage(appGuid, cfGuid) this.confirmAndPollForState( appRestageConfirmation, () => this.store.dispatch(restageAppAction), 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..b4a2496a9d 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 { GitBranch, 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 { 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/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..2b478a9249 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 @@ -5,25 +5,16 @@ 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 { 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 { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { createEntityRelationKey } from '../../../../entity-relations/entity-relations.types'; import { createGetApplicationAction } from '../../application.service'; @@ -40,14 +31,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 +86,15 @@ 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'); + name, + space_guid: space + }).pipe( + filter(ris => !!ris.response) + ); + return this.wrapObservable(obs$, 'Could not create application'); } createRoute(): Observable { @@ -115,18 +107,18 @@ 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'); + } + ).pipe( + filter(ris => !!ris.response) + ) + return this.wrapObservable(obs$, 'Application created. Could not create route'); } return observableOf({ ...getDefaultRequestState(), @@ -135,12 +127,8 @@ 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) + return this.wrapObservable(obs$, 'Application and route created. Could not associated route with app'); } private wrapObservable(obs$: Observable, errorString: string): Observable { @@ -163,23 +151,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/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..557dde3485 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,9 +7,7 @@ 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, @@ -18,11 +16,8 @@ import { 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 { 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/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..19ec4e36bc 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 @@ -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, @@ -50,15 +48,11 @@ 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 { GitBranch, GitCommit, GitRepo } from '../../../../../../cloud-foundry/src/store/types/git.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 { ApplicationDeploySourceTypes, DEPLOY_TYPES_IDS } from '../deploy-application-steps.types'; @Component({ @@ -131,10 +125,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 +250,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 +283,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..b676eda5b5 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,10 @@ 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); + // 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 +162,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..a59c82a77e 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 { 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/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..add879d3ec 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 @@ -5,18 +5,10 @@ import { BehaviorSubject, Observable, of as observableOf, Subscription } from 'r import { filter, map, mergeMap, pairwise, switchMap, take, 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 { IDomain } from '../../../../../../core/src/core/cf-api.types'; import { pathGet } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction, @@ -25,7 +17,7 @@ import { import { RouterNav } from '../../../../../../store/src/actions/router.actions'; import { 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 { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationService } from '../../application.service'; const hostPattern = '^([\\w\\-\\.]*)$'; @@ -62,7 +54,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 +102,11 @@ 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( + 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,30 +204,24 @@ 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( + 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]); + } + }) + ); } 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); @@ -263,12 +240,7 @@ 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); - }), + tap(route => cfEntityCatalog.application.api.assignRoute(this.cfGuid, route.metadata.guid, this.appGuid)), switchMap(() => this.appService.app$), map(requestInfo => requestInfo.entityRequestInfo.updating['Assigning-Route']), filter(requestInfo => !requestInfo.busy), @@ -277,10 +249,7 @@ export class AddRoutesComponent implements OnInit, OnDestroy { 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); + cfEntityCatalog.route.api.getAllForApplication(this.appGuid, this.cfGuid) return { success: true, redirect: true }; } }) 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..d5a55e2d1a 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 { 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..623327a2f7 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 { 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/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..8557439921 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 @@ -6,14 +6,9 @@ import { Subscription } from 'rxjs'; import { filter } 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,20 +73,14 @@ 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( + }).pipe( filter(o => !!o && !o.fetching && !o.creating), this.map('Failed to create space: ') ); 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..89823562a9 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 @@ -6,23 +6,20 @@ import { filter, map, 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 { 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 { 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 { getActiveRouteCfOrgSpaceProvider } from '../../cf.helpers'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../services/cloud-foundry-organization.service'; @@ -115,23 +112,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), ); 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..3876bbc139 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 @@ -5,20 +5,12 @@ 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 { AssociateSpaceQuota } from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; import { UpdateSpace } from '../../../../../../cloud-foundry/src/actions/space.actions'; 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 { 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'; import { CloudFoundrySpaceService } from '../../services/cloud-foundry-space.service'; @@ -43,11 +35,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()), @@ -111,15 +102,10 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe } updateSpace$() { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('update'); - const updateSpaceAction = actionBuilder(this.spaceGuid, this.cfGuid, { + 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( + }).pipe( filter(o => !!o && !o.updating[UpdateSpace.UpdateExistingSpace].busy), map((state) => state.updating[UpdateSpace.UpdateExistingSpace]) ); @@ -127,26 +113,10 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe 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( + 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( filter(o => { return !!o && o.updating[AssociateSpaceQuota.UpdateExistingSpaceQuota] && 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..4f250dc1ca 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 @@ -9,15 +9,12 @@ import { 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 { cfEntityCatalog } from '../../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; export class QuotaDefinitionBaseComponent { @@ -33,7 +30,6 @@ export class QuotaDefinitionBaseComponent { orgSubscriber: Subscription; constructor( - protected entityServiceFactory: EntityServiceFactory, protected store: Store, protected activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, protected activatedRoute: ActivatedRoute, @@ -49,13 +45,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 +53,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/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..4906870a5c 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 { 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..091e3f43b5 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,9 @@ 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 { DeleteOrganization } from '../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { - cfInfoEntityType, domainEntityType, organizationEntityType, privateDomainsEntityType, @@ -20,27 +19,20 @@ import { } 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 { 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 +68,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 +87,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 +142,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,15 +158,16 @@ 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$; @@ -205,16 +179,7 @@ export class CloudFoundryEndpointService { } 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() { @@ -261,21 +226,7 @@ export class CloudFoundryEndpointService { } 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(); + cfEntityCatalog.domain.api.getMultiple(this.cfGuid, null, {}); } public deleteOrg(orgGuid: string, endpointGuid: string) { @@ -283,7 +234,7 @@ export class CloudFoundryEndpointService { } 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..7a5c11fadc 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 { 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.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts index a1c41cc54b..17f4e4e19c 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 @@ -25,13 +25,9 @@ import { getEntityFlattenedList, getStartedAppInstanceCount } from '../../../../ 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'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { createEntityRelationKey } from '../../../entity-relations/entity-relations.types'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; import { fetchServiceInstancesCount } from '../../service-catalog/services-helper'; @@ -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.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts index 8b34067470..ad5c7101d3 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 @@ -15,12 +15,12 @@ import { 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 { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { createEntityRelationKey } from '../../../entity-relations/entity-relations.types'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; import { fetchServiceInstancesCount } from '../../service-catalog/services-helper'; @@ -28,8 +28,6 @@ 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/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..cd34aed01f 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 { 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-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-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..f3f7716510 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 @@ -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/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..83b9905fd4 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 @@ -4,8 +4,6 @@ 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 +14,10 @@ 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 { 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(); @@ -54,12 +52,12 @@ export class InviteUsersCreateComponent implements OnInit { label: UserRoleLabels.space.short[SpaceUserRoleNames.AUDITOR], value: UserInviteSendSpaceRoles.auditor, }, { - label: UserRoleLabels.space.short[SpaceUserRoleNames.DEVELOPER], - value: UserInviteSendSpaceRoles.developer, - }, { - label: UserRoleLabels.space.short[SpaceUserRoleNames.MANAGER], - value: UserInviteSendSpaceRoles.manager, - }); + label: UserRoleLabels.space.short[SpaceUserRoleNames.DEVELOPER], + value: UserInviteSendSpaceRoles.developer, + }, { + label: UserRoleLabels.space.short[SpaceUserRoleNames.MANAGER], + value: UserInviteSendSpaceRoles.manager, + }); } stateOut(users: StackedInputActionsUpdate) { @@ -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/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..b2d09c7484 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 @@ -20,11 +20,7 @@ import { 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, @@ -33,9 +29,8 @@ import { import { APIResource, EntityInfo } from '../../../../../../store/src/types/api.types'; import { UsersRolesSetChanges } from '../../../../actions/users-roles.actions'; 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/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/services-helper.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts index 248875a0ee..b34883e357 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 @@ -15,27 +15,17 @@ import { } 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'; import { CFAppState } from '../../cf-app-state'; -import { cfEntityFactory } from '../../cf-entity-factory'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; 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 { QParam, QParamJoiners } from '../../shared/q-param'; import { fetchTotalResults } from '../cloud-foundry/cf.helpers'; import { ServicePlanAccessibility } from './services.service'; @@ -83,16 +73,9 @@ export const isEditServiceInstanceMode = (activatedRoute: ActivatedRoute) => { return !!cfId && !!serviceInstanceId; }; -export const getServiceInstancesInCf = (cfGuid: string, store: Store, paginationMonitorFactory: PaginationMonitorFactory) => { +export const getServiceInstancesInCf = (cfGuid: string) => { 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$; + return cfEntityCatalog.serviceInstance.store.getPaginationService(cfGuid, paginationKey).entities$; }; export const fetchServiceInstancesCount = ( @@ -103,14 +86,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 +113,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 +121,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 +194,37 @@ 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); -}; +): EntityService> => cfEntityCatalog.serviceBroker.store.getEntityService(serviceBrokerGuid, cfGuid, {}); 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() - ); -}; +): Observable => getServiceBroker(serviceBrokerGuid, cfGuid).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); -}; +): EntityService> => cfEntityCatalog.service.store.getEntityService(serviceGuid, cfGuid, {}); 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..e7db49a1d4 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,6 +1,5 @@ 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'; @@ -12,18 +11,11 @@ import { 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'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { serviceBrokerEntityType, servicePlanVisibilityEntityType } from '../../cf-entity-types'; import { createEntityRelationPaginationKey } from '../../entity-relations/entity-relations.types'; import { getCfService, getServiceInstancesInCf, getServiceName, getServicePlans } from './services-helper'; @@ -59,17 +51,17 @@ 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); + if (!this.serviceGuid) { + return; + } + + this.serviceEntityService = getCfService(this.serviceGuid, this.cfGuid); this.service$ = this.serviceEntityService.waitForEntity$.pipe( filter(o => !!o && !!o.entity), map(o => o.entity), @@ -82,43 +74,15 @@ export class ServicesService { 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$; + return cfEntityCatalog.servicePlanVisibility.store.getPaginationService(this.cfGuid, paginationKey, {}).entities$ } private getServiceInstances = () => { - return getServiceInstancesInCf(this.cfGuid, this.store, this.paginationMonitorFactory); + return getServiceInstancesInCf(this.cfGuid); } 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$; + return cfEntityCatalog.serviceBroker.store.getPaginationService(this.cfGuid, paginationKey, {}).entities$ } getServiceBrokerById = (guid: string): Observable> => this.serviceBrokers$ @@ -191,7 +155,7 @@ export class ServicesService { private initBaseObservables() { this.servicePlanVisibilities$ = this.getServicePlanVisibilities(); this.serviceExtraInfo$ = this.service$.pipe(map(o => JSON.parse(o.entity.extra))); - this.servicePlans$ = getServicePlans(this.service$, this.cfGuid, this.store, this.paginationMonitorFactory); + this.servicePlans$ = getServicePlans(this.service$, this.cfGuid); this.serviceBrokers$ = this.getServiceBrokers(); this.serviceBroker$ = this.serviceBrokers$.pipe( filter(p => !!p && p.length > 0), @@ -210,14 +174,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, 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..d0a0413e01 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 { IServiceBinding } from '../../../../../core/src/core/cf-api-svc.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 { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../store/src/types/api.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/services-wall.service.ts b/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts index 3d76cfcc5c..32abd41efc 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 { 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/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..599a9393ad 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 { 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.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts index 2bba06cd52..22bacf5d6e 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 @@ -9,7 +9,6 @@ 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 { SchemaFormConfig } from '../../schema-form/schema-form.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..23ec1f9838 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 @@ -17,13 +17,11 @@ import { 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 { cfEntityCatalog } from '../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; import { getCfService, getServiceBroker, @@ -43,7 +41,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 +48,7 @@ export class CreateServiceInstanceHelper { initBaseObservables = () => { - const serviceEntityService = getCfService(this.serviceGuid, this.cfGuid, this.entityServiceFactory); - - this.service$ = serviceEntityService.waitForEntity$.pipe( + this.service$ = getCfService(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 +57,21 @@ export class CreateServiceInstanceHelper { ); this.serviceBroker$ = this.service$.pipe( - map(service => getServiceBroker(service.entity.service_broker_guid, this.cfGuid, this.entityServiceFactory)), + map(service => getServiceBroker(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 +82,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 +110,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..3b7f414439 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 { 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,16 +131,11 @@ 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( + ).pipe( filter(s => { return s && !s.creating; }), 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..c31b6f6142 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, @@ -27,13 +33,12 @@ import { IServiceInstance, IServicePlan } from '../../../../../../core/src/core/ 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 { 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.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..b40f8dda75 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 @@ -14,7 +14,6 @@ import { } 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'; @@ -33,9 +32,8 @@ import { isValidJsonValidator } from '../../../../../../core/src/shared/form-val 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 { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { CreateServiceFormMode, CsiModeService } from './../csi-mode.service'; const { proxyAPIVersion, cfAPIVersion } = environment; @@ -292,12 +290,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 }; } }) 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..34f2d6488c 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 @@ -9,10 +9,8 @@ import { 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 { 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.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..a674581596 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 @@ -41,7 +41,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/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..1783dd1c18 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 { 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/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.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-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-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..4ccaeafd9b 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 @@ -19,16 +19,10 @@ import { } 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 { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; -import { - serviceBindingEntityType, - serviceInstancesEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { serviceBindingEntityType } from '../../../../../../cf-entity-types'; import { ApplicationService } from '../../../../../../features/applications/application.service'; import { isUserProvidedServiceInstance } from '../../../../../../features/cloud-foundry/cf.helpers'; import { @@ -73,7 +67,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 => getCfService(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); 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..c8fc20d7ac 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 @@ -19,30 +19,23 @@ 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 { 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), - createEntityRelationKey(serviceBindingEntityType, serviceInstancesEntityType), - createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType), - createEntityRelationKey(servicePlanEntityType, serviceEntityType), - ], - populateMissing: true - }); - return getAppServiceBindingsAction; + includeRelations: [ + createEntityRelationKey(serviceBindingEntityType, applicationEntityType), + createEntityRelationKey(serviceBindingEntityType, serviceInstancesEntityType), + createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType), + createEntityRelationKey(servicePlanEntityType, serviceEntityType), + ], + populateMissing: true + }); } constructor(store: Store, appService: ApplicationService, listConfig?: IListConfig>) { 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/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..cc9f26c9d0 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 @@ -62,7 +62,6 @@ export class CardAppComponent extends CardCell> implements OnI 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-apps-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts index f20011ad2b..284ae8a40f 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 @@ -7,7 +7,6 @@ import { GetAllApplications } from '../../../../../../../cloud-foundry/src/actio import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType, - appStatsEntityType, organizationEntityType, routeEntityType, spaceEntityType, @@ -23,12 +22,11 @@ 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 { CFListDataSource } from '../../../../cf-list-data-source'; import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-org-space-service.service'; @@ -44,18 +42,16 @@ 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 + startingCfGuidFilter?: string ) { const syncNeeded = paginationKey !== seedPaginationKey; - const action = new GetAllApplications(paginationKey, null, CfAppsDataSource.includeRelations); - action.endpointGuid = startingCfGuid; + const action = cfEntityCatalog.application.actions.getMultiple(undefined, CfAppsDataSource.paginationKey); const dispatchSequencer = new DispatchSequencer(store); @@ -107,12 +103,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-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..2342e06ff0 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 @@ -45,7 +45,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-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..e1b766844a 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 { @@ -12,18 +11,14 @@ 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'; -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-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..d04883addc 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 @@ -4,14 +4,11 @@ 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'; @@ -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-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..105119741b 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 @@ -8,8 +8,8 @@ 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 { PaginationEntityState } from '../../../../../../../store/src/types/pagination.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..6b5a9d03e3 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 @@ -9,8 +9,10 @@ import { ListView } from '../../../../../../../store/src/actions/list.actions'; 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-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..2e944f8323 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 @@ -14,7 +14,8 @@ 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'; @@ -117,7 +118,7 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationKey, genericRouteState: boolean, isLocal: boolean): { rowsState: Observable, sub: Subscription } { @@ -135,7 +136,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 +152,6 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationMonitor: PaginationMonitor, rowStateManager: TableRowStateManager ) { @@ -174,7 +173,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..ab825a63ba 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 @@ -2,14 +2,12 @@ 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 { 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-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..b728e72aee 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,5 @@ import { Store } from '@ngrx/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 +11,14 @@ 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-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.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..433d2c8ba8 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 @@ -4,11 +4,11 @@ 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 { getServiceBrokerName, getServiceName } from '../../../../../../features/service-catalog/services-helper'; @@ -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-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..982e384e25 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 { 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 { cfEntityCatalog } from '../../../../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; 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-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..9fc55fb4b5 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 @@ -5,14 +5,12 @@ import { applicationEntityType, spaceEntityType } from '../../../../../../../clo 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'; @@ -20,9 +18,14 @@ import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/ 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-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..ecdcaa8cd5 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, @@ -13,13 +12,12 @@ import { 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 { 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, [ + const action = cfEntityCatalog.route.actions.getAllInSpace( + spaceGuid, cfGuid, paginationKey, [ createEntityRelationKey(routeEntityType, applicationEntityType), createEntityRelationKey(routeEntityType, domainEntityType), - ], true, false) as PaginatedAction; - + ], true, false + ) action.initialParams['order-direction-field'] = 'creation'; super(store, listConfig, cfGuid, action, false); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/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..f0d9413db2 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 @@ -18,21 +18,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 { 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-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..e3d9e31448 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,5 @@ import { Store } from '@ngrx/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 +21,15 @@ 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.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..7c55300b2b 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 @@ -5,7 +5,6 @@ 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 { applicationEntityType, @@ -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/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..002d1d784a 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 @@ -15,20 +15,18 @@ 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-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..b1a250c1e1 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 { 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/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..78d28cda50 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 @@ -17,7 +17,7 @@ import { CurrentUserPermissionsService } from '../../../../../../../../core/src/ 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 { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; import { getOrgRoles } from '../../../../../../features/cloud-foundry/cf.helpers'; @@ -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, cfUserService: CfUserService, private userPerms: CurrentUserPermissionsService, - confirmDialog: ConfirmationDialogService + confirmDialog: ConfirmationDialogService, ) { super(store, confirmDialog, cfUserService); @@ -130,8 +130,7 @@ export class CfSpacePermissionCellComponent extends CfPermissionCell { 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.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts index a3cc6ae5f2..7453abfe53 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 @@ -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', 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..d03fc43149 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 @@ -12,19 +12,16 @@ 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..ab3aed7715 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 @@ -15,14 +15,13 @@ 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 { 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, private serviceActionHelperService: ServiceActionHelperService, private currentUserPermissionsService: CurrentUserPermissionsService, - private entityServiceFactory: EntityServiceFactory ) { super(); } 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..eb98c422bf 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,5 @@ import { Store } from '@ngrx/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,12 +13,9 @@ 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 { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { CFListDataSource } from '../../../../cf-list-data-source'; import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-org-space-service.service'; @@ -27,11 +23,8 @@ import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-or 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/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/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..a278c89b7d 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 @@ -9,7 +9,6 @@ import { } 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'; @@ -51,13 +50,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 getCfService(serviceGuid, cfGuid).waitForEntity$.pipe( + map(service => getServiceBroker(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..8d38830e06 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 @@ -26,18 +26,15 @@ 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 { 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..2eb596e4cc 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 @@ -20,23 +20,20 @@ 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 { 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/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..6fb379d819 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,19 @@ 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 { 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 { serviceInstancesEntityType } 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 { 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 { 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 { 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 +24,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 +44,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 +72,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', @@ -147,22 +125,10 @@ export class ServiceActionHelperService { 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$; + return cfEntityCatalog.userProvidedService.store.getEntityService(guid, endpointGuid, {}).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$; + return cfEntityCatalog.serviceInstance.store.getEntityService(guid, endpointGuid).entityObs$; } } 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..24ac509d51 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 { GitSCMService } 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 { 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/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/test-framework/cloud-foundry-endpoint-service.helper.ts b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts index 7a72e4072a..e9d28e530e 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 @@ -92,16 +92,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] }; } 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/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..7787fddcfe 100644 --- a/src/frontend/packages/core/src/app.module.ts +++ b/src/frontend/packages/core/src/app.module.ts @@ -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'; @@ -125,8 +126,10 @@ export class AppModule { eventService: GlobalEventService, private userFavoriteManager: UserFavoriteManager, private favoritesConfigMapper: FavoritesConfigMapper, + ech: EntityCatalogHelper ) { - EntityActionDispatcher.initialize(this.store); + EntityCatalogHelpers.SetEntityCatalogEntityHelper(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-types.ts b/src/frontend/packages/core/src/base-entity-types.ts index 33ba893917..9c878d627c 100644 --- a/src/frontend/packages/core/src/base-entity-types.ts +++ b/src/frontend/packages/core/src/base-entity-types.ts @@ -1,8 +1,12 @@ -import { systemEndpointsReducer } from '../../store/src/reducers/system-endpoints.reducer'; +import { + StratosCatalogEndpointEntity, + StratosCatalogEntity, +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { addOrUpdateUserFavoriteMetadataReducer, deleteUserFavoriteMetadataReducer, } from '../../store/src/reducers/favorite.reducer'; +import { systemEndpointsReducer } from '../../store/src/reducers/system-endpoints.reducer'; import { endpointEntitySchema, STRATOS_ENDPOINT_TYPE, @@ -10,7 +14,6 @@ import { userFavoritesEntitySchema, userProfileEntitySchema, } from './base-entity-schemas'; -import { StratosCatalogEndpointEntity, StratosCatalogEntity } from '../../store/src/entity-catalog/entity-catalog-entity'; import { BaseEndpointAuth } from './features/endpoints/endpoint-auth'; // @@ -38,10 +41,10 @@ class DefaultEndpointCatalogEntity extends StratosCatalogEntity { type: endpointEntitySchema.entityType, endpoint: stratosType, }, { - dataReducers: [ - systemEndpointsReducer - ] - }); + dataReducers: [ + systemEndpointsReducer + ] + }); } } @@ -52,11 +55,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/cf-api.types.ts b/src/frontend/packages/core/src/core/cf-api.types.ts index 9442951898..ac83e78b88 100644 --- a/src/frontend/packages/core/src/core/cf-api.types.ts +++ b/src/frontend/packages/core/src/core/cf-api.types.ts @@ -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[]; diff --git a/src/frontend/packages/core/src/core/core.module.ts b/src/frontend/packages/core/src/core/core.module.ts index 0c5547ad70..39b6412c5f 100644 --- a/src/frontend/packages/core/src/core/core.module.ts +++ b/src/frontend/packages/core/src/core/core.module.ts @@ -1,22 +1,25 @@ import { PortalModule } from '@angular/cdk/portal'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; 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 { 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'; import { AuthGuardService } from './auth-guard.service'; import { ButtonBlurOnClickDirective } from './button-blur-on-click.directive'; import { BytesToHumanSize, MegaBytesToHumanSize } from './byte-formatters.pipe'; import { ClickStopPropagationDirective } from './click-stop-propagation.directive'; +import { APP_TITLE, appTitleFactory } from './core.types'; import { CurrentUserPermissionsService } from './current-user-permissions.service'; import { DisableRouterLinkDirective } from './disable-router-link.directive'; import { DotContentComponent } from './dot-content/dot-content.component'; import { EndpointsService } from './endpoints.service'; import { EntityFavoriteStarComponent } from './entity-favorite-star/entity-favorite-star.component'; -import { EntityServiceFactory } from '../../../store/src/entity-service-factory.service'; import { EventWatcherService } from './event-watcher/event-watcher.service'; import { InfinityPipe } from './infinity.pipe'; import { LogOutDialogComponent } from './log-out-dialog/log-out-dialog.component'; @@ -28,12 +31,10 @@ import { PageNotFoundComponentComponent } from './page-not-found-component/page- import { SafeImgPipe } from './safe-img.pipe'; import { StatefulIconComponent } from './stateful-icon/stateful-icon.component'; import { TruncatePipe } from './truncate.pipe'; +import { UserProfileService } from './user-profile.service'; import { UserService } from './user.service'; import { UtilsService } from './utils.service'; import { WindowRef } from './window-ref/window-ref.service'; -import { APP_TITLE, appTitleFactory } from './core.types'; -import { UserProfileService } from './user-profile.service'; -import { UserAvatarComponent } from './../shared/components/user-avatar/user-avatar.component'; @NgModule({ imports: [ @@ -77,6 +78,7 @@ import { UserAvatarComponent } from './../shared/components/user-avatar/user-ava EndpointsService, UserService, EntityServiceFactory, + EntityCatalogHelper, UserProfileService, 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..234279fec8 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,7 @@ 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 { cfEntityCatalog } from '../../../cloud-foundry/src/cf-entity-catalog'; import { getCurrentUserCFEndpointHasScope, getCurrentUserCFEndpointRolesState, @@ -16,8 +14,6 @@ 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, @@ -194,24 +190,11 @@ 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)); }), diff --git a/src/frontend/packages/core/src/core/endpoints.service.ts b/src/frontend/packages/core/src/core/endpoints.service.ts index 51749fccf5..842330f087 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'; diff --git a/src/frontend/packages/core/src/core/user-favorite-manager.ts b/src/frontend/packages/core/src/core/user-favorite-manager.ts index 44a07d676a..45e4fded8a 100644 --- a/src/frontend/packages/core/src/core/user-favorite-manager.ts +++ b/src/frontend/packages/core/src/core/user-favorite-manager.ts @@ -5,6 +5,7 @@ import { filter, map, switchMap, tap } from 'rxjs/operators'; import { ToggleUserFavoriteAction } from '../../../store/src/actions/user-favourites-actions/toggle-user-favorite-action'; import { GeneralEntityAppState, IRequestEntityTypeState } from '../../../store/src/app-state'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { endpointEntitiesSelector } from '../../../store/src/selectors/endpoint.selectors'; import { errorFetchingFavoritesSelector, @@ -19,7 +20,6 @@ import { FavoritesConfigMapper, TFavoriteMapperFunction, } from '../shared/components/favorites-meta-card/favorite-config-mapper'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; import { LoggerService } from './logger.service'; export interface IFavoriteEntity { diff --git a/src/frontend/packages/core/src/core/user-profile.service.ts b/src/frontend/packages/core/src/core/user-profile.service.ts index 95fd5c5a4b..cab800a9cc 100644 --- a/src/frontend/packages/core/src/core/user-profile.service.ts +++ b/src/frontend/packages/core/src/core/user-profile.service.ts @@ -10,21 +10,13 @@ import { } from '../../../store/src/actions/user-profile.actions'; import { AppState } from '../../../store/src/app-state'; import { UserProfileEffect, userProfilePasswordUpdatingKey } from '../../../store/src/effects/user-profile.effects'; -import { - ActionState, - getDefaultActionState, - rootUpdatingKey, -} from '../../../store/src/reducers/api-request-reducer/types'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; +import { EntityMonitor } from '../../../store/src/monitors/entity-monitor'; +import { ActionState, getDefaultActionState, rootUpdatingKey } from '../../../store/src/reducers/api-request-reducer/types'; import { AuthState } from '../../../store/src/reducers/auth.reducer'; import { selectRequestInfo, selectUpdateInfo } from '../../../store/src/selectors/api.selectors'; -import { - UserProfileInfo, - UserProfileInfoEmail, - UserProfileInfoUpdates, -} from '../../../store/src/types/user-profile.types'; +import { UserProfileInfo, UserProfileInfoEmail, UserProfileInfoUpdates } from '../../../store/src/types/user-profile.types'; import { userProfileEntitySchema } from '../base-entity-schemas'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityMonitor } from '../../../store/src/monitors/entity-monitor'; @Injectable() @@ -40,14 +32,16 @@ export class UserProfileService { private stratosUserConfig = entityCatalog.getEntity(userProfileEntitySchema.endpointType, userProfileEntitySchema.entityType); - constructor(private store: Store) { + constructor( + private store: Store, + ) { if (!this.stratosUserConfig) { console.error('Can not get user profile entity'); this.userProfile$ = of({} as UserProfileInfo); return; } - this.entityMonitor = this.stratosUserConfig.getEntityMonitor(this.store, UserProfileEffect.guid); + this.entityMonitor = this.stratosUserConfig.store.getEntityMonitor(UserProfileEffect.guid); this.userProfile$ = this.entityMonitor.entity$.pipe( filter(data => data && !!data.id) @@ -99,7 +93,7 @@ export class UserProfileService { updateProfile(profile: UserProfileInfo, profileChanges: UserProfileInfoUpdates): Observable<[ActionState, ActionState]> { const didChangeProfile = (profileChanges.givenName !== undefined || profileChanges.familyName !== undefined || - profileChanges.emailAddress !== undefined ); + profileChanges.emailAddress !== undefined); const didChangePassword = !!(profileChanges.newPassword && profileChanges.currentPassword); const profileObs$ = didChangeProfile ? this.updateProfileInfo(profile, profileChanges) : observableOf(getDefaultActionState()); const passwordObs$ = didChangePassword ? this.updatePassword(profile, profileChanges) : observableOf(getDefaultActionState()); diff --git a/src/frontend/packages/core/src/core/utils.service.ts b/src/frontend/packages/core/src/core/utils.service.ts index 422447cb4a..415a8f89c6 100644 --- a/src/frontend/packages/core/src/core/utils.service.ts +++ b/src/frontend/packages/core/src/core/utils.service.ts @@ -11,7 +11,55 @@ export function getIdFromRoute(activatedRoute: ActivatedRoute, id: string) { return null; } -export type Omit = 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 index 64d39dd41e..3dd8541e5b 100644 --- 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 @@ -1,20 +1,13 @@ 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 { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/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({ @@ -32,7 +25,6 @@ export class CreateQuotaStepComponent { form: QuotaDefinitionFormComponent; constructor( - private store: Store, private activatedRoute: ActivatedRoute, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; @@ -42,10 +34,7 @@ export class CreateQuotaStepComponent { 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( + return cfEntityCatalog.quotaDefinition.api.create(formValues.name, this.cfGuid, formValues).pipe( pairwise(), filter(([oldV, newV]) => oldV.creating && !newV.creating), map(([, newV]) => newV), 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/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts index b1371907dc..a63b5b2489 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/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts @@ -1,21 +1,14 @@ 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 { 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 { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; -import { spaceQuotaEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; @Component({ @@ -34,7 +27,6 @@ export class CreateSpaceQuotaStepComponent { form: SpaceQuotaDefinitionFormComponent; constructor( - private store: Store, private activatedRoute: ActivatedRoute, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; @@ -46,14 +38,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/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 index 5bb4a1ef34..b15cbe0a71 100644 --- 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 @@ -4,26 +4,15 @@ 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 { 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 { 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 { IOrgQuotaDefinition } from '../../../../core/cf-api.types'; 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({ @@ -38,9 +27,9 @@ export class EditQuotaStepComponent implements OnDestroy { cfGuid: string; quotaGuid: string; - quotaDefinition$: Observable>; + quotaDefinition$: Observable>; quotaSubscription: Subscription; - quota: IQuotaDefinition; + quota: IOrgQuotaDefinition; @ViewChild('form', { static: false }) form: QuotaDefinitionFormComponent; @@ -48,7 +37,6 @@ export class EditQuotaStepComponent implements OnDestroy { constructor( private store: Store, private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, ) { this.cfGuid = activeRouteCfOrgSpace.cfGuid; @@ -58,10 +46,7 @@ export class EditQuotaStepComponent implements OnDestroy { } fetchQuotaDefinition() { - this.quotaDefinition$ = this.entityServiceFactory.create>( - this.quotaGuid, - new GetQuotaDefinition(this.quotaGuid, this.cfGuid), - ).waitForEntity$.pipe( + this.quotaDefinition$ = cfEntityCatalog.quotaDefinition.store.getEntityService(this.quotaGuid, this.cfGuid, {}).waitForEntity$.pipe( first(), map(data => data.entity), tap((resource) => this.quota = resource.entity) @@ -74,12 +59,10 @@ export class EditQuotaStepComponent implements OnDestroy { 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( + const action = cfEntityCatalog.quotaDefinition.actions.update(this.quotaGuid, this.cfGuid, formValues); + this.store.dispatch(action); + return cfEntityCatalog.quotaDefinition.store.getEntityMonitor(this.quotaGuid) + .getUpdatingSection(action.updatingKey).pipe( pairwise(), filter(([oldV, newV]) => oldV.busy && !newV.busy), map(([, newV]) => newV), 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 index cd832da790..c1d149dcc5 100644 --- 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 @@ -4,24 +4,13 @@ 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 { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; 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 { ISpaceQuotaDefinition } from '../../../../core/cf-api.types'; 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({ @@ -35,8 +24,8 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { cfGuid: string; spaceQuotaGuid: string; allQuotas: string[]; - spaceQuotaDefinition$: Observable>; - quota: IQuotaDefinition; + spaceQuotaDefinition$: Observable>; + quota: ISpaceQuotaDefinition; @ViewChild('form', { static: false }) form: SpaceQuotaDefinitionFormComponent; @@ -44,7 +33,6 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { constructor( private store: Store, private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; this.spaceQuotaGuid = this.activatedRoute.snapshot.params.quotaId; @@ -53,10 +41,7 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { } fetchQuotaDefinition() { - this.spaceQuotaDefinition$ = this.entityServiceFactory.create>( - this.spaceQuotaGuid, - new GetSpaceQuotaDefinition(this.spaceQuotaGuid, this.cfGuid), - ).waitForEntity$.pipe( + this.spaceQuotaDefinition$ = cfEntityCatalog.spaceQuota.store.getEntityService(this.spaceQuotaGuid, this.cfGuid).waitForEntity$.pipe( map(data => data.entity), tap((resource) => this.quota = resource.entity) ); @@ -68,16 +53,11 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { 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) + const action = cfEntityCatalog.spaceQuota.actions.update(this.spaceQuotaGuid, this.cfGuid, formValues); + this.store.dispatch(action); + return cfEntityCatalog.quotaDefinition.store.getEntityMonitor(this.spaceQuotaGuid) + .getUpdatingSection(action.updatingKey) .pipe( pairwise(), filter(([oldV, newV]) => oldV.busy && !newV.busy), diff --git a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts index 0f73bbfb4b..ed39df04bd 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts @@ -1,24 +1,12 @@ 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 { 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'; @@ -45,15 +33,12 @@ 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, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; } @@ -83,28 +68,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/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts index a5055fbf0a..154be20360 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts @@ -1,19 +1,12 @@ 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 { 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'; @@ -28,15 +21,13 @@ export class SpaceQuotaDefinitionFormComponent implements OnInit, OnDestroy { cfGuid: string; orgGuid: string; allQuotas: string[]; - spaceQuotaDefinitions$: Observable[]>; + spaceQuotaDefinitions$: Observable; formGroup: FormGroup; @Input() quota: IQuotaDefinition; constructor( - private store: Store, private activatedRoute: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; this.orgGuid = this.activatedRoute.snapshot.params.orgId; @@ -65,24 +56,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/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..22bf3bd7c6 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 @@ -4,17 +4,12 @@ import { AfterViewInit, Component, NgZone, OnDestroy, OnInit, ViewChild, ViewCon import { MatDrawer } from '@angular/material'; 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 { cfEntityCatalog } from '../../../../../cloud-foundry/src/cf-entity-catalog'; 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'; @@ -144,10 +139,7 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit ); // 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); - }) + new EndpointHealthCheck(CF_ENDPOINT_TYPE, (endpoint) => cfEntityCatalog.cfInfo.api.get(endpoint.guid)) ); this.dispatchRelations(); this.store.dispatch(new GetUserFavoritesAction()); 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/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..c2ca34a7c9 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'; 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.ts b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts index ce966903ba..5f4447afec 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 @@ -7,7 +7,7 @@ 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 { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointEntitiesSelector } from './../../../../../../store/src/selectors/endpoint.selectors'; import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; import { selectUpdateInfo } from '../../../../../../store/src/selectors/api.selectors'; 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 348b5ebf48..15bc240559 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 @@ -6,7 +6,7 @@ import { filter, first, map } from 'rxjs/operators'; import { MetricsAPIAction, MetricsAPITargets } from '../../../../../store/src/actions/metrics-api.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 { getIdFromRoute } from '../../../core/utils.service'; import { IHeaderBreadcrumb } from '../../../shared/components/page-header/page-header.types'; import { EndpointIcon } from '../../endpoints/endpoint-helpers'; 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..f75c0a63dc 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 @@ -7,6 +7,7 @@ import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { RemoveUserFavoriteAction, } from '../../../../../store/src/actions/user-favourites-actions/remove-user-favorite-action'; +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'; 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-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 index 9f35194807..02ae1b0203 100644 --- 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 @@ -1,20 +1,17 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { - serviceBrokerEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../../../../../cloud-foundry/src/cf-entity-types'; +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 { 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 { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { IServiceBroker, IServiceInstance } from '../../../../../../core/cf-api-svc.types'; +import { IServiceInstance } from '../../../../../../core/cf-api-svc.types'; import { TableCellCustom } from '../../../list.types'; // TODO: Move CF code to CF Module #3769 @@ -35,45 +32,38 @@ export class TableCellServiceComponent extends TableCellCustom; @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)) - ); + if (!this.isUserProvidedServiceInstance) { + const service$ = getCfService(this.row.entity.service_guid, this.row.entity.cfGuid).waitForEntity$.pipe( + filter(s => !!s), + ); - this.serviceUrl$ = service$.pipe( - map(service => `/marketplace/${service.entity.entity.cfGuid}/${service.entity.metadata.guid}/summary`) - ); + this.serviceName$ = service$.pipe( + map(s => getServiceName(s.entity)) + ); - 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() - ); - }) - ); + 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/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..42cdbed9bf 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'; 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..25ba15e604 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 @@ -9,13 +9,13 @@ import { DisconnectEndpoint, UnregisterEndpoint } from '../../../../../../../sto import { ShowSnackBar } from '../../../../../../../store/src/actions/snackBar.actions'; import { GetSystemInfo } from '../../../../../../../store/src/actions/system.actions'; 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, @@ -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-list-config.service.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts index 8483e01383..e7516adeed 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 @@ -4,7 +4,7 @@ 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 { 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'; 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.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-types/github-commits/github-commits-data-source.ts b/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts index c93962a412..a376791728 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts @@ -2,12 +2,11 @@ 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 { GitSCM } from '../../../../data-services/scm/scm'; import { ListDataSource } from '../../data-sources-controllers/list-data-source'; import { IListConfig } from '../../list.component.types'; @@ -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/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts index 9d8fbab53c..28816401e5 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/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts @@ -13,14 +13,12 @@ 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 { 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'; @@ -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.component.ts b/src/frontend/packages/core/src/shared/components/list/list.component.ts index 557bf779ab..5c14153089 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'; @@ -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/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/data-services/scm/github-scm.ts b/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts index 5de5a777ca..f58b374197 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts +++ b/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts @@ -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/core/src/shared/data-services/scm/gitlab-scm.ts index 2b6daa1931..90c079e14b 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts +++ b/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts @@ -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.ts b/src/frontend/packages/core/src/shared/data-services/scm/scm.ts index eb25e03cb9..d20a2c9538 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/scm.ts +++ b/src/frontend/packages/core/src/shared/data-services/scm/scm.ts @@ -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/core/src/shared/services/cf-org-space-label.service.ts b/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts index 933441c5d6..e9690804fa 100644 --- a/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts +++ b/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts @@ -12,7 +12,7 @@ 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 { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; export class CfOrgSpaceLabelService { 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 index 6fa1765b3b..7fcb69adba 100644 --- 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 @@ -4,59 +4,26 @@ 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 { cfEntityCatalog } from '../../../../cloud-foundry/src/cf-entity-catalog'; +import { organizationEntityType, spaceEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; 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, ) { @@ -64,17 +31,10 @@ export class CloudFoundryUserProvidedServicesService { 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); + + 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$ @@ -88,12 +48,12 @@ export class CloudFoundryUserProvidedServicesService { : Observable { const parentSchemaKey = spaceGuid ? spaceEntityType : orgGuid ? organizationEntityType : 'cf'; const uniqueKey = spaceGuid || orgGuid || cfGuid; - const actionBuilder = this.userProvidedServiceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder( + + const action = cfEntityCatalog.userProvidedService.actions.getMultiple( 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()); @@ -105,13 +65,7 @@ export class CloudFoundryUserProvidedServicesService { } 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( + return cfEntityCatalog.userProvidedService.store.getEntityService(upsGuid, cfGuid, {}).waitForEntity$.pipe( map(e => e.entity) ); } @@ -121,10 +75,12 @@ export class CloudFoundryUserProvidedServicesService { 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( + return cfEntityCatalog.userProvidedService.api.create( + cfGuid, + guid, + data, + // this.userProvidedServiceInstancesEntityConfig + ).pipe( pairwise(), filter(([oldV, newV]) => oldV.creating && !newV.creating), map(([, newV]) => newV), @@ -133,7 +89,7 @@ export class CloudFoundryUserProvidedServicesService { 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)); + this.store.dispatch(new ClearPaginationOfType(cfEntityCatalog.service)); } }) ); @@ -144,23 +100,25 @@ export class CloudFoundryUserProvidedServicesService { guid: string, data: Partial, ): Observable { - this.userProvidedServiceEntity.actionDispatchManager.dispatchUpdate( + // TODO: RC Q + const updatingKey = cfEntityCatalog.userProvidedService.actions.update(guid, cfGuid, data).updatingKey; + // const updatingKey = UpdateUserProvidedServiceInstance.updateServiceInstance; + return cfEntityCatalog.userProvidedService.api.update( guid, cfGuid, data, - this.userProvidedServiceInstancesEntityConfig - ); - return this.userProvidedServiceEntity.getEntityMonitor( - this.store, - guid - ).entityRequest$.pipe( - filter(v => !!v.updating[UpdateUserProvidedServiceInstance.updateServiceInstance]), + // this.userProvidedServiceInstancesEntityConfig + ).pipe( + filter(v => !!v.updating[updatingKey]), pairwise(), filter(([oldV, newV]) => - oldV.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].busy && - !newV.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].busy), + oldV.updating[updatingKey].busy && + !newV.updating[updatingKey].busy), map(([, newV]) => newV) ); } } + + + diff --git a/src/frontend/packages/core/src/shared/shared.module.ts b/src/frontend/packages/core/src/shared/shared.module.ts index c380a0c102..b890491046 100644 --- a/src/frontend/packages/core/src/shared/shared.module.ts +++ b/src/frontend/packages/core/src/shared/shared.module.ts @@ -125,7 +125,6 @@ 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'; @@ -347,17 +346,13 @@ import { UserPermissionDirective } from './user-permission.directive'; ApplicationStateService, EndpointListHelper, EndpointsListConfigService, - // CfUserService, ConfirmationDialogService, EntityMonitorFactory, PaginationMonitorFactory, - // CloudFoundryService, InternalEventMonitorFactory, - // ServiceActionHelperService, MetricsRangeSelectorService, GitSCMService, - LongRunningOperationsService, - CloudFoundryUserProvidedServicesService + LongRunningOperationsService ] }) export class SharedModule { } diff --git a/src/frontend/packages/core/test-framework/application-service-helper.ts b/src/frontend/packages/core/test-framework/application-service-helper.ts index e4fcb83dab..a9caaa3ae8 100644 --- a/src/frontend/packages/core/test-framework/application-service-helper.ts +++ b/src/frontend/packages/core/test-framework/application-service-helper.ts @@ -11,12 +11,10 @@ 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 { ApplicationStateData, ApplicationStateService, } from '../src/shared/components/application-state/application-state.service'; -import { PaginationMonitorFactory } from '../../store/src/monitors/pagination-monitor.factory'; function createEntity(entity: T): APIResource { return { @@ -91,28 +89,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/core/test-framework/core-test.modules.ts b/src/frontend/packages/core/test-framework/core-test.modules.ts index dd28d46d6b..f2e0bc6e7a 100644 --- a/src/frontend/packages/core/test-framework/core-test.modules.ts +++ b/src/frontend/packages/core/test-framework/core-test.modules.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; 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 { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; @NgModule({ imports: [ diff --git a/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts b/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts index b59fcf4258..010004b460 100644 --- a/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts +++ b/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts @@ -1,5 +1,5 @@ -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'; import { EntityCatalogEntityConfig } from '../../store/src/entity-catalog/entity-catalog.types'; export interface EntityCatalogHelperConfig { diff --git a/src/frontend/packages/store/src/effects/app.effects.ts b/src/frontend/packages/store/src/effects/app.effects.ts index e1f43f644b..d4ddf1346d 100644 --- a/src/frontend/packages/store/src/effects/app.effects.ts +++ b/src/frontend/packages/store/src/effects/app.effects.ts @@ -3,14 +3,12 @@ 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 { cfEntityCatalog } from '../../../cloud-foundry/src/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'; @@ -27,10 +25,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/store/src/effects/endpoint.effects.ts b/src/frontend/packages/store/src/effects/endpoint.effects.ts index 32f5cf3e7e..3ebaf0694a 100644 --- a/src/frontend/packages/store/src/effects/endpoint.effects.ts +++ b/src/frontend/packages/store/src/effects/endpoint.effects.ts @@ -1,4 +1,3 @@ -import { UpdateEndpoint, UPDATE_ENDPOINT, UPDATE_ENDPOINT_SUCCESS, UPDATE_ENDPOINT_FAILED } from './../actions/endpoint.actions'; import { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; @@ -35,7 +34,7 @@ import { ClearPaginationOfEntity } from '../actions/pagination.actions'; import { GET_SYSTEM_INFO_SUCCESS, GetSystemInfo, GetSystemSuccess } from '../actions/system.actions'; import { GetUserFavoritesAction } from '../actions/user-favourites-actions/get-user-favorites-action'; import { DispatchOnlyAppState } from '../app-state'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../helpers/entity-factory'; import { ApiRequestTypes } from '../reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from '../types/api.types'; @@ -46,6 +45,12 @@ import { WrapperRequestActionFailed, WrapperRequestActionSuccess, } from '../types/request.types'; +import { + UPDATE_ENDPOINT, + UPDATE_ENDPOINT_FAILED, + UPDATE_ENDPOINT_SUCCESS, + UpdateEndpoint, +} from './../actions/endpoint.actions'; import { PaginatedAction } from './../types/pagination.types'; @@ -236,36 +241,36 @@ export class EndpointsEffect { ); })); - @Effect() updateEndpoint$ = this.actions$.pipe( - ofType(UPDATE_ENDPOINT), - mergeMap(action => { - const apiAction = this.getEndpointUpdateAction(action.id, action.type, EndpointsEffect.updatingKey); - const paramsObj = { - name: action.name, - skipSSL: action.skipSSL, - setClientInfo: action.setClientInfo, - clientID: action.clientID, - clientSecret: action.clientSecret, - allowSSO: action.allowSSO, - }; + @Effect() updateEndpoint$ = this.actions$.pipe( + ofType(UPDATE_ENDPOINT), + mergeMap(action => { + const apiAction = this.getEndpointUpdateAction(action.id, action.type, EndpointsEffect.updatingKey); + const paramsObj = { + name: action.name, + skipSSL: action.skipSSL, + setClientInfo: action.setClientInfo, + clientID: action.clientID, + clientSecret: action.clientSecret, + allowSSO: action.allowSSO, + }; - // Encode auth values in the body, not the query string - const body: any = new FormData(); - Object.keys(paramsObj).forEach(key => { - body.set(key, paramsObj[key]); - }); + // Encode auth values in the body, not the query string + const body: any = new FormData(); + Object.keys(paramsObj).forEach(key => { + body.set(key, paramsObj[key]); + }); - return this.doEndpointAction( - apiAction, - '/pp/v1/endpoint/' + action.id, - new HttpParams({}), - 'update', - [UPDATE_ENDPOINT_SUCCESS, UPDATE_ENDPOINT_FAILED], - action.endpointType, - body, - this.processUpdateError - ); - })); + return this.doEndpointAction( + apiAction, + '/pp/v1/endpoint/' + action.id, + new HttpParams({}), + 'update', + [UPDATE_ENDPOINT_SUCCESS, UPDATE_ENDPOINT_FAILED], + action.endpointType, + body, + this.processUpdateError + ); + })); private processUpdateError(e: HttpErrorResponse): string { const err = e.error ? e.error.error : {}; diff --git a/src/frontend/packages/store/src/effects/metrics.effects.ts b/src/frontend/packages/store/src/effects/metrics.effects.ts index f4bc789531..b075191891 100644 --- a/src/frontend/packages/store/src/effects/metrics.effects.ts +++ b/src/frontend/packages/store/src/effects/metrics.effects.ts @@ -4,7 +4,6 @@ import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { catchError, map, mergeMap } from 'rxjs/operators'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; import { METRIC_API_FAILED, METRIC_API_START, @@ -13,6 +12,7 @@ import { } from '../actions/metrics-api.actions'; import { getFullMetricQueryQuery, METRICS_START, MetricsAction } from '../actions/metrics.actions'; import { DispatchOnlyAppState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { IMetricsResponse } from '../types/base-metric.types'; import { StartRequestAction, WrapperRequestActionFailed, WrapperRequestActionSuccess } from './../types/request.types'; @@ -60,11 +60,11 @@ export class MetricsEffect { errObservable.message, action, 'fetch', { - endpointIds: [action.endpointGuid], - url: errObservable.url || fullUrl, - eventCode: errObservable.status ? errObservable.status + '' : '500', - message: 'Metric request error', - } + endpointIds: [action.endpointGuid], + url: errObservable.url || fullUrl, + eventCode: errObservable.status ? errObservable.status + '' : '500', + message: 'Metric request error', + } ) ]; })); diff --git a/src/frontend/packages/store/src/effects/update-app-effects.ts b/src/frontend/packages/store/src/effects/update-app-effects.ts index a0558f9851..c4cab46c0f 100644 --- a/src/frontend/packages/store/src/effects/update-app-effects.ts +++ b/src/frontend/packages/store/src/effects/update-app-effects.ts @@ -2,11 +2,9 @@ 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 { cfEntityCatalog } from '../../../cloud-foundry/src/cf-entity-catalog'; import { WrapperRequestActionSuccess } from '../types/request.types'; @@ -29,15 +27,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,10 +41,7 @@ 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; } }); diff --git a/src/frontend/packages/store/src/effects/user-favorites-effect.ts b/src/frontend/packages/store/src/effects/user-favorites-effect.ts index 9c9e677bee..deebce83a7 100644 --- a/src/frontend/packages/store/src/effects/user-favorites-effect.ts +++ b/src/frontend/packages/store/src/effects/user-favorites-effect.ts @@ -5,7 +5,7 @@ import { Store } from '@ngrx/store'; import { catchError, first, map, mergeMap, switchMap } from 'rxjs/operators'; import { userFavoritesEntitySchema } from '../../../core/src/base-entity-schemas'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { UserFavoriteManager } from '../../../core/src/core/user-favorite-manager'; import { environment } from '../../../core/src/environments/environment.prod'; import { ClearPaginationOfEntity } from '../actions/pagination.actions'; diff --git a/src/frontend/packages/store/src/effects/user-profile.effects.ts b/src/frontend/packages/store/src/effects/user-profile.effects.ts index c58d969600..175ac3a4ef 100644 --- a/src/frontend/packages/store/src/effects/user-profile.effects.ts +++ b/src/frontend/packages/store/src/effects/user-profile.effects.ts @@ -5,7 +5,6 @@ import { Store } from '@ngrx/store'; import { catchError, mergeMap, switchMap } from 'rxjs/operators'; import { userProfileEntitySchema } from '../../../core/src/base-entity-schemas'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; import { environment } from '../../../core/src/environments/environment'; import { FetchUserProfileAction, @@ -15,6 +14,7 @@ import { UpdateUserPasswordAction, UpdateUserProfileAction, } from '../actions/user-profile.actions'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { rootUpdatingKey } from '../reducers/api-request-reducer/types'; import { UserProfileInfo } from '../types/user-profile.types'; import { DispatchOnlyAppState } from './../app-state'; diff --git a/src/frontend/packages/store/src/effects/users-roles.effects.ts b/src/frontend/packages/store/src/effects/users-roles.effects.ts index 4785818511..640bebb891 100644 --- a/src/frontend/packages/store/src/effects/users-roles.effects.ts +++ b/src/frontend/packages/store/src/effects/users-roles.effects.ts @@ -20,7 +20,7 @@ import { CfUserService } from '../../../cloud-foundry/src/shared/data-services/c import { OrgUserRoleNames } from '../../../cloud-foundry/src/store/types/user.types'; import { CfRoleChange, UsersRolesState } from '../../../cloud-foundry/src/store/types/users-roles.types'; import { ResetPagination } from '../actions/pagination.actions'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { ActionState } from '../reducers/api-request-reducer/types'; import { selectSessionData } from '../reducers/auth.reducer'; import { selectUsersRoles } from '../selectors/users-roles.selector'; @@ -35,7 +35,7 @@ export class UsersRolesEffects { constructor( private actions$: Actions, private store: Store, - private cfUserService: CfUserService + private cfUserService: CfUserService, ) { } @Effect() clearEntityUpdates$ = this.actions$.pipe( @@ -230,10 +230,9 @@ export class UsersRolesEffects { private createActionObs(action: ChangeUserRole): Observable { return entityCatalog.getEntity(action) - .getEntityMonitor( - this.store, - action.guid - ).getUpdatingSection(action.updatingKey).pipe( + .store + .getEntityMonitor(action.guid) + .getUpdatingSection(action.updatingKey).pipe( pairwise(), filter(([oldUpdate, newUpdate]) => !!oldUpdate.busy && !newUpdate.busy), map(([, newUpdate]) => newUpdate), diff --git a/src/frontend/packages/store/src/entity-catalog-test.module.ts b/src/frontend/packages/store/src/entity-catalog-test.module.ts index db4da3027c..83df6de2b1 100644 --- a/src/frontend/packages/store/src/entity-catalog-test.module.ts +++ b/src/frontend/packages/store/src/entity-catalog-test.module.ts @@ -1,13 +1,11 @@ import { Inject, NgModule } from '@angular/core'; import { ReducerManager, Store } from '@ngrx/store'; -import { - requestDataReducerFactory, -} from './reducers/api-request-data-reducer/request-data-reducer.factory'; -import { chainApiReducers, requestActions } from './reducers/api-request-reducers.generator.helpers'; import { InitCatalogEntitiesAction } from './entity-catalog.actions'; -import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity'; -import { entityCatalog, TestEntityCatalog } from './entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from './entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { requestDataReducerFactory } from './reducers/api-request-data-reducer/request-data-reducer.factory'; +import { chainApiReducers, requestActions } from './reducers/api-request-reducers.generator.helpers'; export const TEST_CATALOGUE_ENTITIES = '__TEST_CATALOGUE_ENTITIES__'; diff --git a/src/frontend/packages/store/src/entity-catalog.actions.ts b/src/frontend/packages/store/src/entity-catalog.actions.ts index 408b40a8f9..fdc7936cf0 100644 --- a/src/frontend/packages/store/src/entity-catalog.actions.ts +++ b/src/frontend/packages/store/src/entity-catalog.actions.ts @@ -1,6 +1,7 @@ -import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity'; import { Action } from '@ngrx/store'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; + export class InitCatalogEntitiesAction implements Action { static ACTION_TYPE = '@stratos/add-catalog-entities'; public type = InitCatalogEntitiesAction.ACTION_TYPE; diff --git a/src/frontend/packages/store/src/entity-catalog.module.ts b/src/frontend/packages/store/src/entity-catalog.module.ts index ce1830c9af..25982e2653 100644 --- a/src/frontend/packages/store/src/entity-catalog.module.ts +++ b/src/frontend/packages/store/src/entity-catalog.module.ts @@ -2,8 +2,8 @@ import { Inject, ModuleWithProviders, NgModule } from '@angular/core'; import { ReducerManager, Store } from '@ngrx/store'; import { InitCatalogEntitiesAction } from './entity-catalog.actions'; -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 { requestDataReducerFactory } from './reducers/api-request-data-reducer/request-data-reducer.factory'; import { chainApiReducers, requestActions } from './reducers/api-request-reducers.generator.helpers'; diff --git a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts b/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts index ed0cb38c8c..38572f044d 100644 --- a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts +++ b/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts @@ -1,124 +1,125 @@ -import { Action } from '@ngrx/store'; +// import { Action } from '@ngrx/store'; -import { EntityRequestAction } from '../../types/request.types'; -import { ActionOrchestrator, OrchestratedActionBuilders } from '../action-orchestrator/action-orchestrator'; -import { getPaginationAction, getRequestAction } from '../action-orchestrator/action-orchestrator.spec.helpers'; -import { EntityActionDispatcherManager } from './action-dispatcher'; +// import { EntityRequestAction } from '../../types/request.types'; +// import { ActionOrchestrator, OrchestratedActionBuilders } from '../action-orchestrator/action-orchestrator'; +// import { getPaginationAction, getRequestAction } from '../action-orchestrator/action-orchestrator.spec.helpers'; +// import { EntityActionDispatcherManager } from './action-dispatcher'; -function actionDispatcher(action: Action) { - // noop -} +// function actionDispatcher(action: Action) { +// // noop +// } -describe('ActionDispatcher', () => { - it('should not dispatch unknown action', () => { - const actionOrchestrator = new ActionOrchestrator('Empty'); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.getActionDispatcher('get').dispatch('1', '2')).toBe(false); - }); - it('should dispatch custom action', () => { - interface CustomOrchestratedActionBuilders extends OrchestratedActionBuilders { - custom: (guid: string) => EntityRequestAction; - } - const actionBuilders = { - custom: guid => getRequestAction(), - customAarb: guid => getRequestAction(), - get: guid => getRequestAction() - } as CustomOrchestratedActionBuilders; - const data = 'adsd'; - const data2 = 'adsd2'; - const spy = spyOn(actionBuilders, 'custom'); - const actionOrchestrator = new ActionOrchestrator('Custom', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - // By getting action dispatcher - const dipatcher = entityActionDispatcher.getActionDispatcher('custom'); - const dipatcher2 = entityActionDispatcher.getActionDispatcher('customAarb'); - expect(entityActionDispatcher.getActionDispatcher('custom').dispatch(data)).toBe(true); - expect(spy).toHaveBeenCalledWith(data); - expect(entityActionDispatcher.getActionDispatcher('customAarb').dispatch(data)).toBe(true); - // By dispatching action directly - expect(entityActionDispatcher.dispatchAction('custom', data2)).toBe(true); - expect(spy).toHaveBeenCalledWith(data2); - }); +// TODO: RC Update tests +// describe('ActionDispatcher', () => { +// it('should not dispatch unknown action', () => { +// const actionOrchestrator = new ActionOrchestrator('Empty'); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.getActionDispatcher('get').dispatch('1', '2')).toBe(false); +// }); +// it('should dispatch custom action', () => { +// interface CustomOrchestratedActionBuilders extends OrchestratedActionBuilders { +// custom: (guid: string) => EntityRequestAction; +// } +// const actionBuilders = { +// custom: guid => getRequestAction(), +// customAarb: guid => getRequestAction(), +// get: guid => getRequestAction() +// } as CustomOrchestratedActionBuilders; +// const data = 'adsd'; +// const data2 = 'adsd2'; +// const spy = spyOn(actionBuilders, 'custom'); +// const actionOrchestrator = new ActionOrchestrator('Custom', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// // By getting action dispatcher +// const dipatcher = entityActionDispatcher.getActionDispatcher('custom'); +// const dipatcher2 = entityActionDispatcher.getActionDispatcher('customAarb'); +// expect(entityActionDispatcher.getActionDispatcher('custom').dispatch(data)).toBe(true); +// expect(spy).toHaveBeenCalledWith(data); +// expect(entityActionDispatcher.getActionDispatcher('customAarb').dispatch(data)).toBe(true); +// // By dispatching action directly +// expect(entityActionDispatcher.dispatchAction('custom', data2)).toBe(true); +// expect(spy).toHaveBeenCalledWith(data2); +// }); - it('should dispatch get action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const guid = 'guid'; - const endpointGuid = 'guid'; - const actionBuilders = { - get: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'get'); - const actionOrchestrator = new ActionOrchestrator('get', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchGet(guid, endpointGuid)).toBe(true); - expect(spy).toHaveBeenCalledWith(guid, endpointGuid); - }); +// it('should dispatch get action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const guid = 'guid'; +// const endpointGuid = 'guid'; +// const actionBuilders = { +// get: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'get'); +// const actionOrchestrator = new ActionOrchestrator('get', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchGet(guid, endpointGuid)).toBe(true); +// expect(spy).toHaveBeenCalledWith(guid, endpointGuid); +// }); - it('should dispatch delete action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const guid = 'guid'; - const endpointGuid = 'guid'; - const actionBuilders = { - delete: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'delete'); - const actionOrchestrator = new ActionOrchestrator('delete', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchDelete(guid, endpointGuid)).toBe(true); - expect(spy).toHaveBeenCalledWith(guid, endpointGuid); - }); +// it('should dispatch delete action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const guid = 'guid'; +// const endpointGuid = 'guid'; +// const actionBuilders = { +// delete: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'delete'); +// const actionOrchestrator = new ActionOrchestrator('delete', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchDelete(guid, endpointGuid)).toBe(true); +// expect(spy).toHaveBeenCalledWith(guid, endpointGuid); +// }); - it('should dispatch update action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const guid = 'guid'; - const endpointGuid = 'guid'; - const arbData = { arb: true }; - const actionBuilders = { - update: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'update'); - const actionOrchestrator = new ActionOrchestrator('update', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchUpdate(guid, endpointGuid, arbData)).toBe(true); - expect(spy).toHaveBeenCalledWith(guid, endpointGuid, arbData); - }); +// it('should dispatch update action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const guid = 'guid'; +// const endpointGuid = 'guid'; +// const arbData = { arb: true }; +// const actionBuilders = { +// update: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'update'); +// const actionOrchestrator = new ActionOrchestrator('update', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchUpdate(guid, endpointGuid, arbData)).toBe(true); +// expect(spy).toHaveBeenCalledWith(guid, endpointGuid, arbData); +// }); - it('should dispatch create action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const endpointGuid = 'guid'; - const aString = 'stringy'; - const actionBuilders = { - create: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'create'); - const actionOrchestrator = new ActionOrchestrator('create', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchCreate(endpointGuid, aString)).toBe(true); - expect(spy).toHaveBeenCalledWith(endpointGuid, aString); - }); +// it('should dispatch create action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const endpointGuid = 'guid'; +// const aString = 'stringy'; +// const actionBuilders = { +// create: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'create'); +// const actionOrchestrator = new ActionOrchestrator('create', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchCreate(endpointGuid, aString)).toBe(true); +// expect(spy).toHaveBeenCalledWith(endpointGuid, aString); +// }); - it('should dispatch getMultiple action', () => { - function getActionBuilder() { - return getPaginationAction(); - } +// it('should dispatch getMultiple action', () => { +// function getActionBuilder() { +// return getPaginationAction(); +// } - const actionBuilders = { - getMultiple: getActionBuilder - } as OrchestratedActionBuilders; - const endpointGuid = 'guid'; - const paginationKey = 'pagKey'; - const spy = spyOn(actionBuilders, 'getMultiple'); - const actionOrchestrator = new ActionOrchestrator('getMultiple', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchGetMultiple(endpointGuid, paginationKey)).toBe(true); - expect(spy).toHaveBeenCalledWith(endpointGuid, paginationKey); - }); -}); +// const actionBuilders = { +// getMultiple: getActionBuilder +// } as OrchestratedActionBuilders; +// const endpointGuid = 'guid'; +// const paginationKey = 'pagKey'; +// const spy = spyOn(actionBuilders, 'getMultiple'); +// const actionOrchestrator = new ActionOrchestrator('getMultiple', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchGetMultiple(endpointGuid, paginationKey)).toBe(true); +// expect(spy).toHaveBeenCalledWith(endpointGuid, paginationKey); +// }); +// }); diff --git a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts b/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts deleted file mode 100644 index a4c6b9fba4..0000000000 --- a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Action, Store } from '@ngrx/store'; - -import { AppState } from '../../app-state'; -import { - ActionOrchestrator, - OrchestratedActionBuilder, - OrchestratedActionBuilders, -} from '../action-orchestrator/action-orchestrator'; - -type ActionDispatcher = (action: Action) => void; -export class EntityActionDispatcher< - T extends OrchestratedActionBuilder = - OrchestratedActionBuilder, - > { - - private static STORE: Store; - static initialize(store: Store) { - EntityActionDispatcher.STORE = store; - } - - constructor( - private actionDispatcher?: ActionDispatcher, - private actionBuilder?: T | ((...args: Parameters) => ReturnType) - ) { } - public dispatch(...args: Parameters) { - if (this.actionBuilder) { - const action = this.actionBuilder(...args); - if (this.actionDispatcher) { - this.actionDispatcher(action); - } else if (EntityActionDispatcher.STORE && EntityActionDispatcher.STORE.dispatch) { - EntityActionDispatcher.STORE.dispatch(action); - } else { - console.error('Failed to find dispatcher: ', this.actionBuilder); - return false; - } - return true; - } - return false; - } -} -export class EntityActionDispatcherManager { - constructor(private actionDispatcher: (action: Action) => void, private actionOrchestrator: ActionOrchestrator) { } - - public getActionDispatcher(actionType: Y) { - const actionBuilder = this.getActionBuilder(actionType); - return new EntityActionDispatcher( - this.actionDispatcher, - actionBuilder - ); - } - - public getActionBuilder(actionType: Y) { - return this.actionOrchestrator.getActionBuilder(actionType); - } - - public dispatchGet(...args: Parameters) { - return this.getActionDispatcher('get').dispatch(...args); - } - - public dispatchDelete(...args: Parameters) { - return this.getActionDispatcher('delete').dispatch(...args); - } - - public dispatchUpdate(...args: Parameters) { - return this.getActionDispatcher('update').dispatch(...args); - } - - public dispatchCreate(...args: Parameters) { - return this.getActionDispatcher('create').dispatch(...args); - } - - public dispatchGetMultiple(...args: Parameters) { - return this.getActionDispatcher('getMultiple').dispatch(...args); - } - - public dispatchAction(actionType: K, ...args: Parameters) { - return this.getActionDispatcher(actionType).dispatch(...args); - } -} diff --git a/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts b/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts index 7bdb21e3b8..f6eb1bf5d3 100644 --- a/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts +++ b/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts @@ -4,8 +4,6 @@ import { Action } from '@ngrx/store'; import { EntitySchema } from '../../helpers/entity-schema'; import { PaginatedAction } from '../../types/pagination.types'; import { EntityRequestAction, StartAction } from '../../types/request.types'; -import { Omit } from '../../../../core/src/core/utils.service'; -import { EntityActionDispatcherManager } from '../action-dispatcher/action-dispatcher'; export interface ActionBuilderAction extends EntityRequestAction { actionBuilderActionType: string; @@ -23,7 +21,7 @@ export type KnownEntityActionBuilder< > = (guid: string, endpointGuid: string, extraArgs?: T) => EntityRequestAction; // createTrackingId should be unique to the thing that's being created. // It is used to track the status of the entity creation. -type CreateActionBuilder< +export type CreateActionBuilder< T extends Record = Record > = (createTrackingId: string, endpointGuid: string, extraArgs?: T) => EntityRequestAction; // paginationKey could be optional, we could give it a default value. @@ -156,14 +154,22 @@ export class BasePaginationRequestAction extends BasePipelineRequestAction imple } } - -// A list of functions that can be used get interface with the entity -export interface OrchestratedActionBuilders { +/** + * Collection of common types of actions that should be associated with an entity. + * Generic code will make use of get and getMultiple + */ +export interface OrchestratedActionCoreBuilders { get?: KnownEntityActionBuilder; remove?: KnownEntityActionBuilder; update?: KnownEntityActionBuilder; create?: CreateActionBuilder; getMultiple?: GetMultipleActionBuilder; +} + +/** + * Generic interface for functions that create actions for an entity + */ +export interface OrchestratedActionBuilders extends OrchestratedActionCoreBuilders { [actionType: string]: OrchestratedActionBuilder; } @@ -178,14 +184,8 @@ export interface OrchestratedActionBuilderConfig { PaginationRequestActionConfig; } -export class OrchestratedActionBuildersClass implements OrchestratedActionBuilders { - [actionType: string]: OrchestratedActionBuilder; -} export class ActionOrchestrator { - public getEntityActionDispatcher(actionDispatcher?: (action: Action) => void) { - return new EntityActionDispatcherManager(actionDispatcher, this); - } public getActionBuilder(actionType: Y) { const actionBuilderForType = this.actionBuilders[actionType]; if (!actionBuilderForType) { diff --git a/src/frontend/packages/store/src/entity-catalog/action-builder-config.mapper.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/action-builder-config.mapper.ts similarity index 94% rename from src/frontend/packages/store/src/entity-catalog/action-builder-config.mapper.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/action-builder-config.mapper.ts index 0648298774..cb22364ae8 100644 --- a/src/frontend/packages/store/src/entity-catalog/action-builder-config.mapper.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/action-builder-config.mapper.ts @@ -1,4 +1,4 @@ -import { EntitySchema } from '../helpers/entity-schema'; +import { EntitySchema } from '../../helpers/entity-schema'; import { BaseEntityRequestAction, BaseEntityRequestConfig, @@ -10,7 +10,7 @@ import { OrchestratedActionBuilderConfig, OrchestratedActionBuilders, PaginationRequestActionConfig, -} from './action-orchestrator/action-orchestrator'; +} from '../action-orchestrator/action-orchestrator'; export class ActionBuilderConfigMapper { @@ -49,7 +49,9 @@ export class ActionBuilderConfigMapper { schemaGetter: (schemaKey: string) => EntitySchema ): OrchestratedActionBuilder { if (configOrBuilder instanceof EntityRequestActionConfig) { - return (...args: Parameters) => { + return ( + ...args: Parameters + ) => { const [guid, endpointGuid, ...meta] = args; return new BaseEntityRequestAction( schemaGetter(configOrBuilder.schemaKey), diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts new file mode 100644 index 0000000000..6e79f49192 --- /dev/null +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts @@ -0,0 +1,222 @@ +import { Observable } from 'rxjs'; + +import { EntityService } from '../../entity-service'; +import { EntitySchema } from '../../helpers/entity-schema'; +import { EntityMonitor } from '../../monitors/entity-monitor'; +import { PaginationMonitor } from '../../monitors/pagination-monitor'; +import { ListActionState, RequestInfoState } from '../../reducers/api-request-reducer/types'; +import { PaginationObservables } from '../../reducers/pagination-reducer/pagination-reducer.types'; +import { isPaginatedAction, PaginatedAction } from '../../types/pagination.types'; +import { EntityRequestAction, RequestAction } from '../../types/request.types'; +import { + ActionOrchestrator, + OrchestratedActionBuilder, + OrchestratedActionBuilders, +} from '../action-orchestrator/action-orchestrator'; +import { EntityCatalogHelpers } from '../entity-catalog.helper'; +import { KnownActionBuilders } from './entity-catalog-entity'; +import { + CoreEntityCatalogEntityStore, + CustomEntityCatalogEntityStore, + EntityCatalogEntityStore, +} from './entity-catalog-entity.types'; + +type ActionDispatcher = ( + ...args: Parameters +) => Observable; + +export type ActionDispatchers = { + [K in keyof ABC]: ActionDispatcher +}; + +export class EntityCatalogEntityStoreHelpers { + + private static createEntityService( + actionBuilderKey: string, + action: any, + ): EntityService { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + if (isPaginatedAction(action)) { + throw new Error(`\`${actionBuilderKey}\` action is of type pagination`); + } + if (!action.guid) { + throw new Error(`\`${actionBuilderKey}\` action has no guid`); + } + return helper.esf.create( + action.guid, + action + ) + } + + private static createPaginationMonitor( + actionBuilderKey: string, + action: any, + ): PaginationMonitor { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + if (!isPaginatedAction(action)) { + throw new Error(`\`${actionBuilderKey}\` action is not of type pagination`); + } + const pAction = action as PaginatedAction; + return helper.pmf.create(pAction.paginationKey, pAction, pAction.flattenPagination); + } + + private static createPaginationService( + actionBuilderKey: string, + action: any, + ): PaginationObservables { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + if (!isPaginatedAction(action)) { + throw new Error(`\`${actionBuilderKey}\` action is not of type pagination`); + } + const pAction = action as PaginatedAction; + return helper.getPaginationObservables({ + store: helper.store, + action: pAction, + paginationMonitor: helper.pmf.create( + pAction.paginationKey, + pAction, + pAction.flattenPagination + ) + }, pAction.flattenPagination); + } + + static getActionDispatchers( + es: EntityCatalogEntityStore, + builders: ABC, + ): ActionDispatchers { + if (!builders) { + return {} as ActionDispatchers; + } + return Object.keys(builders).reduce((actionDispatchers, key) => ({ + ...actionDispatchers, + [key]: EntityCatalogEntityStoreHelpers.getActionDispatcher( + es, + builders[key], + key + ) + }), {} as ActionDispatchers); + } + + private static getActionDispatcher( + es: CoreEntityCatalogEntityStore, + builder: OrchestratedActionBuilder, + actionKey: string, + ): ActionDispatcher { + return ( + ...args: Parameters): Observable => { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + + const action = builder(...args); + helper.store.dispatch(action); + if (isPaginatedAction(action)) { + return es[actionKey].getPaginationMonitor( + ...args + ).currentPageState$; + } + const rAction = action as RequestAction; + const schema = rAction.entity ? rAction.entity[0] || rAction.entity : null; + const schemaKey = schema ? schema.schemaKey : null; + + if (!rAction.guid) { + throw new Error(`\`${actionKey}\` action has no guid`); + } + + return es.getEntityMonitor( + rAction.guid, + { + schemaKey, + startWithNull: false + } + ).entityRequest$ as unknown as Observable; + }; + } + + static createCoreStore( + actionOrchestrator: ActionOrchestrator, + entityKey: string, + getSchema: (schema: string) => EntitySchema + ): CoreEntityCatalogEntityStore { + return { + getEntityMonitor: ( + entityId: string, + params = { + schemaKey: '', + startWithNull: false + } + ): EntityMonitor => + new EntityMonitor(EntityCatalogHelpers.GetEntityCatalogEntityHelper().store, entityId, entityKey, getSchema(params.schemaKey), params.startWithNull) + , + getEntityService: ( + ...args: Parameters + ): EntityService => { + const actionBuilder = actionOrchestrator.getActionBuilder('get'); + if (!actionBuilder) { + throw new Error(`\`get\` action builder not implemented for ${entityKey}`); + } + return EntityCatalogEntityStoreHelpers.createEntityService('get', actionBuilder(...args)) + }, + getPaginationMonitor: ( + ...args: Parameters + ) => { + const actionBuilder = actionOrchestrator.getActionBuilder('getMultiple'); + if (!actionBuilder) { + throw new Error(`\`get\` action builder not implemented for ${entityKey}`); + } + return EntityCatalogEntityStoreHelpers.createPaginationMonitor('getMultiple', actionBuilder(...args)); + }, + getPaginationService: ( + ...args: Parameters + ) => { + const actionBuilder = actionOrchestrator.getActionBuilder('getMultiple'); + if (!actionBuilder) { + throw new Error(`\`get\` action builder not implemented for ${entityKey}`); + } + return EntityCatalogEntityStoreHelpers.createPaginationService('getMultiple', actionBuilder(...args)); + }, + }; + } + + static getPaginationStore( + builders: KnownActionBuilders, + entityKey: string, + getSchema: (schema: string) => EntitySchema + ): CustomEntityCatalogEntityStore { + if (!builders) { + return {} as CustomEntityCatalogEntityStore; + } + return Object.keys(builders).reduce((entityInstances, key) => { + // This isn't smart like the PaginationBuilders type. Here key will be all properties from an action builder (get, getMultiple, etc) + // which will be available from the dev console. Attempting to use in code pre-transpile will result in error + return { + ...entityInstances, + [key]: { + getEntityMonitor: ( + startWithNull: boolean, + ...args: any + ): EntityMonitor => { + const action: EntityRequestAction = builders[key](...args); + if (isPaginatedAction(action)) { + throw new Error(`\`${key}\` action is of type pagination`); + } + return new EntityMonitor( + EntityCatalogHelpers.GetEntityCatalogEntityHelper().store, + action.guid, + entityKey, + getSchema(action.schemaKey), + startWithNull + ) + }, + getEntityService: ( + ...args: any + ): EntityService => EntityCatalogEntityStoreHelpers.createEntityService(key, builders[key](...args)), + getPaginationMonitor: ( + ...args: any + ): PaginationMonitor => EntityCatalogEntityStoreHelpers.createPaginationMonitor(key, builders[key](...args)), + getPaginationService: ( + ...args: any + ): PaginationObservables => EntityCatalogEntityStoreHelpers.createPaginationService(key, builders[key](...args)) + } + }; + }, {} as CustomEntityCatalogEntityStore); + } +} \ No newline at end of file diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.ts similarity index 80% rename from src/frontend/packages/store/src/entity-catalog/entity-catalog-entity.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.ts index 12d4cb43b9..adfc5469c2 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.ts @@ -1,26 +1,24 @@ -import { ActionReducer, Store } from '@ngrx/store'; +import { ActionReducer } from '@ngrx/store'; -import { endpointEntitySchema, STRATOS_ENDPOINT_TYPE } from '../../../core/src/base-entity-schemas'; -import { getFullEndpointApiUrl } from '../../../core/src/features/endpoints/endpoint-helpers'; -import { AppState, IRequestEntityTypeState } from '../app-state'; +import { endpointEntitySchema, STRATOS_ENDPOINT_TYPE } from '../../../../core/src/base-entity-schemas'; +import { KnownKeys, NonOptionalKeys } from '../../../../core/src/core/utils.service'; +import { getFullEndpointApiUrl } from '../../../../core/src/features/endpoints/endpoint-helpers'; +import { IRequestEntityTypeState } from '../../app-state'; import { PaginationPageIteratorConfig, -} from '../entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe'; -import { EntityPipelineEntity, stratosEndpointGuidKey } from '../entity-request-pipeline/pipeline.types'; -import { EntitySchema } from '../helpers/entity-schema'; -import { EntityMonitor } from '../monitors/entity-monitor'; -import { EndpointModel } from '../types/endpoint.types'; -import { APISuccessOrFailedAction, EntityRequestAction } from '../types/request.types'; -import { IEndpointFavMetadata } from '../types/user-favorites.types'; -import { ActionBuilderConfigMapper } from './action-builder-config.mapper'; -import { EntityActionDispatcherManager } from './action-dispatcher/action-dispatcher'; +} from '../../entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe'; +import { EntityPipelineEntity, stratosEndpointGuidKey } from '../../entity-request-pipeline/pipeline.types'; +import { EntitySchema } from '../../helpers/entity-schema'; +import { EndpointModel } from '../../types/endpoint.types'; +import { APISuccessOrFailedAction, EntityRequestAction } from '../../types/request.types'; +import { IEndpointFavMetadata } from '../../types/user-favorites.types'; import { ActionBuilderAction, ActionOrchestrator, OrchestratedActionBuilderConfig, OrchestratedActionBuilders, -} from './action-orchestrator/action-orchestrator'; -import { EntityCatalogHelpers } from './entity-catalog.helper'; +} from '../action-orchestrator/action-orchestrator'; +import { EntityCatalogHelpers } from '../entity-catalog.helper'; import { EntityCatalogSchemas, IEntityMetadata, @@ -29,12 +27,17 @@ import { IStratosEntityBuilder, IStratosEntityDefinition, StratosEndpointExtensionDefinition, -} from './entity-catalog.types'; +} from '../entity-catalog.types'; +import { ActionBuilderConfigMapper } from './action-builder-config.mapper'; +import { ActionDispatchers, EntityCatalogEntityStoreHelpers } from './entity-catalog-entity-store-helpers'; +import { EntityCatalogEntityStore } from './entity-catalog-entity.types'; + +export type KnownActionBuilders = Pick>>> export interface EntityCatalogBuilders< T extends IEntityMetadata = IEntityMetadata, Y = any, - AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders + AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders, > { entityBuilder?: IStratosEntityBuilder; // Allows extensions to modify entities data in the store via none API Effect or unrelated actions. @@ -49,15 +52,9 @@ export class StratosBaseCatalogEntity< Y = any, AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilderConfig, // This typing may cause an issue down the line. - ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders + ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders, > { - public readonly entityKey: string; - public readonly type: string; - public readonly definition: DefinitionTypes; - public readonly isEndpoint: boolean; - public readonly actionDispatchManager: EntityActionDispatcherManager; - public readonly actionOrchestrator: ActionOrchestrator; - public readonly endpointType: string; + constructor( definition: IStratosEntityDefinition | IStratosEndpointDefinition | IStratosBaseEntityDefinition, public readonly builders: EntityCatalogBuilders = {} @@ -77,10 +74,51 @@ export class StratosBaseCatalogEntity< this.type, (schemaKey: string) => this.getSchema(schemaKey) ); + + this.actions = actionBuilders as KnownActionBuilders; + this.actionOrchestrator = new ActionOrchestrator(this.entityKey, actionBuilders as ABC); - this.actionDispatchManager = this.actionOrchestrator.getEntityActionDispatcher(); + + this.store = { + ...EntityCatalogEntityStoreHelpers.createCoreStore( + this.actionOrchestrator, + this.entityKey, + Object.bind(this.getSchema, this) + ), + ...EntityCatalogEntityStoreHelpers.getPaginationStore( + this.actions, + this.entityKey, + Object.bind(this.getSchema, this) + ) + } as EntityCatalogEntityStore; // TODO: RC investigate more + this.api = EntityCatalogEntityStoreHelpers.getActionDispatchers( + this.store, + actionBuilders as ABC + ); } + + /** + * Create actions specific to the entity type + */ + public readonly actions: KnownActionBuilders; + /** + * Create and dispatch actions specific to the entity type. Response will provide an observable reporting entity or pagination state + */ + public readonly api: ActionDispatchers>; + /** + * Monitor an entity or collection of entities. Services will fetch the entity/entities if missing, monitors will not + */ + public readonly store: EntityCatalogEntityStore; + + + public readonly entityKey: string; + public readonly type: string; + public readonly definition: DefinitionTypes; + public readonly isEndpoint: boolean; + public readonly actionOrchestrator: ActionOrchestrator; + public readonly endpointType: string; + private populateEntitySchemaKey(entitySchemas: EntityCatalogSchemas): EntityCatalogSchemas { return Object.keys(entitySchemas).reduce((newSchema, schemaKey) => { if (schemaKey !== 'default') { @@ -145,17 +183,6 @@ export class StratosBaseCatalogEntity< return entity[stratosEndpointGuidKey]; } - public getEntityMonitor( - store: Store, - entityId: string, - { - schemaKey = '', - startWithNull = false - } = {} - ) { - return new EntityMonitor(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; @@ -229,8 +256,8 @@ 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, @@ -284,3 +311,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 ABC]: { + 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 ABC]: { + 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..c65c640779 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 as EntityCatalogEntityHelper } 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: EntityCatalogEntityHelper; + static SetEntityCatalogEntityHelper(ecf: EntityCatalogEntityHelper) { + this.Instance = ecf; + } + static GetEntityCatalogEntityHelper(): EntityCatalogEntityHelper { + 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..09277100b9 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 @@ -2,7 +2,6 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { EndpointAuthTypeConfig } from '../../../core/src/core/extension/extension-types'; -import { Omit } from '../../../core/src/core/utils.service'; import { StratosStatus } from '../../../core/src/shared/shared.types'; import { GeneralEntityAppState } from '../app-state'; import { 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..163ec04dc5 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'; 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..4ae26e792a 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,12 +2,12 @@ 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, 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'; 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..cbc69245b2 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 @@ -5,7 +5,7 @@ import { 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'; 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..42e02864b6 100644 --- a/src/frontend/packages/store/src/entity-service-factory.service.ts +++ b/src/frontend/packages/store/src/entity-service-factory.service.ts @@ -4,7 +4,7 @@ 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'; 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..f138ed1e40 100644 --- a/src/frontend/packages/store/src/entity-service.ts +++ b/src/frontend/packages/store/src/entity-service.ts @@ -4,14 +4,14 @@ import { combineLatest, Observable } from 'rxjs'; import { filter, first, map, publishReplay, refCount, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { GeneralEntityAppState } from './app-state'; +import { entityCatalog } from './entity-catalog/entity-catalog'; +import { EntityActionBuilderEntityConfig } from './entity-catalog/entity-catalog.types'; import { ActionDispatcher } 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 { 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__'; @@ -25,7 +25,6 @@ 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) => { 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 03e06a4d68..84dd3e5080 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/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..8ab5be4e86 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 @@ -6,7 +6,7 @@ import { requestReducerFactory } from './api-request-reducer/request-reducer.fac 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 { entityCatalog } from '../entity-catalog/entity-catalog'; import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; /** 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-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..2153fec07a 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 @@ -18,7 +18,7 @@ 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 +28,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 = {}; @@ -306,14 +289,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.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/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/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/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: [ From cf9e658937e05648c51e9e62570e29cea380d291 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Thu, 30 Apr 2020 15:44:58 +0100 Subject: [PATCH 038/176] Fix disabling of polling - fixes #4244 --- .../user-profile/profile-info/profile-info.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html b/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html index 0eca5d5d7d..c08c7704c5 100644 --- a/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html +++ b/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html @@ -86,7 +86,7 @@

User Profile

[ngClass]="{'user-profile__option-warning': pollingEnabled === 'false'}">