From 2ec546820f22615e1a4903b8c6469a16911a25df Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Tue, 10 Dec 2019 11:35:56 +0100 Subject: [PATCH 01/84] build(dep): `@babylonjs` & `@types/node`: - @babylonjs:4.1.0-beta.9 - @types/node:12.12.16 --- package.json | 10 +++--- yarn.lock | 98 ++++++++++++++++++++++++++-------------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index f07b02f3..46a607f2 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ "@angular/platform-browser": "8.2.14", "@angular/platform-browser-dynamic": "8.2.14", "@angular/router": "8.2.14", - "@babylonjs/core": "4.1.0-beta.3", - "@babylonjs/materials": "4.1.0-beta.3", + "@babylonjs/core": "4.1.0-beta.9", + "@babylonjs/materials": "4.1.0-beta.9", "@ngrx/store": "8.5.2", "@nrwl/angular": "8.9.0", "core-js": "3.4.8", @@ -59,15 +59,15 @@ "@angular/cli": "8.3.20", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", - "@babylonjs/inspector": "4.1.0-beta.3", + "@babylonjs/inspector": "4.1.0-beta.9", "@nrwl/cypress": "8.9.0", "@nrwl/jest": "8.9.0", "@nrwl/node": "8.9.0", "@nrwl/workspace": "8.9.0", "@types/benchmark": "1.0.31", "@types/jest": "24.0.23", - "@types/node": "12.12.14", - "babylonjs": "4.1.0-beta.3", + "@types/node": "12.12.16", + "babylonjs": "4.1.0-beta.9", "benchmark": "2.1.4", "codelyzer": "5.2.0", "cypress": "3.7.0", diff --git a/yarn.lock b/yarn.lock index bfaa5e9b..d0046519 100644 --- a/yarn.lock +++ b/yarn.lock @@ -914,58 +914,58 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babylonjs/core@4.1.0-beta.3": - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.3.tgz#7020ad6c3ef4a891f305ba337e6bc4dc49338f14" - integrity sha512-ibHPUfGlRRtmh6IezCpXutvfnxL4/iW3oHV/M/92m47mZApBsQWmLCrLsN3C4W+fbSWJqCw9fggBdrOzThLRpA== +"@babylonjs/core@4.1.0-beta.9": + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.9.tgz#e77c3ddde0354b305aab0f234a7c4901914c8ae4" + integrity sha512-8jluf2f0ip+abcWNZn01eONB4joFR2lFWbpIk6L4x9lu/H5eENUT4WKqJ+1zFSKz2mWi0VJBu2snojC+I6JRKw== dependencies: tslib "^1.10.0" -"@babylonjs/gui@4.1.0-beta.3": - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.3.tgz#35d22696753562fcfb09c51582fca4e3be6569dc" - integrity sha512-YYXfrtIhSLpCN5P6hYH06+2gy4m3k/PsYqW9lbgCrzihCqBJ78JiymIbnq5+SeylbyHYsXbnlyMTkUw0lyRjiw== +"@babylonjs/gui@4.1.0-beta.9": + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.9.tgz#7668b1b6a04e952e40a9d2b0ecab8742cf7e7e1e" + integrity sha512-bm3Bq+Ldy+n1jIkBCg/4cCxGV0zJe6uGQ2wLxtMqL2xVgBDO6rIdLCZBEFMeAjs/18d0ceNeONk8kLhVEtiLSQ== dependencies: - "@babylonjs/core" "4.1.0-beta.3" + "@babylonjs/core" "4.1.0-beta.9" tslib "^1.10.0" -"@babylonjs/inspector@4.1.0-beta.3": - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.3.tgz#c9b60c69ee5f1f28eaa921473665e924ec2c07c4" - integrity sha512-eoZIWegmysN7EQVCvNzTsNLG1Ozz5kicI0UUJLTbwzJhOWC+6YXXlE0rlCXOXg6Bk5J8aRs40gdKJLSGG7RItQ== - dependencies: - "@babylonjs/core" "4.1.0-beta.3" - "@babylonjs/gui" "4.1.0-beta.3" - "@babylonjs/loaders" "4.1.0-beta.3" - "@babylonjs/materials" "4.1.0-beta.3" - "@babylonjs/serializers" "4.1.0-beta.3" - babylonjs-gltf2interface "4.1.0-beta.3" +"@babylonjs/inspector@4.1.0-beta.9": + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.9.tgz#dfd0ec78180dabe569bb16702f2dcef572557f40" + integrity sha512-6tT+rc3UMdKiNugYNAJxBP5Zza+2ABLgscCc5VG8rDGap0i6x/6aPoYEvZ0iGNQCrjvS66kd5/vVtCyoc+ISuQ== + dependencies: + "@babylonjs/core" "4.1.0-beta.9" + "@babylonjs/gui" "4.1.0-beta.9" + "@babylonjs/loaders" "4.1.0-beta.9" + "@babylonjs/materials" "4.1.0-beta.9" + "@babylonjs/serializers" "4.1.0-beta.9" + babylonjs-gltf2interface "4.1.0-beta.9" tslib "^1.10.0" -"@babylonjs/loaders@4.1.0-beta.3": - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.3.tgz#b391d2dab93a949a7d14bd341373794f91c35347" - integrity sha512-VmjEp+DfuVZYvJsfPDIwQz+WNFMk4sxNH5CnnUq9AnrYeqoagSiIkN2mLQJWKyU/bcH1UzN8VCPvjdfj9nte7w== +"@babylonjs/loaders@4.1.0-beta.9": + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.9.tgz#33582c15ec144403db2cf1e614ac4c26d11e185f" + integrity sha512-0QPDIzaAxe3UOK/vzz4EPrH90CGO8cYJS5ev74sySwsodTkEDCgcyBuGsJYNQic1yje2SWrcBUWfaVCm/8QcYA== dependencies: - "@babylonjs/core" "4.1.0-beta.3" - babylonjs-gltf2interface "4.1.0-beta.3" + "@babylonjs/core" "4.1.0-beta.9" + babylonjs-gltf2interface "4.1.0-beta.9" tslib "^1.10.0" -"@babylonjs/materials@4.1.0-beta.3": - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.3.tgz#b3aaacfb59a74ef52d745629219a30febc6fab5c" - integrity sha512-9R4QrwBvoFB7ER25+vo71eSJjT+2wReJ+BwZ2NEy/VRLYrSJ1E7RUNdZ1RfGnI9CZHbh4qBN2G3zFG0ycNjlcQ== +"@babylonjs/materials@4.1.0-beta.9": + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.9.tgz#4ca9601bdb61338f3b0dc874a5ccaff9a9b3a37c" + integrity sha512-NBYMHtgPSm2BZn9FcUgeb4eVJXForv4sR2gt6UKBdAUeA8AXoJc5fATQEwybEFwGMDafB1XFfP7bIxCBJy/jMg== dependencies: - "@babylonjs/core" "4.1.0-beta.3" + "@babylonjs/core" "4.1.0-beta.9" tslib "^1.10.0" -"@babylonjs/serializers@4.1.0-beta.3": - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.3.tgz#1966153ab7b11da1d1d13c2b63b3df3bf5d0701a" - integrity sha512-OR+YUiWrKSdibgBURa/VuRlle2Vgih2+dQ6ZKSdDZrxvtPcaKukwzzBw9GmIzIU6G377GPHJSQnTNQkBbllV2Q== +"@babylonjs/serializers@4.1.0-beta.9": + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.9.tgz#f92db8df538e0e823bf68a69c4a4f684a889b6bf" + integrity sha512-ai92CPa48Q1aUxfVN/bLIoTfWssPeEFojs2eTwox8CnipcI4Njl7qGyT9FQRoe1AvmGpn6GR4baXawj4WPQnpQ== dependencies: - "@babylonjs/core" "4.1.0-beta.3" - babylonjs-gltf2interface "4.1.0-beta.3" + "@babylonjs/core" "4.1.0-beta.9" + babylonjs-gltf2interface "4.1.0-beta.9" tslib "^1.10.0" "@cnakazawa/watch@^1.0.3": @@ -1422,10 +1422,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== -"@types/node@12.12.14": - version "12.12.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" - integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== +"@types/node@12.12.16": + version "12.12.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.16.tgz#3ebcbd7bf978fa4c5120fee8be57083271a8b3ac" + integrity sha512-vRuMyoOr5yfNf8QWxXegOjeyjpWJxFePzHzmBOIzDIzo+rSqF94RW0PkS6y4T2+VjAWLXHWrfbIJY3E3aS7lUw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2212,15 +2212,15 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -babylonjs-gltf2interface@4.1.0-beta.3: - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.3.tgz#58bf0542f90dec2bd3e9fcc825a5964af9d54c1b" - integrity sha512-4TNaZLr/l6H3Ib6OpX7qOfDMM8XMS0XBeH62NDm7FOKrSRRQww4ait0AqewHNhNfymakunLgRbO4nrlEf4tC/A== +babylonjs-gltf2interface@4.1.0-beta.9: + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.9.tgz#43238e5ac6b2d84554a9b99527fc626c160d0fce" + integrity sha512-aTsoK6cLBVguU5DlgBvRbiti4G5ItumbnYbLvcQr5IbG9xuPeca01N70QxTB1OWjNiGkq0+tlIqsrQg3J9xBgQ== -babylonjs@4.1.0-beta.3: - version "4.1.0-beta.3" - resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.3.tgz#34fb13ec6377419f50a0fe8f7d199b4a31b7e917" - integrity sha512-9C+AKJPWJmLN0azP5p4WwjsSA8YmEpUh52Tf/lD4OBOk2cBXHOk+LwYAxZAX8X98tAQvNjjw5uXeyNVVh+OYYw== +babylonjs@4.1.0-beta.9: + version "4.1.0-beta.9" + resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.9.tgz#1d2345ce0b17917383c31f64072fea8b89cbb94a" + integrity sha512-5B8+ESAc1WsdOjfml0Amm8SVdSeCLv6HFmcVxQZCE6ftNhNvN+UkN+OILTIZ9LvdPoslOntY/Ow7PNAyIZ/vSw== bail@^1.0.0: version "1.0.4" From 7d237f1cb0890156be1846efd47f51f352a3b3eb Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Tue, 10 Dec 2019 15:23:21 +0100 Subject: [PATCH 02/84] feat(apps/frontend): select initial tool --- apps/frontend/src/app/app.reducer.ts | 14 +++++++++++++- .../app/tools-panel/tools-panel.component.ts | 17 +++++++++++++---- .../src/app/tools-panel/tools-panel.module.ts | 3 ++- .../src/app/tools-panel/tools-panel.reducer.ts | 2 +- libs/ui/src/lib/toolbar/toolbar.component.ts | 4 +++- 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/apps/frontend/src/app/app.reducer.ts b/apps/frontend/src/app/app.reducer.ts index 27de3751..30f4789e 100644 --- a/apps/frontend/src/app/app.reducer.ts +++ b/apps/frontend/src/app/app.reducer.ts @@ -1,5 +1,5 @@ import { InjectionToken } from '@angular/core'; -import { Action, ActionReducer, ActionReducerMap, MetaReducer } from '@ngrx/store'; +import { Action, ActionReducer, ActionReducerMap, createFeatureSelector, createSelector, MetaReducer } from '@ngrx/store'; import { environment } from '../environments/environment'; import * as fromToolsPanel from './tools-panel/tools-panel.reducer'; @@ -44,3 +44,15 @@ export function logger(reducer: ActionReducer): ActionReducer { * that will be composed to form the root meta-reducer. */ export const metaReducers: MetaReducer[] = !environment.production ? [logger] : []; + +/** + * ToolsPanel reducers + */ +export const selectToolsPanelState = createFeatureSelector( + fromToolsPanel.toolsPanelFeatureKey, +); + +export const selectSelectedToolId = createSelector( + selectToolsPanelState, + fromToolsPanel.selectSelectedToolId, +); diff --git a/apps/frontend/src/app/tools-panel/tools-panel.component.ts b/apps/frontend/src/app/tools-panel/tools-panel.component.ts index 7a0206af..3c84f224 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.component.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.component.ts @@ -1,18 +1,25 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { Store } from '@ngrx/store'; +import { select, Store } from '@ngrx/store'; import { UiToolbarToolChange, UiToolbarToolConfig } from '@talus/ui'; +import { Observable } from 'rxjs'; +import * as fromApp from '../app.reducer'; import { Tool } from './tool.model'; import { selectTool } from './tools-panel.actions'; -import { State } from './tools-panel.reducer'; @Component({ selector: 'fe-tools-panel', template: ` - + `, changeDetection: ChangeDetectionStrategy.OnPush, }) export class ToolsPanelComponent { + private selectedToolId$: Observable; + tools: UiToolbarToolConfig[] = [ { icon: 'add_circle_outline', @@ -26,7 +33,9 @@ export class ToolsPanelComponent { }, ]; - constructor(private store: Store) {} + constructor(private store: Store) { + this.selectedToolId$ = store.pipe(select(fromApp.selectSelectedToolId)); + } onToolChange(event: UiToolbarToolChange): void { this.store.dispatch(selectTool({ id: event.value })); diff --git a/apps/frontend/src/app/tools-panel/tools-panel.module.ts b/apps/frontend/src/app/tools-panel/tools-panel.module.ts index 1b5030c6..55db8f76 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.module.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.module.ts @@ -1,10 +1,11 @@ +import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { ToolbarModule } from '@talus/ui'; import { ToolsPanelComponent } from './tools-panel.component'; @NgModule({ declarations: [ToolsPanelComponent], - imports: [ToolbarModule], + imports: [CommonModule, ToolbarModule], exports: [ToolsPanelComponent], }) export class ToolsPanelModule {} diff --git a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts index b83337ad..134e1293 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts @@ -23,4 +23,4 @@ export const reducer = createReducer( }), ); -export const getSelectedToolId = (state: State) => state.selectedToolId; +export const selectSelectedToolId = (state: State) => state.selectedToolId; diff --git a/libs/ui/src/lib/toolbar/toolbar.component.ts b/libs/ui/src/lib/toolbar/toolbar.component.ts index ae4a6063..68e2f341 100644 --- a/libs/ui/src/lib/toolbar/toolbar.component.ts +++ b/libs/ui/src/lib/toolbar/toolbar.component.ts @@ -14,7 +14,7 @@ export interface UiToolbarToolChange extends MatButtonToggleChange { @Component({ selector: ' ui-toolbar', template: ` - + extends MatButtonToggleChange { export class ToolbarComponent { @Input() tools: UiToolbarToolConfig[]; + @Input() selectedToolId: any; + @Output() toolChange = new EventEmitter>(); onChange(event: UiToolbarToolChange): void { From b9a2b8e34138959ce9522d8965ca6d909ee25567 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Tue, 10 Dec 2019 15:31:42 +0100 Subject: [PATCH 03/84] fix(apps/frontend): import hammerjs --- apps/frontend/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/main.ts b/apps/frontend/src/main.ts index 5e9d3d57..c23e64f8 100644 --- a/apps/frontend/src/main.ts +++ b/apps/frontend/src/main.ts @@ -1,6 +1,6 @@ import { enableProdMode, ViewEncapsulation } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - +import 'hammerjs'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; From 05ec1fa9b4073e7bb83426b9fca86cca88cc072b Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Tue, 10 Dec 2019 16:28:17 +0100 Subject: [PATCH 04/84] refactor(frontend): scene-viewer into container --- apps/frontend/src/app/app.component.spec.ts | 13 +++++-- apps/frontend/src/app/app.component.ts | 17 +-------- apps/frontend/src/app/app.module.ts | 5 +-- apps/frontend/src/app/app.reducer.ts | 9 ++++- .../src/app/scene-viewer-container/index.ts | 1 + .../scene-viewer-container.component.spec.ts | 36 +++++++++++++++++++ .../scene-viewer-container.component.ts | 25 +++++++++++++ .../scene-viewer-container.module.ts | 11 ++++++ .../tools-panel/tools-panel.component.spec.ts | 19 +++++++--- 9 files changed, 110 insertions(+), 26 deletions(-) create mode 100644 apps/frontend/src/app/scene-viewer-container/index.ts create mode 100644 apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts create mode 100644 apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts create mode 100644 apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts diff --git a/apps/frontend/src/app/app.component.spec.ts b/apps/frontend/src/app/app.component.spec.ts index 4c60af0d..4605e2a5 100644 --- a/apps/frontend/src/app/app.component.spec.ts +++ b/apps/frontend/src/app/app.component.spec.ts @@ -5,6 +5,13 @@ import { RouterTestingModule } from '@angular/router/testing'; import { SceneViewerTestModule, SidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; +@Component({ + selector: 'fe-scene-viewer-container', + template: '', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +class SceneViewerContainerStubComponent {} + @Component({ selector: 'fe-tools-panel', template: '', @@ -15,7 +22,7 @@ class ToolsPanelStubComponent {} describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [AppComponent, ToolsPanelStubComponent], + declarations: [AppComponent, SceneViewerContainerStubComponent, ToolsPanelStubComponent], imports: [ BrowserAnimationsModule, RouterTestingModule, @@ -43,6 +50,8 @@ describe('AppComponent', () => { const compiled = fixture.debugElement.nativeElement; expect(compiled.querySelector('ui-sidenav-shell-left > fe-tools-panel')).not.toBeNull(); - expect(compiled.querySelector('ui-sidenav-shell-content > ui-scene-viewer')).not.toBeNull(); + expect( + compiled.querySelector('ui-sidenav-shell-content > fe-scene-viewer-container'), + ).not.toBeNull(); }); }); diff --git a/apps/frontend/src/app/app.component.ts b/apps/frontend/src/app/app.component.ts index 7816bc19..a5ef2d16 100644 --- a/apps/frontend/src/app/app.component.ts +++ b/apps/frontend/src/app/app.component.ts @@ -1,7 +1,4 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; -// import '@babylonjs/core/Rendering/edgesRenderer'; -import '@babylonjs/core/Rendering/outlineRenderer'; @Component({ selector: 'fe-root', @@ -16,10 +13,7 @@ import '@babylonjs/core/Rendering/outlineRenderer'; - + `, @@ -27,13 +21,4 @@ import '@babylonjs/core/Rendering/outlineRenderer'; }) export class AppComponent { title = 'frontend'; - - onPointerPick(pointerEvent: PointerEvent): void { - console.log(pointerEvent.button); - } - - onMeshPick(mesh: AbstractMesh): void { - // mesh.edgesRenderer ? mesh.disableEdgesRendering() : mesh.enableEdgesRendering(); - mesh.renderOutline = !mesh.renderOutline; - } } diff --git a/apps/frontend/src/app/app.module.ts b/apps/frontend/src/app/app.module.ts index d21be000..2238a7d0 100644 --- a/apps/frontend/src/app/app.module.ts +++ b/apps/frontend/src/app/app.module.ts @@ -3,9 +3,10 @@ import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterModule } from '@angular/router'; import { StoreModule } from '@ngrx/store'; -import { SceneViewerModule, SidenavShellModule } from '@talus/ui'; +import { SidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; import { metaReducers, ROOT_REDUCERS } from './app.reducer'; +import { SceneViewerContainerModule } from './scene-viewer-container'; import { ToolsPanelModule } from './tools-panel/tools-panel.module'; @NgModule({ @@ -31,8 +32,8 @@ import { ToolsPanelModule } from './tools-panel/tools-panel.module'; }, }), + SceneViewerContainerModule, SidenavShellModule, - SceneViewerModule, ToolsPanelModule, ], providers: [], diff --git a/apps/frontend/src/app/app.reducer.ts b/apps/frontend/src/app/app.reducer.ts index 30f4789e..eae008a3 100644 --- a/apps/frontend/src/app/app.reducer.ts +++ b/apps/frontend/src/app/app.reducer.ts @@ -1,5 +1,12 @@ import { InjectionToken } from '@angular/core'; -import { Action, ActionReducer, ActionReducerMap, createFeatureSelector, createSelector, MetaReducer } from '@ngrx/store'; +import { + Action, + ActionReducer, + ActionReducerMap, + createFeatureSelector, + createSelector, + MetaReducer, +} from '@ngrx/store'; import { environment } from '../environments/environment'; import * as fromToolsPanel from './tools-panel/tools-panel.reducer'; diff --git a/apps/frontend/src/app/scene-viewer-container/index.ts b/apps/frontend/src/app/scene-viewer-container/index.ts new file mode 100644 index 00000000..d3c844a4 --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/index.ts @@ -0,0 +1 @@ +export { SceneViewerContainerModule } from './scene-viewer-container.module'; diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts new file mode 100644 index 00000000..b5a1d43c --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -0,0 +1,36 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SceneViewerContainerComponent } from './scene-viewer-container.component'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'ui-scene-viewer', + template: '', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +class SceneViewerStubComponent {} + +describe('SceneViewerContainerComponent', () => { + let component: SceneViewerContainerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SceneViewerContainerComponent, SceneViewerStubComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SceneViewerContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should render child component', () => { + fixture = TestBed.createComponent(SceneViewerContainerComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + + expect(compiled.querySelector('ui-scene-viewer')).not.toBeNull(); + }); +}); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts new file mode 100644 index 00000000..8708ff2b --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -0,0 +1,25 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; +// import '@babylonjs/core/Rendering/edgesRenderer'; +import '@babylonjs/core/Rendering/outlineRenderer'; + +@Component({ + selector: 'fe-scene-viewer-container', + template: ` + + `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SceneViewerContainerComponent { + onPointerPick(pointerEvent: PointerEvent): void { + console.log(pointerEvent.button); + } + + onMeshPick(mesh: AbstractMesh): void { + // mesh.edgesRenderer ? mesh.disableEdgesRendering() : mesh.enableEdgesRendering(); + mesh.renderOutline = !mesh.renderOutline; + } +} diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts new file mode 100644 index 00000000..6b7bf096 --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { SceneViewerModule } from '@talus/ui'; +import { SceneViewerContainerComponent } from './scene-viewer-container.component'; + +@NgModule({ + declarations: [SceneViewerContainerComponent], + imports: [CommonModule, SceneViewerModule], + exports: [SceneViewerContainerComponent], +}) +export class SceneViewerContainerModule {} diff --git a/apps/frontend/src/app/tools-panel/tools-panel.component.spec.ts b/apps/frontend/src/app/tools-panel/tools-panel.component.spec.ts index e917ccc1..8de556c9 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.component.spec.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.component.spec.ts @@ -1,9 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { Store } from '@ngrx/store'; -import { MockStore, provideMockStore } from '@ngrx/store/testing'; +import { Store, StoreModule } from '@ngrx/store'; +import { MockStore } from '@ngrx/store/testing'; +import { ROOT_REDUCERS, State } from '../app.reducer'; import { ToolsPanelComponent } from './tools-panel.component'; import { ToolsPanelModule } from './tools-panel.module'; -import { initialState, State } from './tools-panel.reducer'; describe('ToolsPanelComponent', () => { let component: ToolsPanelComponent; @@ -14,8 +14,17 @@ describe('ToolsPanelComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [], - imports: [ToolsPanelModule], - providers: [provideMockStore({ initialState })], + imports: [ + ToolsPanelModule, + StoreModule.forRoot(ROOT_REDUCERS, { + runtimeChecks: { + strictStateImmutability: true, + strictActionImmutability: true, + strictStateSerializability: true, + strictActionSerializability: true, + }, + }), + ], }).compileComponents(); store = TestBed.get>(Store); From b2bd8ad0562f09797419c1d528b76a95300a440a Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Tue, 10 Dec 2019 17:11:41 +0100 Subject: [PATCH 05/84] feat(frontend): dispatch `pointerPick` action --- .../app/scene-viewer-container/pointer-button.model.ts | 10 ++++++++++ .../scene-viewer-container.actions.ts | 7 +++++++ .../scene-viewer-container.component.ts | 7 ++++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 apps/frontend/src/app/scene-viewer-container/pointer-button.model.ts create mode 100644 apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts diff --git a/apps/frontend/src/app/scene-viewer-container/pointer-button.model.ts b/apps/frontend/src/app/scene-viewer-container/pointer-button.model.ts new file mode 100644 index 00000000..39afd4c3 --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/pointer-button.model.ts @@ -0,0 +1,10 @@ +/** + * https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button#Syntax + */ +export enum PointerButton { + Main = 0, // usually the left button or the un-initialized state + Auxiliary = 1, // usually the wheel button or the middle button (if present) + Secondary = 2, // usually the right button + Fourth = 3, // typically the Browser Back button + Fifth = 4, // typically the Browser Forward button +} diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts new file mode 100644 index 00000000..3604a4f3 --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts @@ -0,0 +1,7 @@ +import { createAction, props } from '@ngrx/store'; +import { PointerButton } from './pointer-button.model'; + +export const pointerPick = createAction( + '[SceneViewerContainer] Pointer pick', + props<{ pointerButton: PointerButton }>(), +); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index 8708ff2b..eecc78bc 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -2,6 +2,9 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; // import '@babylonjs/core/Rendering/edgesRenderer'; import '@babylonjs/core/Rendering/outlineRenderer'; +import { Store } from '@ngrx/store'; +import * as fromApp from '../app.reducer'; +import { pointerPick } from './scene-viewer-container.actions'; @Component({ selector: 'fe-scene-viewer-container', @@ -14,8 +17,10 @@ import '@babylonjs/core/Rendering/outlineRenderer'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class SceneViewerContainerComponent { + constructor(private store: Store) {} + onPointerPick(pointerEvent: PointerEvent): void { - console.log(pointerEvent.button); + this.store.dispatch(pointerPick({ pointerButton: pointerEvent.button })); } onMeshPick(mesh: AbstractMesh): void { From ceee0135bd1cc0bbc6652b9713998635255dfc98 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 11 Dec 2019 13:03:08 +0100 Subject: [PATCH 06/84] feat(frontend): dispatch `add|removeVoxel` action --- .../scene-viewer-container.actions.ts | 15 ++-- .../scene-viewer-container.component.spec.ts | 69 +++++++++++++++++-- .../scene-viewer-container.component.ts | 50 ++++++++++---- libs/ui/src/lib/scene-viewer/index.ts | 2 + .../ui/src/lib/scene-viewer/pointer-button.ts | 0 .../scene-viewer/scene-viewer.component.ts | 1 - .../lib/scene-viewer/scene-viewer.service.ts | 26 +++++-- libs/vdb/src/lib/math/coord.ts | 4 ++ 8 files changed, 140 insertions(+), 27 deletions(-) rename apps/frontend/src/app/scene-viewer-container/pointer-button.model.ts => libs/ui/src/lib/scene-viewer/pointer-button.ts (100%) diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts index 3604a4f3..350c0e51 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts @@ -1,7 +1,14 @@ import { createAction, props } from '@ngrx/store'; -import { PointerButton } from './pointer-button.model'; +import { Coord } from '@talus/vdb'; -export const pointerPick = createAction( - '[SceneViewerContainer] Pointer pick', - props<{ pointerButton: PointerButton }>(), +const actionTypePrefix = '[SceneViewerContainer]'; + +export const addVoxel = createAction( + `${actionTypePrefix} Add voxel`, + props<{ position: Coord; value: number }>(), +); + +export const removeVoxel = createAction( + `${actionTypePrefix} Remove voxel`, + props<{ position: Coord }>(), ); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index b5a1d43c..3f3da356 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -1,5 +1,13 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Output } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { MemoizedSelector, Store } from '@ngrx/store'; +import { MockStore, provideMockStore } from '@ngrx/store/testing'; +import { PointerButton, PointerPickInfo } from '@talus/ui'; +import { Subject } from 'rxjs'; +import * as fromApp from '../app.reducer'; +import { Tool } from '../tools-panel/tool.model'; +import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; import { SceneViewerContainerComponent } from './scene-viewer-container.component'; @Component({ @@ -8,29 +16,82 @@ import { SceneViewerContainerComponent } from './scene-viewer-container.componen template: '', changeDetection: ChangeDetectionStrategy.OnPush, }) -class SceneViewerStubComponent {} +class SceneViewerStubComponent { + @Output() pointerPick = new Subject(); +} describe('SceneViewerContainerComponent', () => { let component: SceneViewerContainerComponent; + let stubComponent: SceneViewerStubComponent; let fixture: ComponentFixture; + let mockStore: MockStore; + let mockSelectedToolIdSelector: MemoizedSelector; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [SceneViewerContainerComponent, SceneViewerStubComponent], + providers: [provideMockStore()], }).compileComponents(); + + mockStore = TestBed.get(Store); + spyOn(mockStore, 'dispatch'); + + mockSelectedToolIdSelector = mockStore.overrideSelector( + fromApp.selectSelectedToolId, + Tool.AddVoxel, + ); })); beforeEach(() => { fixture = TestBed.createComponent(SceneViewerContainerComponent); component = fixture.componentInstance; fixture.detectChanges(); + + stubComponent = fixture.debugElement.query(By.directive(SceneViewerStubComponent)) + .componentInstance; }); it('should render child component', () => { - fixture = TestBed.createComponent(SceneViewerContainerComponent); - fixture.detectChanges(); const compiled = fixture.debugElement.nativeElement; expect(compiled.querySelector('ui-scene-viewer')).not.toBeNull(); }); + + it('should dispatch no action if not PointerButton.Main', () => { + stubComponent.pointerPick.next({ + pickedPoint: [0, 0, 0], + pointerButton: PointerButton.Secondary, + normal: [0, 0, 0], + }); + + expect(mockStore.dispatch).not.toHaveBeenCalled(); + }); + + it('should dispatch `addVoxel` action', () => { + const action = addVoxel({ position: [1, 1, 2], value: 42 }); + + stubComponent.pointerPick.next({ + pickedPoint: [1, 1, 1], + pointerButton: PointerButton.Main, + normal: [0, 0, 1], + }); + + expect(mockStore.dispatch).toHaveBeenCalledWith(action); + }); + + it('should dispatch `removeVoxel` action', () => { + mockSelectedToolIdSelector.setResult(Tool.RemoveVoxel); + mockStore.refreshState(); + fixture.detectChanges(); + + const action = removeVoxel({ position: [1, 1, 1] }); + + stubComponent.pointerPick.next({ + pickedPoint: [1, 1, 1], + pointerButton: PointerButton.Main, + normal: [0, 0, 1], + }); + + expect(mockStore.dispatch).toHaveBeenCalledWith(action); + }); }); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index eecc78bc..0245d4e5 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -1,30 +1,56 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; // import '@babylonjs/core/Rendering/edgesRenderer'; -import '@babylonjs/core/Rendering/outlineRenderer'; -import { Store } from '@ngrx/store'; +// import '@babylonjs/core/Rendering/outlineRenderer'; +import { select, Store } from '@ngrx/store'; +import { PointerButton, PointerPickInfo } from '@talus/ui'; +import { add, Coord } from '@talus/vdb'; +import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; -import { pointerPick } from './scene-viewer-container.actions'; +import { Tool } from '../tools-panel/tool.model'; +import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; @Component({ selector: 'fe-scene-viewer-container', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, }) export class SceneViewerContainerComponent { - constructor(private store: Store) {} + private selectedToolId$: Observable; - onPointerPick(pointerEvent: PointerEvent): void { - this.store.dispatch(pointerPick({ pointerButton: pointerEvent.button })); + constructor(private store: Store) { + this.selectedToolId$ = store.pipe(select(fromApp.selectSelectedToolId)); } - onMeshPick(mesh: AbstractMesh): void { - // mesh.edgesRenderer ? mesh.disableEdgesRendering() : mesh.enableEdgesRendering(); - mesh.renderOutline = !mesh.renderOutline; + onPointerPick(event: PointerPickInfo, selectedToolId: Tool): void { + this.dispatchPickAction(event, selectedToolId); + } + + // onMeshPick(mesh: AbstractMesh): void { + // mesh.edgesRenderer ? mesh.disableEdgesRendering() : mesh.enableEdgesRendering(); + // mesh.renderOutline = !mesh.renderOutline; + // } + + private dispatchPickAction(pickInfo: PointerPickInfo, selectedToolId: Tool): void { + if (pickInfo.pointerButton !== PointerButton.Main) { + return; + } + + switch (selectedToolId) { + case Tool.AddVoxel: + this.store.dispatch(addVoxel({ position: this.calcNewVoxelPosition(pickInfo), value: 42 })); + break; + case Tool.RemoveVoxel: + this.store.dispatch(removeVoxel({ position: pickInfo.pickedPoint })); + break; + } + } + + private calcNewVoxelPosition(pickInfo: PointerPickInfo): Coord { + return add(pickInfo.pickedPoint, pickInfo.normal); } } diff --git a/libs/ui/src/lib/scene-viewer/index.ts b/libs/ui/src/lib/scene-viewer/index.ts index 98820898..1fe437f1 100644 --- a/libs/ui/src/lib/scene-viewer/index.ts +++ b/libs/ui/src/lib/scene-viewer/index.ts @@ -1,2 +1,4 @@ export * from './scene-viewer.module'; export * from './scene-viewer.module.testing'; +export { PointerButton } from './pointer-button'; +export { PointerPickInfo } from './scene-viewer.service'; diff --git a/apps/frontend/src/app/scene-viewer-container/pointer-button.model.ts b/libs/ui/src/lib/scene-viewer/pointer-button.ts similarity index 100% rename from apps/frontend/src/app/scene-viewer-container/pointer-button.model.ts rename to libs/ui/src/lib/scene-viewer/pointer-button.ts diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts index 6bdacd51..0abb3cdd 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts @@ -22,7 +22,6 @@ export class SceneViewerComponent implements OnInit { @ViewChild('canvas', { static: true }) canvas: ElementRef; @Output() pointerPick = this.sceneViewerService.pointerPick$; - @Output() meshPick = this.sceneViewerService.meshPick$; constructor(private sceneViewerService: SceneViewerService) {} diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index 894e48c4..9872137c 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -7,14 +7,14 @@ import { Engine } from '@babylonjs/core/Engines/engine'; import { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight'; import '@babylonjs/core/Materials/standardMaterial'; import { Vector3 } from '@babylonjs/core/Maths/math.vector'; -import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; import { Mesh } from '@babylonjs/core/Meshes/mesh'; import { VertexData } from '@babylonjs/core/Meshes/mesh.vertexData'; import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder'; import '@babylonjs/core/Physics/physicsHelper'; // Needed for `onPointerPick` import { Scene } from '@babylonjs/core/scene'; -import { Grid, gridToMesh } from '@talus/vdb'; +import { Coord, Grid, gridToMesh } from '@talus/vdb'; import { Subject } from 'rxjs'; +import { PointerButton } from './pointer-button'; @Injectable() export class EngineFactory { @@ -50,8 +50,7 @@ export class CameraFactory { export class SceneViewerService { scene: Scene; - pointerPick$ = new Subject(); - meshPick$ = new Subject(); + pointerPick$ = new Subject(); private engine: Engine; // @ts-ignore: noUnusedLocals @@ -111,8 +110,13 @@ export class SceneViewerService { private registerPointerPick(): void { this.scene.onPointerPick = (event: PointerEvent, pickInfo: PickingInfo): void => { - this.pointerPick$.next(event); - this.meshPick$.next(pickInfo.pickedMesh); + const info: PointerPickInfo = { + pickedPoint: vector3ToCoord(pickInfo.pickedPoint), + pointerButton: event.button, + normal: vector3ToCoord(pickInfo.getNormal()), + }; + + this.pointerPick$.next(info); }; } @@ -140,3 +144,13 @@ export class SceneViewerService { gridMesh.convertToFlatShadedMesh(); } } + +function vector3ToCoord(vector: Vector3): Coord { + return [vector.x, vector.y, vector.z]; +} + +export interface PointerPickInfo { + pickedPoint: Coord; + pointerButton: PointerButton; + normal: Coord; +} diff --git a/libs/vdb/src/lib/math/coord.ts b/libs/vdb/src/lib/math/coord.ts index cb979fa4..0001351f 100644 --- a/libs/vdb/src/lib/math/coord.ts +++ b/libs/vdb/src/lib/math/coord.ts @@ -13,6 +13,10 @@ export const Z = 2; export type Coord = [number, number, number]; +export function add(c1: Coord, c2: Coord): Coord { + return [c1[0] + c2[0], c1[1] + c2[1], c1[2] + c2[2]]; +} + export function createMaxCoord(): Coord { return [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]; } From f9c122bc515988d2e0579b27d32d27daefa69803 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 11 Dec 2019 13:08:59 +0100 Subject: [PATCH 07/84] build(packaging): simplify `prettier:check` command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 46a607f2..055fef75 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "lint:styles": "stylelint \"{apps,libs}/**/*.{css,scss}\"", "ng": "ng", "nx": "nx", - "prettier:check": "yarn prettier --check --config ./.prettierrc --ignore-path ./.prettierignore '{*,\\.circleci/**/*,apps/**/*,libs/**/*}.{ts,scss,json,html,yml}'", + "prettier:check": "yarn prettier --check --config ./.prettierrc --ignore-path ./.prettierignore '{*,\\.circleci,apps,libs}/**/*.{ts,scss,json,html,yml}'", "start": "ng serve", "test": "ng test", "test:code-coverage": "ng test --code-coverage", From 72c89e0ff49465be4ce4bb31e6bd67c9ba76d9c3 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 11 Dec 2019 13:19:23 +0100 Subject: [PATCH 08/84] doc(frontend): add readme with ngrx resources --- apps/frontend/README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 apps/frontend/README.md diff --git a/apps/frontend/README.md b/apps/frontend/README.md new file mode 100644 index 00000000..442e0a36 --- /dev/null +++ b/apps/frontend/README.md @@ -0,0 +1,6 @@ +# Frontend + +## NgRx + +- [ngrx.io](https://ngrx.io/) +- [example-app](https://github.com/ngrx/platform/tree/master/projects/example-app) From d6eafd56e14fd96f1a32188787609da225a33dbc Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 10:16:10 +0100 Subject: [PATCH 09/84] feat(frontend): support adding voxel --- apps/frontend/src/app/app.reducer.ts | 23 ++++++-- .../scene-viewer-container/grid.service.ts | 26 ++++++++++ .../scene-viewer-container.actions.ts | 4 ++ .../scene-viewer-container.component.ts | 17 +++--- .../scene-viewer-container.effects.ts | 51 ++++++++++++++++++ .../scene-viewer-container.module.ts | 10 +++- .../scene-viewer-container.reducer.ts | 24 +++++++++ .../app/tools-panel/tools-panel.reducer.ts | 2 +- libs/ui/src/lib/scene-viewer/index.ts | 3 +- .../scene-viewer/scene-viewer.component.ts | 1 - .../lib/scene-viewer/scene-viewer.module.ts | 4 +- .../lib/scene-viewer/scene-viewer.service.ts | 52 ++++++++----------- libs/vdb/src/lib/tools/grid-to-mesh.ts | 16 +++--- package.json | 1 + yarn.lock | 5 ++ 15 files changed, 184 insertions(+), 55 deletions(-) create mode 100644 apps/frontend/src/app/scene-viewer-container/grid.service.ts create mode 100644 apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts create mode 100644 apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts diff --git a/apps/frontend/src/app/app.reducer.ts b/apps/frontend/src/app/app.reducer.ts index eae008a3..82ec8af7 100644 --- a/apps/frontend/src/app/app.reducer.ts +++ b/apps/frontend/src/app/app.reducer.ts @@ -8,11 +8,12 @@ import { MetaReducer, } from '@ngrx/store'; import { environment } from '../environments/environment'; - +import * as fromSceneViewerContainer from './scene-viewer-container/scene-viewer-container.reducer'; import * as fromToolsPanel from './tools-panel/tools-panel.reducer'; export interface State { - [fromToolsPanel.toolsPanelFeatureKey]: fromToolsPanel.State; + [fromToolsPanel.featureKey]: fromToolsPanel.State; + [fromSceneViewerContainer.featureKey]: fromSceneViewerContainer.State; } /** @@ -26,7 +27,8 @@ export const ROOT_REDUCERS = new InjectionToken> 'Root reducers token', { factory: () => ({ - [fromToolsPanel.toolsPanelFeatureKey]: fromToolsPanel.reducer, + [fromToolsPanel.featureKey]: fromToolsPanel.reducer, + [fromSceneViewerContainer.featureKey]: fromSceneViewerContainer.reducer, }), }, ); @@ -52,11 +54,24 @@ export function logger(reducer: ActionReducer): ActionReducer { */ export const metaReducers: MetaReducer[] = !environment.production ? [logger] : []; +/** + * SceneViewerContainer reducers + */ +export const selectSceneViewerContainerState = createFeatureSelector< + State, + fromSceneViewerContainer.State +>(fromSceneViewerContainer.featureKey); + +export const selectVoxelCount = createSelector( + selectSceneViewerContainerState, + fromSceneViewerContainer.selectVoxelCount, +); + /** * ToolsPanel reducers */ export const selectToolsPanelState = createFeatureSelector( - fromToolsPanel.toolsPanelFeatureKey, + fromToolsPanel.featureKey, ); export const selectSelectedToolId = createSelector( diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts new file mode 100644 index 00000000..1b6fe40b --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { Coord, Grid, gridToMesh, MeshData } from '@talus/vdb'; + +/** + * Keeps the mutable state of the single grid. This state is not part of the store, due to + * the possible big size of the grid. Creating a new copy for the next state is impracticable. + * + * Supports editing the grid. + */ +@Injectable() +export class GridService { + grid = new Grid(0); + accessor = this.grid.getAccessor(); + + addVoxel(xyz: Coord, value: number): void { + this.accessor.setValue(xyz, value); + } + + removeVoxel(xyz: Coord): void { + // this.accessor.setValueOff(xyz, this.grid.background); + } + + computeMesh(): MeshData { + return gridToMesh(this.grid); + } +} diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts index 350c0e51..d8f32abc 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts @@ -7,8 +7,12 @@ export const addVoxel = createAction( `${actionTypePrefix} Add voxel`, props<{ position: Coord; value: number }>(), ); +export const addVoxelFailed = createAction(`${actionTypePrefix} Add voxel failed`); +export const voxelAdded = createAction(`${actionTypePrefix} Voxel added`); export const removeVoxel = createAction( `${actionTypePrefix} Remove voxel`, props<{ position: Coord }>(), ); +export const removeVoxelFailed = createAction(`${actionTypePrefix} Remove voxel failed`); +export const voxelRemoved = createAction(`${actionTypePrefix} Voxel removed`); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index 0245d4e5..c9911d9c 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -1,12 +1,13 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; // import '@babylonjs/core/Rendering/edgesRenderer'; // import '@babylonjs/core/Rendering/outlineRenderer'; import { select, Store } from '@ngrx/store'; -import { PointerButton, PointerPickInfo } from '@talus/ui'; +import { PointerButton, PointerPickInfo, SceneViewerComponent } from '@talus/ui'; import { add, Coord } from '@talus/vdb'; import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; import { Tool } from '../tools-panel/tool.model'; +import { GridService } from './grid.service'; import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; @Component({ @@ -20,11 +21,13 @@ import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class SceneViewerContainerComponent { - private selectedToolId$: Observable; + @ViewChild(SceneViewerComponent, { static: false }) + private sceneViewerComponent: SceneViewerComponent; - constructor(private store: Store) { - this.selectedToolId$ = store.pipe(select(fromApp.selectSelectedToolId)); - } + selectedToolId$: Observable = this.store.pipe(select(fromApp.selectSelectedToolId)); + voxelCount$: Observable = this.store.pipe(select(fromApp.selectVoxelCount)); + + constructor(private gridService: GridService, private store: Store) {} onPointerPick(event: PointerPickInfo, selectedToolId: Tool): void { this.dispatchPickAction(event, selectedToolId); @@ -42,7 +45,7 @@ export class SceneViewerContainerComponent { switch (selectedToolId) { case Tool.AddVoxel: - this.store.dispatch(addVoxel({ position: this.calcNewVoxelPosition(pickInfo), value: 42 })); + this.store.dispatch(addVoxel({ position: pickInfo.pickedPoint, value: 42 })); break; case Tool.RemoveVoxel: this.store.dispatch(removeVoxel({ position: pickInfo.pickedPoint })); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts new file mode 100644 index 00000000..20571c6c --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { SceneViewerService } from '@talus/ui'; +import { of } from 'rxjs'; +import { catchError, map, tap } from 'rxjs/operators'; +import { GridService } from './grid.service'; +import { + addVoxel, + addVoxelFailed, + removeVoxel, + removeVoxelFailed, + voxelAdded, + voxelRemoved, +} from './scene-viewer-container.actions'; + +@Injectable() +export class SceneViewerContainerEffects { + constructor( + private actions$: Actions, + private gridService: GridService, + private sceneViewerService: SceneViewerService, + ) {} + + addVoxel$ = createEffect(() => + this.actions$.pipe( + ofType(addVoxel), + tap({ + next: ({ position, value }) => { + this.gridService.addVoxel(position, value); + this.sceneViewerService.updateGridMesh(this.gridService.computeMesh()); + }, + }), + map(() => voxelAdded()), + catchError(() => of(addVoxelFailed())), + ), + ); + + removeVoxel$ = createEffect(() => + this.actions$.pipe( + ofType(removeVoxel), + tap({ + next: ({ position }) => { + this.gridService.removeVoxel(position); + this.sceneViewerService.updateGridMesh(this.gridService.computeMesh()); + }, + }), + map(() => voxelRemoved()), + catchError(() => of(removeVoxelFailed())), + ), + ); +} diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts index 6b7bf096..ac65b3af 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts @@ -1,11 +1,19 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { EffectsModule } from '@ngrx/effects'; import { SceneViewerModule } from '@talus/ui'; +import { GridService } from './grid.service'; import { SceneViewerContainerComponent } from './scene-viewer-container.component'; +import { SceneViewerContainerEffects } from './scene-viewer-container.effects'; @NgModule({ declarations: [SceneViewerContainerComponent], - imports: [CommonModule, SceneViewerModule], + imports: [ + CommonModule, + EffectsModule.forFeature([SceneViewerContainerEffects]), + SceneViewerModule, + ], exports: [SceneViewerContainerComponent], + providers: [GridService], }) export class SceneViewerContainerModule {} diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts new file mode 100644 index 00000000..f89ac931 --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts @@ -0,0 +1,24 @@ +import { createReducer, on } from '@ngrx/store'; +import { voxelAdded } from './scene-viewer-container.actions'; + +export const featureKey = 'sceneViewerContainer'; + +export interface State { + voxelCount: number; +} + +export const initialState: State = { + voxelCount: 0, +}; + +export const reducer = createReducer( + initialState, + on(voxelAdded, state => { + return { + ...state, + voxelCount: state.voxelCount + 1, + }; + }), +); + +export const selectVoxelCount = (state: State) => state.voxelCount; diff --git a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts index 134e1293..732957f6 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts @@ -2,7 +2,7 @@ import { createReducer, on } from '@ngrx/store'; import { Tool } from './tool.model'; import { selectTool } from './tools-panel.actions'; -export const toolsPanelFeatureKey = 'toolsPanel'; +export const featureKey = 'toolsPanel'; export interface State { selectedToolId: Tool; diff --git a/libs/ui/src/lib/scene-viewer/index.ts b/libs/ui/src/lib/scene-viewer/index.ts index 1fe437f1..14b12407 100644 --- a/libs/ui/src/lib/scene-viewer/index.ts +++ b/libs/ui/src/lib/scene-viewer/index.ts @@ -1,4 +1,5 @@ +export * from './scene-viewer.component'; export * from './scene-viewer.module'; export * from './scene-viewer.module.testing'; export { PointerButton } from './pointer-button'; -export { PointerPickInfo } from './scene-viewer.service'; +export { PointerPickInfo, SceneViewerService } from './scene-viewer.service'; diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts index 0abb3cdd..6c5538ae 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts @@ -15,7 +15,6 @@ import { SceneViewerService } from './scene-viewer.service'; `, styleUrls: ['./scene-viewer.component.scss'], - providers: [SceneViewerService], changeDetection: ChangeDetectionStrategy.OnPush, }) export class SceneViewerComponent implements OnInit { diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts index 6fb8e213..c569b163 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts @@ -1,12 +1,12 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { SceneViewerComponent } from './scene-viewer.component'; -import { CameraFactory, EngineFactory } from './scene-viewer.service'; +import { CameraFactory, EngineFactory, SceneViewerService } from './scene-viewer.service'; @NgModule({ declarations: [SceneViewerComponent], imports: [CommonModule], exports: [SceneViewerComponent], - providers: [CameraFactory, EngineFactory], + providers: [CameraFactory, EngineFactory, SceneViewerService], }) export class SceneViewerModule {} diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index 9872137c..4de11939 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -12,7 +12,7 @@ import { VertexData } from '@babylonjs/core/Meshes/mesh.vertexData'; import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder'; import '@babylonjs/core/Physics/physicsHelper'; // Needed for `onPointerPick` import { Scene } from '@babylonjs/core/scene'; -import { Coord, Grid, gridToMesh } from '@talus/vdb'; +import { Coord, MeshData } from '@talus/vdb'; import { Subject } from 'rxjs'; import { PointerButton } from './pointer-button'; @@ -46,9 +46,14 @@ export class CameraFactory { } } +/** + * This service allows to set a new mesh for `SceneViewerComponent` to render. This service is + * provided on module level. Therefore, only one `SceneViewerComponent` at the time is supported. + */ @Injectable() export class SceneViewerService { scene: Scene; + gridMesh: Mesh; pointerPick$ = new Subject(); @@ -60,14 +65,17 @@ export class SceneViewerService { initialize(canvas: HTMLCanvasElement): void { this.engine = this.engineFactory.create(canvas); + this.scene = new Scene(this.engine); - this.createScene(); this.createCamera(); this.createLight(); this.registerPointerPick(); - this.addGrid(); + const box = MeshBuilder.CreateBox('box', {}, this.scene); + box.position.x = 0.5; + box.position.y = 0.5; + box.position.z = 0.5; } startRendering(): void { @@ -78,10 +86,18 @@ export class SceneViewerService { this.engine.resize(); } - private createScene(): void { - this.scene = new Scene(this.engine); + updateGridMesh(mesh: MeshData): void { + this.scene.removeMesh(this.gridMesh); + + this.gridMesh = new Mesh('grid', this.scene); + const data = new VertexData(); + + data.colors = mesh.colors; + data.indices = mesh.indices; + data.positions = mesh.positions; - MeshBuilder.CreateBox('box', {}, this.scene); + data.applyToMesh(this.gridMesh); + this.gridMesh.convertToFlatShadedMesh(); } private createCamera(): void { @@ -119,30 +135,6 @@ export class SceneViewerService { this.pointerPick$.next(info); }; } - - private addGrid(): void { - const grid = new Grid(0); - const accessor = grid.getAccessor(); - - for (let x = -10; x < 10; x++) { - for (let z = -10; z < 10; z++) { - accessor.setValue([x, Math.sin(z / 4) * 10, z], 1); - } - } - - const mesh = gridToMesh(grid); - - const gridMesh = new Mesh('grid', this.scene); - const data = new VertexData(); - - data.colors = mesh.colors; - data.indices = mesh.indices; - data.normals = mesh.normals; - data.positions = mesh.positions; - - data.applyToMesh(gridMesh); - gridMesh.convertToFlatShadedMesh(); - } } function vector3ToCoord(vector: Vector3): Coord { diff --git a/libs/vdb/src/lib/tools/grid-to-mesh.ts b/libs/vdb/src/lib/tools/grid-to-mesh.ts index ee464603..84f6f377 100644 --- a/libs/vdb/src/lib/tools/grid-to-mesh.ts +++ b/libs/vdb/src/lib/tools/grid-to-mesh.ts @@ -19,7 +19,7 @@ import { Grid } from '../grid'; export interface MeshData { colors: number[]; indices: number[]; - normals: number[]; + // normals: number[]; positions: number[]; } @@ -28,7 +28,7 @@ export function gridToMesh(grid: Grid): MeshData { positions: [], indices: [], colors: [], - normals: [], + // normals: [], }; let vertexCount = 0; @@ -44,14 +44,14 @@ export function gridToMesh(grid: Grid): MeshData { mesh.indices.push(...[0, 1, 2, 2, 3, 0].map(i => i + vertexCount)); // Front mesh.indices.push(...[4, 5, 6, 6, 7, 4].map(i => i + vertexCount)); // Back - mesh.normals.push(-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); // Left - mesh.normals.push(1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0); // Right + // mesh.normals.push(-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); // Left + // mesh.normals.push(1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0); // Right - mesh.normals.push(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); // Bottom - mesh.normals.push(0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0); // Top + // mesh.normals.push(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); // Bottom + // mesh.normals.push(0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0); // Top - mesh.normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); // Front - mesh.normals.push(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1); // Back + // mesh.normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); // Front + // mesh.normals.push(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1); // Back mesh.positions.push(x, y, z); // 0 mesh.positions.push(x + 1, y, z); // 1 diff --git a/package.json b/package.json index 055fef75..e8580bc0 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@angular/router": "8.2.14", "@babylonjs/core": "4.1.0-beta.9", "@babylonjs/materials": "4.1.0-beta.9", + "@ngrx/effects": "8.5.2", "@ngrx/store": "8.5.2", "@nrwl/angular": "8.9.0", "core-js": "3.4.8", diff --git a/yarn.lock b/yarn.lock index d0046519..af6c6a03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1162,6 +1162,11 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@ngrx/effects@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-8.5.2.tgz#c4f81947f4028a0d678ed2641101481cdbe11b59" + integrity sha512-i2rKLmFcfJmPPQRul1PuXXRuBX2q1g7tK6DbWreNabU/46fYlEwqiiW6lU53t3AgJ3yd6UpeLTR6CHTflkzL+w== + "@ngrx/store@8.5.2": version "8.5.2" resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-8.5.2.tgz#18e4a39f3e7ac2ec8307653837ec3c4153bde04f" From 2e68605d757d7aacc2d691ad36d40962f5cacb9a Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 11:42:54 +0100 Subject: [PATCH 10/84] refactor(frontend): don't inject `GridService` --- .../scene-viewer-container/scene-viewer-container.component.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index c9911d9c..8220529f 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -7,7 +7,6 @@ import { add, Coord } from '@talus/vdb'; import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; import { Tool } from '../tools-panel/tool.model'; -import { GridService } from './grid.service'; import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; @Component({ @@ -27,7 +26,7 @@ export class SceneViewerContainerComponent { selectedToolId$: Observable = this.store.pipe(select(fromApp.selectSelectedToolId)); voxelCount$: Observable = this.store.pipe(select(fromApp.selectVoxelCount)); - constructor(private gridService: GridService, private store: Store) {} + constructor(private store: Store) {} onPointerPick(event: PointerPickInfo, selectedToolId: Tool): void { this.dispatchPickAction(event, selectedToolId); From 157da40f7119520c79efde3ff8db5738e15b9fa9 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 13:04:40 +0100 Subject: [PATCH 11/84] feat(frontend): effects for when app goes on/offline --- apps/frontend/src/app/app.actions.ts | 6 ++++++ apps/frontend/src/app/app.effects.ts | 19 +++++++++++++++++++ apps/frontend/src/app/app.module.ts | 3 +++ 3 files changed, 28 insertions(+) create mode 100644 apps/frontend/src/app/app.actions.ts create mode 100644 apps/frontend/src/app/app.effects.ts diff --git a/apps/frontend/src/app/app.actions.ts b/apps/frontend/src/app/app.actions.ts new file mode 100644 index 00000000..ab592e7e --- /dev/null +++ b/apps/frontend/src/app/app.actions.ts @@ -0,0 +1,6 @@ +import { createAction } from '@ngrx/store'; + +const actionTypePrefix = '[App]'; + +export const wentOnline = createAction(`${actionTypePrefix} Went online`); +export const wentOffline = createAction(`${actionTypePrefix} Went offline`); diff --git a/apps/frontend/src/app/app.effects.ts b/apps/frontend/src/app/app.effects.ts new file mode 100644 index 00000000..bbb6e268 --- /dev/null +++ b/apps/frontend/src/app/app.effects.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect } from '@ngrx/effects'; +import { fromEvent, merge, of } from 'rxjs'; +import { map, mapTo } from 'rxjs/operators'; +import { wentOffline, wentOnline } from './app.actions'; + +@Injectable() +export class AppEffects { + constructor(private actions$: Actions) {} + + // @source: https://indepth.dev/start-using-ngrx-effects-for-this/#1externalsources + onlineStateChange$ = createEffect(() => { + return merge( + of(navigator.onLine), + fromEvent(window, 'online').pipe(mapTo(true)), + fromEvent(window, 'offline').pipe(mapTo(false)), + ).pipe(map(isOnline => (isOnline ? wentOnline() : wentOffline()))); + }); +} diff --git a/apps/frontend/src/app/app.module.ts b/apps/frontend/src/app/app.module.ts index 2238a7d0..58db50bd 100644 --- a/apps/frontend/src/app/app.module.ts +++ b/apps/frontend/src/app/app.module.ts @@ -2,9 +2,11 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterModule } from '@angular/router'; +import { EffectsModule } from '@ngrx/effects'; import { StoreModule } from '@ngrx/store'; import { SidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; +import { AppEffects } from './app.effects'; import { metaReducers, ROOT_REDUCERS } from './app.reducer'; import { SceneViewerContainerModule } from './scene-viewer-container'; import { ToolsPanelModule } from './tools-panel/tools-panel.module'; @@ -14,6 +16,7 @@ import { ToolsPanelModule } from './tools-panel/tools-panel.module'; imports: [ BrowserModule, BrowserAnimationsModule, + EffectsModule.forRoot([AppEffects]), RouterModule.forRoot([], { initialNavigation: 'enabled' }), /** * StoreModule.forRoot is imported once in the root module, accepting a reducer From 4ad0a040d87177bc2db08f0b1069450cce6ff3d2 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 15:03:37 +0100 Subject: [PATCH 12/84] test(frontend): on/offline effects --- apps/frontend/src/app/app.effects.spec.ts | 29 +++++++++++++++++++++++ apps/frontend/src/app/app.effects.ts | 4 +--- package.json | 1 + yarn.lock | 2 +- 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 apps/frontend/src/app/app.effects.spec.ts diff --git a/apps/frontend/src/app/app.effects.spec.ts b/apps/frontend/src/app/app.effects.spec.ts new file mode 100644 index 00000000..c67d1211 --- /dev/null +++ b/apps/frontend/src/app/app.effects.spec.ts @@ -0,0 +1,29 @@ +import { hot } from 'jasmine-marbles'; +import { wentOffline, wentOnline } from './app.actions'; +import { AppEffects } from './app.effects'; + +describe('AppEffects', () => { + let effects: AppEffects; + + beforeEach(() => { + effects = new AppEffects(); + + Object.defineProperty(navigator, 'onLine', { value: false }); + }); + + it('should dispatch `wentOnline` action', () => { + const expected = hot('a', { + a: wentOnline(), + }); + + expect(effects.onlineStateChange$).toBeObservable(expected); + }); + + it('should dispatch `wentOffline` action', () => { + const expected = hot('a', { + a: wentOffline(), + }); + + expect(effects.onlineStateChange$).toBeObservable(expected); + }); +}); diff --git a/apps/frontend/src/app/app.effects.ts b/apps/frontend/src/app/app.effects.ts index bbb6e268..61488e36 100644 --- a/apps/frontend/src/app/app.effects.ts +++ b/apps/frontend/src/app/app.effects.ts @@ -1,13 +1,11 @@ import { Injectable } from '@angular/core'; -import { Actions, createEffect } from '@ngrx/effects'; +import { createEffect } from '@ngrx/effects'; import { fromEvent, merge, of } from 'rxjs'; import { map, mapTo } from 'rxjs/operators'; import { wentOffline, wentOnline } from './app.actions'; @Injectable() export class AppEffects { - constructor(private actions$: Actions) {} - // @source: https://indepth.dev/start-using-ngrx-effects-for-this/#1externalsources onlineStateChange$ = createEffect(() => { return merge( diff --git a/package.json b/package.json index e8580bc0..11ca24c4 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "cypress": "3.7.0", "dotenv": "8.2.0", "gh-pages": "2.1.1", + "jasmine-marbles": "0.6.0", "jest": "24.9.0", "jest-junit": "10.0.0", "jest-preset-angular": "7.1.1", diff --git a/yarn.lock b/yarn.lock index af6c6a03..689573ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5612,7 +5612,7 @@ istanbul-reports@^2.2.6: dependencies: handlebars "^4.1.2" -jasmine-marbles@~0.6.0: +jasmine-marbles@0.6.0, jasmine-marbles@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.6.0.tgz#f78dc1a3bc452976de10ee8b47c73d616532a954" integrity sha512-1uzgjEesEeCb+r+v46qn5x326TiGqk5SUZa+A3O+XnMCjG/pGcUOhL9Xsg5L7gLC6RFHyWGTkB5fei4rcvIOiQ== From f7419ebc311ec1a0429b3b7c11238392b4d5430b Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 15:05:29 +0100 Subject: [PATCH 13/84] test(vdb): remove `normals` from test --- libs/vdb/src/lib/tools/grid-to-mesh.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/vdb/src/lib/tools/grid-to-mesh.spec.ts b/libs/vdb/src/lib/tools/grid-to-mesh.spec.ts index 96829fd7..ab6a602f 100644 --- a/libs/vdb/src/lib/tools/grid-to-mesh.spec.ts +++ b/libs/vdb/src/lib/tools/grid-to-mesh.spec.ts @@ -22,6 +22,5 @@ describe('gridToMesh()', () => { expect(meshData.positions.length).toEqual(voxels * corners * xyz); expect(meshData.colors.length).toEqual(voxels * corners * rgba); expect(meshData.indices.length).toEqual(voxels * triangles * xyz); - expect(meshData.normals.length).toEqual(voxels * triangles * 3 * xyz); }); }); From 99fed10c84100b0bf5cdd6388daa54d7df96c51b Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 16:14:09 +0100 Subject: [PATCH 14/84] feat(vdb): add `setValueOff` & `isValueOn` --- libs/vdb/src/lib/tree/internal-node.ts | 36 ++++++++++++++++ libs/vdb/src/lib/tree/leaf-node.ts | 29 +++++++++++++ libs/vdb/src/lib/tree/node.ts | 16 +++++++ libs/vdb/src/lib/tree/root-node.ts | 40 +++++++++++++++++- libs/vdb/src/lib/tree/value-accessor.spec.ts | 44 ++++++++++++++++++++ libs/vdb/src/lib/tree/value-accessor.ts | 32 ++++++++++++++ 6 files changed, 196 insertions(+), 1 deletion(-) diff --git a/libs/vdb/src/lib/tree/internal-node.ts b/libs/vdb/src/lib/tree/internal-node.ts index fd0118b8..306bce01 100644 --- a/libs/vdb/src/lib/tree/internal-node.ts +++ b/libs/vdb/src/lib/tree/internal-node.ts @@ -109,6 +109,9 @@ abstract class InternalNode implements HashableNode { const active = this.valueMask.isOn(i); // tile's active state if (!active || node.getValue() !== value) { + // If the voxel belongs to a tile that is either inactive or that + // has a constant value that is different from the one provided, + // a child subtree must be constructed. hasChild = true; this.setChildNode(i, this.createChildNode(xyz, node.getValue(), active)); } @@ -120,6 +123,29 @@ abstract class InternalNode implements HashableNode { } } + setValueOffAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void { + const i: Index = this.coordToOffset(xyz); + const node = this.nodes[i]; + let hasChild = this.childMask.isOn(i); + + if (!hasChild) { + const active = this.valueMask.isOn(i); // tile's active state + + if (active || node.getValue() !== value) { + // If the voxel belongs to a tile that is either active or that + // has a constant value that is different from the one provided, + // a child subtree must be constructed. + hasChild = true; + this.setChildNode(i, this.createChildNode(xyz, node.getValue(), active)); + } + } + + if (hasChild) { + accessor.insert(xyz, node.getChild()); + node.getChild().setValueOffAndCache(xyz, value, accessor); + } + } + isValueOn(xyz: Coord): boolean { const i: Index = this.coordToOffset(xyz); if (this.childMask.isOff(i)) { @@ -129,6 +155,16 @@ abstract class InternalNode implements HashableNode { return this.nodes[i].getChild().isValueOn(xyz); } + isValueOnAndCache(xyz: Coord, accessor: ValueAccessor3): boolean { + const i: Index = this.coordToOffset(xyz); + if (this.childMask.isOff(i)) { + return this.valueMask.isOn(i); + } + + accessor.insert(xyz, this.nodes[i].getChild()); + return this.nodes[i].getChild().isValueOnAndCache(xyz, accessor); + } + *beginVoxelOn(): IterableIterator> { for (const index of this.childMask.beginOn()) { const child = this.nodes[index].getChild(); diff --git a/libs/vdb/src/lib/tree/leaf-node.ts b/libs/vdb/src/lib/tree/leaf-node.ts index 70f8f459..4cada089 100644 --- a/libs/vdb/src/lib/tree/leaf-node.ts +++ b/libs/vdb/src/lib/tree/leaf-node.ts @@ -76,6 +76,9 @@ export class LeafNode implements HashableNode { // tslint:enable:no-bitwise } + /** + * Set the value of the voxel at the given coordinates and mark the voxel as active. + */ setValueOn(xyz: Coord, value: T): void { const offset = LeafNode.coordToOffset(xyz); @@ -83,6 +86,16 @@ export class LeafNode implements HashableNode { this.valueMask.setOn(offset); } + /** + * Set the value of the voxel at the given coordinates and mark the voxel as inactive. + */ + setValueOff(xyz: Coord, value: T): void { + const offset = LeafNode.coordToOffset(xyz); + + this.buffer.setValue(offset, value); + this.valueMask.setOff(offset); + } + /** * Return the value of the voxel at the given coordinates. */ @@ -114,6 +127,22 @@ export class LeafNode implements HashableNode { this.setValueOn(xyz, value); } + /** + * @brief Change the value of the voxel at the given coordinates and mark it as inactive. + * @note Used internally by ValueAccessor. + */ + setValueOffAndCache(xyz: Coord, value: T, _: ValueAccessor3): void { + this.setValueOff(xyz, value); + } + + /** + * @brief Return `true` if the voxel at the given coordinates is active. + * @note Used internally by ValueAccessor. + */ + isValueOnAndCache(xyz: Coord, _: ValueAccessor3): boolean { + return this.isValueOn(xyz); + } + /** * Return the global coordinates for a linear table offset. */ diff --git a/libs/vdb/src/lib/tree/node.ts b/libs/vdb/src/lib/tree/node.ts index 9f3ef281..e4c34174 100644 --- a/libs/vdb/src/lib/tree/node.ts +++ b/libs/vdb/src/lib/tree/node.ts @@ -40,6 +40,22 @@ export interface HashableNode extends Node { * @note Used internally by ValueAccessor. */ setValueAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void; + + /** + * Change the value of the voxel at the given coordinates and mark it as inactive. + * If necessary, update the accessor with pointers to the nodes along the path + * from the root node to the node containing the voxel. + * @note Used internally by ValueAccessor. + */ + setValueOffAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void; + + /** + * Return `true` if the voxel at the given coordinates is active and, if necessary, + * update the accessor with pointers to the nodes along the path from the root node + * to the node containing the voxel. + * @note Used internally by ValueAccessor. + */ + isValueOnAndCache(xyz: Coord, accessor: ValueAccessor3): boolean; } export interface IterableNode { diff --git a/libs/vdb/src/lib/tree/root-node.ts b/libs/vdb/src/lib/tree/root-node.ts index 36f29370..20d3dc9e 100644 --- a/libs/vdb/src/lib/tree/root-node.ts +++ b/libs/vdb/src/lib/tree/root-node.ts @@ -77,8 +77,8 @@ export class RootNode implements HashableNode { } setValueAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void { - const struct = this.findCoord(xyz); let child: HashableNode; + const struct = this.findCoord(xyz); if (!struct) { child = new InternalNode2(xyz, this._background); @@ -96,6 +96,28 @@ export class RootNode implements HashableNode { } } + setValueOffAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void { + let child: HashableNode; + const struct = this.findCoord(xyz); + + if (!struct) { + if (this._background !== value) { + child = new InternalNode2(xyz, this._background); + this.table.set(RootNode.coordToKey(xyz), new NodeStruct(child)); + } + } else if (struct.isChild()) { + child = struct.getChild(); + } else if (struct.isTileOn() || struct.getTile().value !== value) { + child = new InternalNode2(xyz, struct.getTile().value, struct.isTileOn()); + struct.setChild(child); + } + + if (child) { + accessor.insert(xyz, child); + child.setValueOffAndCache(xyz, value, accessor); + } + } + isValueOn(xyz: Coord): boolean { const struct = this.findCoord(xyz); @@ -106,6 +128,22 @@ export class RootNode implements HashableNode { return struct.isTileOn() ? true : struct.getChild().isValueOn(xyz); } + isValueOnAndCache(xyz: Coord, accessor: ValueAccessor3): boolean { + const struct = this.findCoord(xyz); + + if (!struct || struct.isTileOff()) { + return false; + } + + if (struct.isTileOn()) { + return true; + } + + accessor.insert(xyz, struct.getChild()); + + return struct.getChild().isValueOnAndCache(xyz, accessor); + } + onVoxelCount(): number { let sum = 0; for (const nodeStruct of this.table.values()) { diff --git a/libs/vdb/src/lib/tree/value-accessor.spec.ts b/libs/vdb/src/lib/tree/value-accessor.spec.ts index b5f6f29e..425daade 100644 --- a/libs/vdb/src/lib/tree/value-accessor.spec.ts +++ b/libs/vdb/src/lib/tree/value-accessor.spec.ts @@ -12,6 +12,7 @@ describe('ValueAccessor', () => { const value = accessor.getValue([0, 0, 0]); expect(value).toEqual(1496); + expect(accessor.isCached([0, 0, 0])).toBeTruthy(); expect(accessor.isCached([0, 0, 8])).toBeTruthy(); expect(accessor.isCached([0, 8, 0])).toBeTruthy(); @@ -30,12 +31,55 @@ describe('ValueAccessor', () => { const value = accessor.getValue([0, 0, 0]); expect(value).toEqual(1496); + + expect(accessor.isCached([0, 0, 0])).toBeTruthy(); + expect(accessor.isCached([0, 0, 8])).toBeTruthy(); + expect(accessor.isCached([0, 8, 0])).toBeTruthy(); + expect(accessor.isCached([8, 0, 0])).toBeTruthy(); + expect(accessor.isCached([0, 0, InternalNode2.DIM - 1])).toBeTruthy(); + expect(accessor.isCached([0, 0, InternalNode2.DIM])).toBeFalsy(); + + expect(accessor.isValueOn([0, 0, 0])).toBeTruthy(); + }); + }); + + describe('setValueOff()', () => { + it('should cache coordinate', () => { + const tree = new Tree(0); + const accessor = new ValueAccessor3(tree); + + accessor.setValueOff([0, 0, 0], 1496); + const value = accessor.getValue([0, 0, 0]); + + expect(value).toEqual(1496); + expect(accessor.isCached([0, 0, 0])).toBeTruthy(); expect(accessor.isCached([0, 0, 8])).toBeTruthy(); expect(accessor.isCached([0, 8, 0])).toBeTruthy(); expect(accessor.isCached([8, 0, 0])).toBeTruthy(); expect(accessor.isCached([0, 0, InternalNode2.DIM - 1])).toBeTruthy(); expect(accessor.isCached([0, 0, InternalNode2.DIM])).toBeFalsy(); + + expect(accessor.isValueOn([0, 0, 0])).toBeFalsy(); + }); + }); + + describe('isValueOn()', () => { + it('should set value and (de)activate voxel', () => { + const tree = new Tree(0); + const accessor = new ValueAccessor3(tree); + + accessor.setValueOn([0, 0, 1], 4321); + accessor.setValueOff([42, 638, 2], 1234); + + expect(accessor.getValue([0, 0, 1])).toEqual(4321); + expect(accessor.getValue([42, 638, 2])).toEqual(1234); + + expect(accessor.isValueOn([0, 0, 1])).toBeTruthy(); + expect(accessor.isValueOn([42, 638, 2])).toBeFalsy(); + + accessor.setValueOff([0, 0, 1], 1); + expect(accessor.isValueOn([0, 0, 1])).toBeFalsy(); }); }); }); diff --git a/libs/vdb/src/lib/tree/value-accessor.ts b/libs/vdb/src/lib/tree/value-accessor.ts index feac29c2..9ba01796 100644 --- a/libs/vdb/src/lib/tree/value-accessor.ts +++ b/libs/vdb/src/lib/tree/value-accessor.ts @@ -75,6 +75,38 @@ export class ValueAccessor3 { this.tree.root.setValueAndCache(xyz, value, this); } } + setValueOn(xyz: Coord, value: T): void { + this.setValue(xyz, value); + } + + /** + * Set the value of the voxel at the given coordinates and mark the voxel as inactive. + */ + setValueOff(xyz: Coord, value: T): void { + if (this.isHashed0(xyz)) { + this.leafNode.setValueOffAndCache(xyz, value, this); + } else if (this.isHashed1(xyz)) { + this.internalNode1.setValueOffAndCache(xyz, value, this); + } else if (this.isHashed2(xyz)) { + this.internalNode2.setValueOffAndCache(xyz, value, this); + } else { + this.tree.root.setValueOffAndCache(xyz, value, this); + } + } + + /** + * Return the active state of the voxel at the given coordinates. + */ + isValueOn(xyz: Coord): boolean { + if (this.isHashed0(xyz)) { + return this.leafNode.isValueOnAndCache(xyz, this); + } else if (this.isHashed1(xyz)) { + return this.internalNode1.isValueOnAndCache(xyz, this); + } else if (this.isHashed2(xyz)) { + return this.internalNode2.isValueOnAndCache(xyz, this); + } + return this.tree.root.isValueOnAndCache(xyz, this); + } // tslint:disable:no-bitwise insert(xyz: Coord, node: HashableNode): void { From 29161bc0b35eaf045dfb4a10a7f02bee1a6a673f Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 16:24:10 +0100 Subject: [PATCH 15/84] test(frontend): set expected position to pass --- .../scene-viewer-container.component.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index 3f3da356..43243d9e 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -24,6 +24,7 @@ describe('SceneViewerContainerComponent', () => { let component: SceneViewerContainerComponent; let stubComponent: SceneViewerStubComponent; let fixture: ComponentFixture; + let mockStore: MockStore; let mockSelectedToolIdSelector: MemoizedSelector; @@ -68,7 +69,7 @@ describe('SceneViewerContainerComponent', () => { }); it('should dispatch `addVoxel` action', () => { - const action = addVoxel({ position: [1, 1, 2], value: 42 }); + const action = addVoxel({ position: [1, 1, 1], value: 42 }); stubComponent.pointerPick.next({ pickedPoint: [1, 1, 1], From c01594402d0c4053aa33854a179b8e7b226072a4 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 16:35:48 +0100 Subject: [PATCH 16/84] fix(frontend): make public for use in template --- apps/frontend/src/app/tools-panel/tools-panel.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/app/tools-panel/tools-panel.component.ts b/apps/frontend/src/app/tools-panel/tools-panel.component.ts index 3c84f224..5def4721 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.component.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.component.ts @@ -18,7 +18,7 @@ import { selectTool } from './tools-panel.actions'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class ToolsPanelComponent { - private selectedToolId$: Observable; + selectedToolId$: Observable; tools: UiToolbarToolConfig[] = [ { From 31ea92067736a00338f4e0da5a63bd19e50beffa Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 16:47:23 +0100 Subject: [PATCH 17/84] build(dep): `@types/node` & `core-js` --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 11ca24c4..54ee6e39 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@ngrx/effects": "8.5.2", "@ngrx/store": "8.5.2", "@nrwl/angular": "8.9.0", - "core-js": "3.4.8", + "core-js": "3.5.0", "hammerjs": "2.0.8", "mnemonist": "0.31.3", "rxjs": "6.5.3", @@ -67,7 +67,7 @@ "@nrwl/workspace": "8.9.0", "@types/benchmark": "1.0.31", "@types/jest": "24.0.23", - "@types/node": "12.12.16", + "@types/node": "12.12.17", "babylonjs": "4.1.0-beta.9", "benchmark": "2.1.4", "codelyzer": "5.2.0", diff --git a/yarn.lock b/yarn.lock index 689573ed..28999fc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1427,10 +1427,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== -"@types/node@12.12.16": - version "12.12.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.16.tgz#3ebcbd7bf978fa4c5120fee8be57083271a8b3ac" - integrity sha512-vRuMyoOr5yfNf8QWxXegOjeyjpWJxFePzHzmBOIzDIzo+rSqF94RW0PkS6y4T2+VjAWLXHWrfbIJY3E3aS7lUw== +"@types/node@12.12.17": + version "12.12.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" + integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -3170,10 +3170,10 @@ core-js@3.2.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== -core-js@3.4.8: - version "3.4.8" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.4.8.tgz#e0fc0c61f2ef90cbc10c531dbffaa46dfb7152dd" - integrity sha512-b+BBmCZmVgho8KnBUOXpvlqEMguko+0P+kXCwD4vIprsXC6ht1qgPxtb1OK6XgSlrySF71wkwBQ0Hv695bk9gQ== +core-js@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.5.0.tgz#66df8e49be4bd775e6f952a9d083b756ad41c1ed" + integrity sha512-Ifh3kj78gzQ7NAoJXeTu+XwzDld0QRIwjBLRqAMhuLhP3d2Av5wmgE9ycfnvK6NAEjTkQ1sDPeoEZAWO3Hx1Uw== core-js@^2.4.0: version "2.6.9" From 11fa2eb4dfdcff3da5d393a1055dc4eba96c8d78 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 16:51:17 +0100 Subject: [PATCH 18/84] feat(frontend): enable `removeVoxel` --- apps/frontend/src/app/scene-viewer-container/grid.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index 1b6fe40b..bf5474c9 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -17,7 +17,7 @@ export class GridService { } removeVoxel(xyz: Coord): void { - // this.accessor.setValueOff(xyz, this.grid.background); + this.accessor.setValueOff(xyz, this.grid.background); } computeMesh(): MeshData { From 5a8df987cf29f756007e79ce87fae7db8732e3ad Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 17:17:59 +0100 Subject: [PATCH 19/84] build(dep): `@babylonjs/*` --- package.json | 8 ++--- yarn.lock | 90 ++++++++++++++++++++++++++-------------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/package.json b/package.json index 54ee6e39..9549c7db 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ "@angular/platform-browser": "8.2.14", "@angular/platform-browser-dynamic": "8.2.14", "@angular/router": "8.2.14", - "@babylonjs/core": "4.1.0-beta.9", - "@babylonjs/materials": "4.1.0-beta.9", + "@babylonjs/core": "4.1.0-beta.12", + "@babylonjs/materials": "4.1.0-beta.12", "@ngrx/effects": "8.5.2", "@ngrx/store": "8.5.2", "@nrwl/angular": "8.9.0", @@ -60,7 +60,7 @@ "@angular/cli": "8.3.20", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", - "@babylonjs/inspector": "4.1.0-beta.9", + "@babylonjs/inspector": "4.1.0-beta.12", "@nrwl/cypress": "8.9.0", "@nrwl/jest": "8.9.0", "@nrwl/node": "8.9.0", @@ -68,7 +68,7 @@ "@types/benchmark": "1.0.31", "@types/jest": "24.0.23", "@types/node": "12.12.17", - "babylonjs": "4.1.0-beta.9", + "babylonjs": "4.1.0-beta.12", "benchmark": "2.1.4", "codelyzer": "5.2.0", "cypress": "3.7.0", diff --git a/yarn.lock b/yarn.lock index 28999fc9..fcfbc79b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -914,58 +914,58 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babylonjs/core@4.1.0-beta.9": - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.9.tgz#e77c3ddde0354b305aab0f234a7c4901914c8ae4" - integrity sha512-8jluf2f0ip+abcWNZn01eONB4joFR2lFWbpIk6L4x9lu/H5eENUT4WKqJ+1zFSKz2mWi0VJBu2snojC+I6JRKw== +"@babylonjs/core@4.1.0-beta.12": + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.12.tgz#9aaaa51fa4fc72defb9e444d8376294f3bccbb0b" + integrity sha512-o5IUXJJWwZpON4YRytvYJkdhuKVf5Kf8bieotp4TVqo+ECB+mUGvxkDFoa/Mc1A0QLT7YcDSuibYQbu6asRrTQ== dependencies: tslib "^1.10.0" -"@babylonjs/gui@4.1.0-beta.9": - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.9.tgz#7668b1b6a04e952e40a9d2b0ecab8742cf7e7e1e" - integrity sha512-bm3Bq+Ldy+n1jIkBCg/4cCxGV0zJe6uGQ2wLxtMqL2xVgBDO6rIdLCZBEFMeAjs/18d0ceNeONk8kLhVEtiLSQ== +"@babylonjs/gui@4.1.0-beta.12": + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.12.tgz#b467209fde28479e340dd0db107736b0334ae6a3" + integrity sha512-7WjS0liqvtSnJKqCR3ft2cwyOlqFiAUDQwzsSax4f1Iq9ql4M5J5+LC0FLXgkAGiltut8JjioSdEG39kD3T0TA== dependencies: - "@babylonjs/core" "4.1.0-beta.9" + "@babylonjs/core" "4.1.0-beta.12" tslib "^1.10.0" -"@babylonjs/inspector@4.1.0-beta.9": - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.9.tgz#dfd0ec78180dabe569bb16702f2dcef572557f40" - integrity sha512-6tT+rc3UMdKiNugYNAJxBP5Zza+2ABLgscCc5VG8rDGap0i6x/6aPoYEvZ0iGNQCrjvS66kd5/vVtCyoc+ISuQ== - dependencies: - "@babylonjs/core" "4.1.0-beta.9" - "@babylonjs/gui" "4.1.0-beta.9" - "@babylonjs/loaders" "4.1.0-beta.9" - "@babylonjs/materials" "4.1.0-beta.9" - "@babylonjs/serializers" "4.1.0-beta.9" - babylonjs-gltf2interface "4.1.0-beta.9" +"@babylonjs/inspector@4.1.0-beta.12": + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.12.tgz#c2e489b2a6a29d65523eec93a44346b1e65c97ec" + integrity sha512-Wga2Q5Gu5CBiR3zNMV30hCeTlDt5DxOGogOmMlkU9IfXg84VcpgjjHa4a1NV/nDaJtOP+sANKIvxVyAgtMhhhQ== + dependencies: + "@babylonjs/core" "4.1.0-beta.12" + "@babylonjs/gui" "4.1.0-beta.12" + "@babylonjs/loaders" "4.1.0-beta.12" + "@babylonjs/materials" "4.1.0-beta.12" + "@babylonjs/serializers" "4.1.0-beta.12" + babylonjs-gltf2interface "4.1.0-beta.12" tslib "^1.10.0" -"@babylonjs/loaders@4.1.0-beta.9": - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.9.tgz#33582c15ec144403db2cf1e614ac4c26d11e185f" - integrity sha512-0QPDIzaAxe3UOK/vzz4EPrH90CGO8cYJS5ev74sySwsodTkEDCgcyBuGsJYNQic1yje2SWrcBUWfaVCm/8QcYA== +"@babylonjs/loaders@4.1.0-beta.12": + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.12.tgz#a0225a705507705ca9d4730eede87c95aa4b84c7" + integrity sha512-FIZxjltGLMP3DSCtos365HjPpL7zOfzkERe+X5/yy9zkMKPrzZGcKv90MZyEx+9lrjMTV3sueDMNTnp6d9pc/g== dependencies: - "@babylonjs/core" "4.1.0-beta.9" - babylonjs-gltf2interface "4.1.0-beta.9" + "@babylonjs/core" "4.1.0-beta.12" + babylonjs-gltf2interface "4.1.0-beta.12" tslib "^1.10.0" -"@babylonjs/materials@4.1.0-beta.9": - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.9.tgz#4ca9601bdb61338f3b0dc874a5ccaff9a9b3a37c" - integrity sha512-NBYMHtgPSm2BZn9FcUgeb4eVJXForv4sR2gt6UKBdAUeA8AXoJc5fATQEwybEFwGMDafB1XFfP7bIxCBJy/jMg== +"@babylonjs/materials@4.1.0-beta.12": + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.12.tgz#71dfe537b54c243e8c7db0a46683986c6d284008" + integrity sha512-lwJ6SZySiQiT+dijkg3yddgU71sGzmiO2Zm8JzSsRJkuA2P6K8s1sZUDVAhI5h6Im8i7LiSFWLPQQjZsDaOAkA== dependencies: - "@babylonjs/core" "4.1.0-beta.9" + "@babylonjs/core" "4.1.0-beta.12" tslib "^1.10.0" -"@babylonjs/serializers@4.1.0-beta.9": - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.9.tgz#f92db8df538e0e823bf68a69c4a4f684a889b6bf" - integrity sha512-ai92CPa48Q1aUxfVN/bLIoTfWssPeEFojs2eTwox8CnipcI4Njl7qGyT9FQRoe1AvmGpn6GR4baXawj4WPQnpQ== +"@babylonjs/serializers@4.1.0-beta.12": + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.12.tgz#0c5f6a0050af4a6b7384a6d3dcb34a8f496ea58a" + integrity sha512-T2YWPPgj6voKowx9YanPTaFqPatxfBR3oVm/uPtt2iRFvt8POy1wYWBBzjFHRJKicQflhA2LEfHWFr82xyzCCg== dependencies: - "@babylonjs/core" "4.1.0-beta.9" - babylonjs-gltf2interface "4.1.0-beta.9" + "@babylonjs/core" "4.1.0-beta.12" + babylonjs-gltf2interface "4.1.0-beta.12" tslib "^1.10.0" "@cnakazawa/watch@^1.0.3": @@ -2217,15 +2217,15 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -babylonjs-gltf2interface@4.1.0-beta.9: - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.9.tgz#43238e5ac6b2d84554a9b99527fc626c160d0fce" - integrity sha512-aTsoK6cLBVguU5DlgBvRbiti4G5ItumbnYbLvcQr5IbG9xuPeca01N70QxTB1OWjNiGkq0+tlIqsrQg3J9xBgQ== +babylonjs-gltf2interface@4.1.0-beta.12: + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.12.tgz#38dbc4d3b48e76d4b29d9508092d62eb17e4ae26" + integrity sha512-BOLX7C2elDVd9UtJXPnOF7qMCy7LebtpySCEnhlsZDvCIVWqBhQgzXA/d3Oeb4tGtpiZtaB87WG2bzuLWL0FzA== -babylonjs@4.1.0-beta.9: - version "4.1.0-beta.9" - resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.9.tgz#1d2345ce0b17917383c31f64072fea8b89cbb94a" - integrity sha512-5B8+ESAc1WsdOjfml0Amm8SVdSeCLv6HFmcVxQZCE6ftNhNvN+UkN+OILTIZ9LvdPoslOntY/Ow7PNAyIZ/vSw== +babylonjs@4.1.0-beta.12: + version "4.1.0-beta.12" + resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.12.tgz#f42d88d865c9ba984506afde3b054dec215af092" + integrity sha512-SyQVqarSuBDAmIkIzGctb35XSwuRAv+vI9CaE5rz4ls35pbvPdj0Nf3sZUePUDw6CZueRp3z2sL+zgPuvbg3Ow== bail@^1.0.0: version "1.0.4" From 38002fb93d726ffbf8dccb6b1e4418586ec9c5ca Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 12 Dec 2019 17:55:06 +0100 Subject: [PATCH 20/84] build(github): keep `develop` after PR merge --- .github/delete-merged-branch-config.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/delete-merged-branch-config.yml diff --git a/.github/delete-merged-branch-config.yml b/.github/delete-merged-branch-config.yml new file mode 100644 index 00000000..bf332d23 --- /dev/null +++ b/.github/delete-merged-branch-config.yml @@ -0,0 +1,3 @@ +exclude: + - master + - develop From 2e5f6b3bedc3507d52ec2867dc32e0093a486e14 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Mon, 16 Dec 2019 11:25:39 +0100 Subject: [PATCH 21/84] build(dep): `cypress` to `v3.8.0` --- .circleci/config.yml | 2 +- README.md | 3 +++ package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d3a2873e..121bad2b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,7 +16,7 @@ aliases: # https://github.com/cypress-io/cypress-docker-images/tree/master/included - &use_docker_cypress_included docker: - - image: cypress/included:3.7.0 + - image: cypress/included:3.8.0 - &workspace ~/talus diff --git a/README.md b/README.md index 90bd6c28..25a41e36 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,9 @@ Setting up a macro which will fix all the linting issues, optimizes the imports installed in order to be able to run Cypress locally. - `yarn e2e ` +When updating Cypress version in `package.json` the version in `.circleci/config.yml` needs to be +updated as well. + ## Nx ### Update diff --git a/package.json b/package.json index 9549c7db..3e32cdc5 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "babylonjs": "4.1.0-beta.12", "benchmark": "2.1.4", "codelyzer": "5.2.0", - "cypress": "3.7.0", + "cypress": "3.8.0", "dotenv": "8.2.0", "gh-pages": "2.1.1", "jasmine-marbles": "0.6.0", diff --git a/yarn.lock b/yarn.lock index fcfbc79b..922e1a2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3339,10 +3339,10 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= -cypress@3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.7.0.tgz#e2cd71b87b6ce0d4c72c6ea25da1005d75c1f231" - integrity sha512-o+vfRxqAba8TduelzfZQ4WHmj2yNEjaoO2EuZ8dZ9pJpuW+WGtBGheKIp6zkoQsp8ZgFe8OoHh1i2mY8BDnMAw== +cypress@3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.0.tgz#7d4cd08f81f9048ee36760cc9ee3b9014f9e84ab" + integrity sha512-gtEbqCgKETRc3pQFMsELRgIBNgiQg7vbOWTrCi7WE7bgOwNCaW9PEX8Jb3UN8z/maIp9WwzoFfeySfelYY7nRA== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/xvfb" "1.2.4" From 9629429e00bfb6d055d5a7e0408a28738f0625a6 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Mon, 16 Dec 2019 13:09:54 +0100 Subject: [PATCH 22/84] build(dep): `cypress` to `v3.7.0` --- .circleci/config.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 121bad2b..d3a2873e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,7 +16,7 @@ aliases: # https://github.com/cypress-io/cypress-docker-images/tree/master/included - &use_docker_cypress_included docker: - - image: cypress/included:3.8.0 + - image: cypress/included:3.7.0 - &workspace ~/talus diff --git a/package.json b/package.json index 3e32cdc5..9549c7db 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "babylonjs": "4.1.0-beta.12", "benchmark": "2.1.4", "codelyzer": "5.2.0", - "cypress": "3.8.0", + "cypress": "3.7.0", "dotenv": "8.2.0", "gh-pages": "2.1.1", "jasmine-marbles": "0.6.0", From bb5440f8178ee7bdbb170100e5d2196e8d15ac15 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Tue, 17 Dec 2019 12:02:17 +0100 Subject: [PATCH 23/84] test(vdb): set value with float coordinates: - coordinates get always rounded down --- libs/vdb/src/lib/tree/root-node.spec.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libs/vdb/src/lib/tree/root-node.spec.ts b/libs/vdb/src/lib/tree/root-node.spec.ts index d3e07462..a4b37e17 100644 --- a/libs/vdb/src/lib/tree/root-node.spec.ts +++ b/libs/vdb/src/lib/tree/root-node.spec.ts @@ -17,6 +17,23 @@ describe('RootNode', () => { expect(root.getValue([1, 1, 1])).toEqual(-1); }); + + it('should set value when given float coordinates', () => { + const root = new RootNode(-1); + + root.setValueOn([0, 0, 0.1], 1); + root.setValueOn([0, 1.5, 0], 5); + root.setValueOn([2.9, 0, 0], 9); + + expect(root.getValue([0, 0, 0])).toEqual(1); + expect(root.getValue([0, 0, 1])).toEqual(-1); + + expect(root.getValue([0, 1, 0])).toEqual(5); + expect(root.getValue([0, 2, 0])).toEqual(-1); + + expect(root.getValue([2, 0, 0])).toEqual(9); + expect(root.getValue([3, 0, 0])).toEqual(-1); + }); }); describe('onVoxelCount()', () => { From 1362079a30777b1321b7a73135cc7b7ff8dfdf88 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Tue, 17 Dec 2019 15:01:05 +0100 Subject: [PATCH 24/84] build(dep): `cypress` to `v3.7.0` --- .circleci/config.yml | 1 + yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d3a2873e..6ec44143 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,6 +16,7 @@ aliases: # https://github.com/cypress-io/cypress-docker-images/tree/master/included - &use_docker_cypress_included docker: + # 3.8.0 fails with `Error: write EPIPE` when running `benchmark`!? - image: cypress/included:3.7.0 - &workspace ~/talus diff --git a/yarn.lock b/yarn.lock index 922e1a2e..fcfbc79b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3339,10 +3339,10 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= -cypress@3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.0.tgz#7d4cd08f81f9048ee36760cc9ee3b9014f9e84ab" - integrity sha512-gtEbqCgKETRc3pQFMsELRgIBNgiQg7vbOWTrCi7WE7bgOwNCaW9PEX8Jb3UN8z/maIp9WwzoFfeySfelYY7nRA== +cypress@3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.7.0.tgz#e2cd71b87b6ce0d4c72c6ea25da1005d75c1f231" + integrity sha512-o+vfRxqAba8TduelzfZQ4WHmj2yNEjaoO2EuZ8dZ9pJpuW+WGtBGheKIp6zkoQsp8ZgFe8OoHh1i2mY8BDnMAw== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/xvfb" "1.2.4" From e8cd3c929f9a6a76526cf0555fbd87ef4bac15af Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 18 Dec 2019 18:09:50 +0100 Subject: [PATCH 25/84] feat(frontend): support adding and removing voxels --- .../scene-viewer-container/grid.service.ts | 2 +- .../scene-viewer-container.component.spec.ts | 133 ++++++++++++++---- .../scene-viewer-container.component.ts | 61 +++++++- .../lib/scene-viewer/scene-viewer.service.ts | 20 +-- libs/vdb/src/lib/tools/grid-to-mesh.ts | 12 +- libs/vdb/src/lib/tree/root-node.spec.ts | 10 +- 6 files changed, 190 insertions(+), 48 deletions(-) diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index bf5474c9..4b2d47c9 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -20,7 +20,7 @@ export class GridService { this.accessor.setValueOff(xyz, this.grid.background); } - computeMesh(): MeshData { + computeMesh(): MeshData | undefined { return gridToMesh(this.grid); } } diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index 43243d9e..358f8234 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -4,6 +4,7 @@ import { By } from '@angular/platform-browser'; import { MemoizedSelector, Store } from '@ngrx/store'; import { MockStore, provideMockStore } from '@ngrx/store/testing'; import { PointerButton, PointerPickInfo } from '@talus/ui'; +import { Coord } from '@talus/vdb'; import { Subject } from 'rxjs'; import * as fromApp from '../app.reducer'; import { Tool } from '../tools-panel/tool.model'; @@ -68,31 +69,109 @@ describe('SceneViewerContainerComponent', () => { expect(mockStore.dispatch).not.toHaveBeenCalled(); }); - it('should dispatch `addVoxel` action', () => { - const action = addVoxel({ position: [1, 1, 1], value: 42 }); - - stubComponent.pointerPick.next({ - pickedPoint: [1, 1, 1], - pointerButton: PointerButton.Main, - normal: [0, 0, 1], - }); - - expect(mockStore.dispatch).toHaveBeenCalledWith(action); - }); - - it('should dispatch `removeVoxel` action', () => { - mockSelectedToolIdSelector.setResult(Tool.RemoveVoxel); - mockStore.refreshState(); - fixture.detectChanges(); - - const action = removeVoxel({ position: [1, 1, 1] }); - - stubComponent.pointerPick.next({ - pickedPoint: [1, 1, 1], - pointerButton: PointerButton.Main, - normal: [0, 0, 1], - }); - - expect(mockStore.dispatch).toHaveBeenCalledWith(action); - }); + it.each([ + [ + [1, 0.2, 0.9], + [1, 0.2, 0.9], + [1, 0, 0], + ], + [ + [0.99999999, 0.2, 0.9], + [1, 0.2, 0.9], + [1, 0, 0], + ], + [ + [0.2, 0.99999999, 0.9], + [0.2, 1, 0.9], + [0, 1, 0], + ], + [ + [0.2, 0.9, 0.0000000001], + [0.2, 0.9, 0], + [0, 0, 1], + ], + [ + [0, 0, -0.999999], + [0, 0, -2], + [0, 0, 1], + ], + [ + [0, -2, -0.999999], + [0, -3, -2], + [0, 0, -1], + ], + [ + [-0, -2, 3], + [-0, -3, 2], + [0, 0, -1], + ], + ])( + 'should dispatch `addVoxel` action for %j', + (pickedPoint: Coord, position: Coord, normal: Coord) => { + const action = addVoxel({ position, value: 42 }); + + stubComponent.pointerPick.next({ + pickedPoint, + pointerButton: PointerButton.Main, + normal, + }); + + expect(mockStore.dispatch).toHaveBeenCalledWith(action); + }, + ); + + it.each([ + [ + [1.0000000000001, 0.5, 0.5], + [0, 0.5, 0.5], + [1, 0, 0], + ], + [ + [0.999999999999, 0.5, 0.5], + [1, 0.5, 0.5], + [-1, 0, 0], + ], + [ + [1.0000000000001, -0.5, 0.5], + [1, -1.5, 0.5], + [-1, 0, 0], + ], + [ + [-0.999999999999, -0.5, 0.5], + [-1, -1.5, 0.5], + [-1, 0, 0], + ], + [ + [-2.0000000000001, -0.5, 0.5], + [-3, -1.5, 0.5], + [1, 0, 0], + ], + [ + [0.5, 0.999999999999, 0.5], + [0.5, 0, 0.5], + [0, 1, 0], + ], + [ + [0.5461420538559825, 0.4841910809236776, -2], + [0.5461420538559825, 0.4841910809236776, -2], + [0, 0, -1], + ], + ])( + 'should dispatch `removeVoxel` action for %j', + (pickedPoint: Coord, position: Coord, normal: Coord) => { + mockSelectedToolIdSelector.setResult(Tool.RemoveVoxel); + mockStore.refreshState(); + fixture.detectChanges(); + + const action = removeVoxel({ position }); + + stubComponent.pointerPick.next({ + pickedPoint, + pointerButton: PointerButton.Main, + normal, + }); + + expect(mockStore.dispatch).toHaveBeenCalledWith(action); + }, + ); }); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index 8220529f..fc39f4ef 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -3,7 +3,7 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; // import '@babylonjs/core/Rendering/outlineRenderer'; import { select, Store } from '@ngrx/store'; import { PointerButton, PointerPickInfo, SceneViewerComponent } from '@talus/ui'; -import { add, Coord } from '@talus/vdb'; +import { Coord } from '@talus/vdb'; import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; import { Tool } from '../tools-panel/tool.model'; @@ -44,15 +44,66 @@ export class SceneViewerContainerComponent { switch (selectedToolId) { case Tool.AddVoxel: - this.store.dispatch(addVoxel({ position: pickInfo.pickedPoint, value: 42 })); + this.store.dispatch( + addVoxel({ position: this.calcVoxelToAddPosition(pickInfo), value: 42 }), + ); break; case Tool.RemoveVoxel: - this.store.dispatch(removeVoxel({ position: pickInfo.pickedPoint })); + this.store.dispatch(removeVoxel({ position: this.calcVoxelToRemovePosition(pickInfo) })); break; } } - private calcNewVoxelPosition(pickInfo: PointerPickInfo): Coord { - return add(pickInfo.pickedPoint, pickInfo.normal); + private calcVoxelToAddPosition(pickInfo: PointerPickInfo): Coord { + const pickedIntegerPoint = this.roundDimensionAlongNormal(pickInfo); + + const newPoint: Coord = [ + pickedIntegerPoint[0] < 0 || pickInfo.normal[0] < 0 + ? pickedIntegerPoint[0] - 1 + : pickedIntegerPoint[0], + pickedIntegerPoint[1] < 0 || pickInfo.normal[1] < 0 + ? pickedIntegerPoint[1] - 1 + : pickedIntegerPoint[1], + pickedIntegerPoint[2] < 0 || pickInfo.normal[2] < 0 + ? pickedIntegerPoint[2] - 1 + : pickedIntegerPoint[2], + ]; + + return newPoint; + } + + private calcVoxelToRemovePosition(pickInfo: PointerPickInfo): Coord { + const pickedIntegerPoint = this.roundDimensionAlongNormal(pickInfo); + + const newPoint: Coord = [ + pickInfo.normal[0] > 0 || (pickInfo.normal[0] === 0 && pickedIntegerPoint[0] < 0) + ? pickedIntegerPoint[0] - 1 + : pickedIntegerPoint[0], + pickInfo.normal[1] > 0 || (pickInfo.normal[1] === 0 && pickedIntegerPoint[1] < 0) + ? pickedIntegerPoint[1] - 1 + : pickedIntegerPoint[1], + pickInfo.normal[2] > 0 || (pickInfo.normal[2] === 0 && pickedIntegerPoint[2] < 0) + ? pickedIntegerPoint[2] - 1 + : pickedIntegerPoint[2], + ]; + + return newPoint; + } + + /** + * Babylon.js returns sometimes a floating instead of integer number for the dimension of + * the normal vector of the picked point. + * E.g. Click on [1, 0.5, 0.6] on voxel at [0, 0, 0] on its site which has the x-axis as its + * normal vector [1, 0, 0], could result in a picking point of something like [0.99999, 0.5, 0.6]. + * Where in fact it should be [1, 0.5, 0.6]. + * Since all the voxels are placed on integer positions the dimension of the picked point + * needs to be rounded. + */ + private roundDimensionAlongNormal(pickInfo: PointerPickInfo): Coord { + return [ + pickInfo.normal[0] !== 0 ? Math.round(pickInfo.pickedPoint[0]) : pickInfo.pickedPoint[0], + pickInfo.normal[1] !== 0 ? Math.round(pickInfo.pickedPoint[1]) : pickInfo.pickedPoint[1], + pickInfo.normal[2] !== 0 ? Math.round(pickInfo.pickedPoint[2]) : pickInfo.pickedPoint[2], + ]; } } diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index 4de11939..1ffeb152 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -86,18 +86,20 @@ export class SceneViewerService { this.engine.resize(); } - updateGridMesh(mesh: MeshData): void { + updateGridMesh(mesh?: MeshData): void { this.scene.removeMesh(this.gridMesh); - this.gridMesh = new Mesh('grid', this.scene); - const data = new VertexData(); + if (mesh) { + this.gridMesh = new Mesh('grid', this.scene); + const data = new VertexData(); - data.colors = mesh.colors; - data.indices = mesh.indices; - data.positions = mesh.positions; + data.colors = mesh.colors; + data.indices = mesh.indices; + data.positions = mesh.positions; - data.applyToMesh(this.gridMesh); - this.gridMesh.convertToFlatShadedMesh(); + data.applyToMesh(this.gridMesh); + this.gridMesh.convertToFlatShadedMesh(); + } } private createCamera(): void { @@ -121,7 +123,7 @@ export class SceneViewerService { } private createLight(): void { - this.light = new HemisphericLight('light', new Vector3(0, 1, -1), this.scene); + this.light = new HemisphericLight('light', new Vector3(0, 1, -2), this.scene); } private registerPointerPick(): void { diff --git a/libs/vdb/src/lib/tools/grid-to-mesh.ts b/libs/vdb/src/lib/tools/grid-to-mesh.ts index 84f6f377..fe5218ec 100644 --- a/libs/vdb/src/lib/tools/grid-to-mesh.ts +++ b/libs/vdb/src/lib/tools/grid-to-mesh.ts @@ -23,11 +23,15 @@ export interface MeshData { positions: number[]; } -export function gridToMesh(grid: Grid): MeshData { +/** + * Returns a mesh if there are any active voxels saved in the grid. + * Otherwise, returns `undefined` i.e. if there are no active voxels. + */ +export function gridToMesh(grid: Grid): MeshData | undefined { const mesh: MeshData = { - positions: [], - indices: [], colors: [], + indices: [], + positions: [], // normals: [], }; @@ -76,5 +80,5 @@ export function gridToMesh(grid: Grid): MeshData { mesh.colors.push(0, 1, 0, 1); } - return mesh; + return vertexCount !== 0 ? mesh : undefined; } diff --git a/libs/vdb/src/lib/tree/root-node.spec.ts b/libs/vdb/src/lib/tree/root-node.spec.ts index a4b37e17..6ee42d90 100644 --- a/libs/vdb/src/lib/tree/root-node.spec.ts +++ b/libs/vdb/src/lib/tree/root-node.spec.ts @@ -27,12 +27,18 @@ describe('RootNode', () => { expect(root.getValue([0, 0, 0])).toEqual(1); expect(root.getValue([0, 0, 1])).toEqual(-1); - expect(root.getValue([0, 1, 0])).toEqual(5); expect(root.getValue([0, 2, 0])).toEqual(-1); - expect(root.getValue([2, 0, 0])).toEqual(9); expect(root.getValue([3, 0, 0])).toEqual(-1); + + root.setValueOn([0, 0, -1.2], -2); + root.setValueOn([0, -2.5, 0], -5); + root.setValueOn([-3.9, 0, 0], -9); + + expect(root.getValue([0, 0, -1])).toEqual(-2); + expect(root.getValue([0, -2, 0])).toEqual(-5); + expect(root.getValue([-3, 0, 0])).toEqual(-9); }); }); From 97ff0c6a634fe8b844b89579a0d01e662ed66d76 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 19 Dec 2019 10:25:19 +0100 Subject: [PATCH 26/84] test(ui): remove unused imported components --- .../lib/sidenav-shell/sidenav-shell.component.spec.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts index 6830ad8e..3d684bf3 100644 --- a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts +++ b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts @@ -1,14 +1,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatButtonModule, MatIconModule, MatSidenavModule } from '@angular/material'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { SidenavShellModule } from '@talus/ui'; -import { - SidenavShellComponent, - SidenavShellContentComponent, - SidenavShellLeftComponent, - SidenavShellRightComponent, -} from './sidenav-shell.component'; +import { SidenavShellComponent } from './sidenav-shell.component'; +import { SidenavShellModule } from './sidenav-shell.module'; describe('SidenavShellComponent', () => { let component: SidenavShellComponent; From b041d82977d5d0f5a55db3be94f19a303dcea9c2 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 19 Dec 2019 10:33:44 +0100 Subject: [PATCH 27/84] build(CircleCi): use `13.3.0` due failing tests: - Test suite failed to run - Call retries were exceeded at ChildProcessWorker.initialize() - https://github.com/jest-community/vscode-jest/issues/486#issuecomment-563164125 --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6ec44143..172ede23 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,11 +7,11 @@ aliases: # https://github.com/CircleCI-Public/circleci-dockerfiles/tree/master/node/images - &use_docker_node docker: - - image: circleci/node:13.2.0-stretch + - image: circleci/node:13.3.0-stretch - &use_docker_node_browsers docker: - - image: circleci/node:13.2.0-stretch-browsers + - image: circleci/node:13.3.0-stretch-browsers # https://github.com/cypress-io/cypress-docker-images/tree/master/included - &use_docker_cypress_included From a96dfed85c99c21fdc81ee5a1ce1cdcf8f6851c3 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 19 Dec 2019 11:01:58 +0100 Subject: [PATCH 28/84] fix(frontend): add voxel on positive normal - but negative position --- .../scene-viewer-container.component.spec.ts | 7 ++++++- .../scene-viewer-container.component.ts | 10 +++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index 358f8234..cc914e18 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -92,7 +92,7 @@ describe('SceneViewerContainerComponent', () => { ], [ [0, 0, -0.999999], - [0, 0, -2], + [0, 0, -1], [0, 0, 1], ], [ @@ -105,6 +105,11 @@ describe('SceneViewerContainerComponent', () => { [-0, -3, 2], [0, 0, -1], ], + [ + [0.5, 1.4, -1], + [0.5, 1.4, -1], + [0, 0, 1], + ], ])( 'should dispatch `addVoxel` action for %j', (pickedPoint: Coord, position: Coord, normal: Coord) => { diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index fc39f4ef..d9efee4c 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -57,14 +57,18 @@ export class SceneViewerContainerComponent { private calcVoxelToAddPosition(pickInfo: PointerPickInfo): Coord { const pickedIntegerPoint = this.roundDimensionAlongNormal(pickInfo); + // VDB removes fractional-part of the coordinate, i.e. 0.54 -> 0. + // Therefore, positive numbers are getting rounded down (1.9 -> 1) and + // negative numbers are getting rounded up (-0.2 -> 0). + // Hence, the subtraction of 1 is needed. const newPoint: Coord = [ - pickedIntegerPoint[0] < 0 || pickInfo.normal[0] < 0 + pickInfo.normal[0] < 0 || (pickInfo.normal[0] === 0 && pickedIntegerPoint[0] < 0) ? pickedIntegerPoint[0] - 1 : pickedIntegerPoint[0], - pickedIntegerPoint[1] < 0 || pickInfo.normal[1] < 0 + pickInfo.normal[1] < 0 || (pickInfo.normal[1] === 0 && pickedIntegerPoint[1] < 0) ? pickedIntegerPoint[1] - 1 : pickedIntegerPoint[1], - pickedIntegerPoint[2] < 0 || pickInfo.normal[2] < 0 + pickInfo.normal[2] < 0 || (pickInfo.normal[2] === 0 && pickedIntegerPoint[2] < 0) ? pickedIntegerPoint[2] - 1 : pickedIntegerPoint[2], ]; From 575e9db8e8abb95ce17e538ee937c82cdcad1285 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 19 Dec 2019 11:56:47 +0100 Subject: [PATCH 29/84] test(frontend): set `setupFilesAfterEnv` - to run in Jest tests within WebStorm - https://github.com/nrwl/nx/issues/1439#issuecomment-561268656 --- apps/frontend/jest.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/frontend/jest.config.js b/apps/frontend/jest.config.js index a577bddd..fcec8211 100644 --- a/apps/frontend/jest.config.js +++ b/apps/frontend/jest.config.js @@ -19,4 +19,8 @@ module.exports = { 'jest-preset-angular/AngularSnapshotSerializer.js', 'jest-preset-angular/HTMLCommentSerializer.js', ], + // https://github.com/nrwl/nx/issues/1439#issuecomment-561268656 + // When using `Run test` directly in WebStorm, change the used config to + // this file i.e. `./frontend/jest.config.js` and not `/jest.config.js`. + setupFilesAfterEnv: ['./src/test-setup.ts'], }; From 596f386946c7d3a969dc19105a352a5d654dd1e2 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 19 Dec 2019 12:40:26 +0100 Subject: [PATCH 30/84] test(frontend): set `globals`>`tsConfig` - to run in Jest tests within WebStorm with SCSS imports in component --- jest.config.js | 3 --- libs/ui/jest.config.js | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/jest.config.js b/jest.config.js index 97fc9385..4f64d597 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,3 @@ -// const ignoreLibs = ['@babylonjs/core']; - module.exports = { testMatch: ['**/+(*.)+(spec|test).+(ts|js)?(x)'], transform: { @@ -11,5 +9,4 @@ module.exports = { moduleNameMapper: { '@babylonjs': 'babylonjs', }, - // transformIgnorePatterns: [`/node_modules/(?!(${ignoreLibs.join('|')})/)`], }; diff --git a/libs/ui/jest.config.js b/libs/ui/jest.config.js index 5c7b5a4e..35d35ffa 100644 --- a/libs/ui/jest.config.js +++ b/libs/ui/jest.config.js @@ -19,4 +19,23 @@ module.exports = { 'jest-preset-angular/AngularSnapshotSerializer.js', 'jest-preset-angular/HTMLCommentSerializer.js', ], + // https://github.com/nrwl/nx/issues/1439#issuecomment-561268656 + // When using `Run test` directly in WebStorm, change the used config to + // this file i.e. `./ui/jest.config.js` and not `/jest.config.js`. + // Otherwise, following error might occur: + // - Cannot find module '@talus/ui' + // - Zone is needed for the async() test helper but could not be found. + setupFilesAfterEnv: ['./src/test-setup.ts'], + + // https://github.com/thymikee/jest-preset-angular/issues/293#issuecomment-513544717 + // When using `Run test` directly in WebStorm, the scss couldn't be loaded. + // - Error: connect ECONNREFUSED 127.0.0.1:80 + // - Error: Uncaught (in promise): Failed to load *.component.scss + globals: { + 'ts-jest': { + tsConfig: '/tsconfig.spec.json', + // stringifyContentPathRegex: '\\.html$', + // astTransformers: [require.resolve('jest-preset-angular/InlineHtmlStripStylesTransformer')], + }, + }, }; From c1ddf8398156fe8cf5b5bdacb48bb4420eb978da Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 19 Dec 2019 14:09:16 +0100 Subject: [PATCH 31/84] build(CircleCi): use `13.4.0` --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 172ede23..854fadfc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,11 +7,11 @@ aliases: # https://github.com/CircleCI-Public/circleci-dockerfiles/tree/master/node/images - &use_docker_node docker: - - image: circleci/node:13.3.0-stretch + - image: circleci/node:13.4.0-stretch - &use_docker_node_browsers docker: - - image: circleci/node:13.3.0-stretch-browsers + - image: circleci/node:13.4.0-stretch-browsers # https://github.com/cypress-io/cypress-docker-images/tree/master/included - &use_docker_cypress_included From 3726648eb4a46af90600984e78169701109897b9 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 19 Dec 2019 14:31:27 +0100 Subject: [PATCH 32/84] build(dep): update diverse dependencies: - @ngrx/effects, @ngrx/store - core-js, mnemonist, codelyzer - @types/jest, @types/node --- package.json | 14 ++++++------ yarn.lock | 60 ++++++++++++++++++++++++++-------------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 9549c7db..050420e9 100644 --- a/package.json +++ b/package.json @@ -46,12 +46,12 @@ "@angular/router": "8.2.14", "@babylonjs/core": "4.1.0-beta.12", "@babylonjs/materials": "4.1.0-beta.12", - "@ngrx/effects": "8.5.2", - "@ngrx/store": "8.5.2", + "@ngrx/effects": "8.6.0", + "@ngrx/store": "8.6.0", "@nrwl/angular": "8.9.0", - "core-js": "3.5.0", + "core-js": "3.6.0", "hammerjs": "2.0.8", - "mnemonist": "0.31.3", + "mnemonist": "0.32.0", "rxjs": "6.5.3", "zone.js": "0.10.2" }, @@ -66,11 +66,11 @@ "@nrwl/node": "8.9.0", "@nrwl/workspace": "8.9.0", "@types/benchmark": "1.0.31", - "@types/jest": "24.0.23", - "@types/node": "12.12.17", + "@types/jest": "24.0.24", + "@types/node": "12.12.21", "babylonjs": "4.1.0-beta.12", "benchmark": "2.1.4", - "codelyzer": "5.2.0", + "codelyzer": "5.2.1", "cypress": "3.7.0", "dotenv": "8.2.0", "gh-pages": "2.1.1", diff --git a/yarn.lock b/yarn.lock index fcfbc79b..a5f22d7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1162,15 +1162,15 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@ngrx/effects@8.5.2": - version "8.5.2" - resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-8.5.2.tgz#c4f81947f4028a0d678ed2641101481cdbe11b59" - integrity sha512-i2rKLmFcfJmPPQRul1PuXXRuBX2q1g7tK6DbWreNabU/46fYlEwqiiW6lU53t3AgJ3yd6UpeLTR6CHTflkzL+w== +"@ngrx/effects@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-8.6.0.tgz#a0d7339597a5128c5cf896ddcf93f73406a45860" + integrity sha512-JdyJLQbv/wnE0ZPY9DcDOtF9PzJuzsKWmIWgIGunHF18wdjk5O8Zpkcrxq18wDRL6geg5UTtNJRMvTQhpDbzow== -"@ngrx/store@8.5.2": - version "8.5.2" - resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-8.5.2.tgz#18e4a39f3e7ac2ec8307653837ec3c4153bde04f" - integrity sha512-JPlc23Aw3rlEKt6LCkg3a0zlo0tEgkohH3CDHVbUIYSgg3DWOnmNfwztbz4pa2u2wua5PfFCovC7HKTNmapx/w== +"@ngrx/store@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-8.6.0.tgz#8540c5bd40b33fc2f443e7e86f47c0d801b8f413" + integrity sha512-K4cvCEa+5hw9qrETQWO+Cha3YbVCAT8yaIKJr/N35KntTL9mQMjoL+51JWLZfBwPV0e19CFgJIyrBnVUTxwr2A== "@ngtools/webpack@8.3.20": version "8.3.20" @@ -1405,10 +1405,10 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@24.0.23": - version "24.0.23" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.23.tgz#046f8e2ade026fe831623e361a36b6fb9a4463e4" - integrity sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg== +"@types/jest@24.0.24": + version "24.0.24" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.24.tgz#0f2f523dc77cc1bc6bef34eaf287ede887a73f05" + integrity sha512-vgaG968EDPSJPMunEDdZvZgvxYSmeH8wKqBlHSkBt1pV2XlLEVDzsj1ZhLuI4iG4Pv841tES61txSBF0obh4CQ== dependencies: jest-diff "^24.3.0" @@ -1427,10 +1427,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== -"@types/node@12.12.17": - version "12.12.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" - integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== +"@types/node@12.12.21": + version "12.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.21.tgz#aa44a6363291c7037111c47e4661ad210aded23f" + integrity sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2076,7 +2076,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axobject-query@^2.0.2: +axobject-query@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== @@ -2934,14 +2934,14 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codelyzer@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-5.2.0.tgz#b0ee573a12779c996090e596c5c1755479d83758" - integrity sha512-izfUfhEOOgAizszPlEDxo71DK/C4wprZw0vkY6UWcOSTQvN1JyfXf9DXwaV7WX+/JC+hH0ShXfdtGLA9Rca7LA== +codelyzer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-5.2.1.tgz#44fd431e128009f38c761828c33ebacba9549d32" + integrity sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA== dependencies: 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" @@ -3170,10 +3170,10 @@ core-js@3.2.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== -core-js@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.5.0.tgz#66df8e49be4bd775e6f952a9d083b756ad41c1ed" - integrity sha512-Ifh3kj78gzQ7NAoJXeTu+XwzDld0QRIwjBLRqAMhuLhP3d2Av5wmgE9ycfnvK6NAEjTkQ1sDPeoEZAWO3Hx1Uw== +core-js@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.0.tgz#2b854e451de1967d1e29896025cdc13a2518d9ea" + integrity sha512-AHPTNKzyB+YwgDWoSOCaid9PUSEF6781vsfiK8qUz62zRR448/XgK2NtCbpiUGizbep8Lrpt0Du19PpGGZvw3Q== core-js@^2.4.0: version "2.6.9" @@ -6863,10 +6863,10 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" -mnemonist@0.31.3: - version "0.31.3" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.31.3.tgz#bb2857ad8c00891c23684af67d7ad39676780178" - integrity sha512-COyTIeUNrltQ5e08mxkJmzagJF6c6vwYl2dI6DtsH8qtutFEgoIsJ/jqXtS57M52DreGKVtOusINzDRk2r3YMA== +mnemonist@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.32.0.tgz#2c6d1dd12cb69ca2ed79a636ba9ffe5a6e9f2573" + integrity sha512-WMVGPpT8guWwnsnw+WibOvInBnPfXFG+9SD+mg2+YgPEuW9Gdz9D2MEi05ko6RG1ui0RHljc+yYAvOHQn3GbbQ== dependencies: obliterator "^1.5.0" From 4d690b9c6a7896d8ba04df9c384ebfda9cc090d4 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Fri, 20 Dec 2019 11:54:28 +0100 Subject: [PATCH 33/84] doc(readme): record macro & git setup --- README.md | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 25a41e36..06a8e3e4 100644 --- a/README.md +++ b/README.md @@ -53,11 +53,18 @@ This project was generated using [Nx](https://nx.dev) with the following command - https://github.com/nvm-sh/nvm#installation-and-update 2. Install (latest) `node` - `nvm install node` - - or add a version `nvm install 12.3.1` - - set a version as default `nvm alias default 12.3.1` + - or add a version `nvm install 13.4.0` + - set a version as default `nvm alias default 13.4.0` ### Yarn +#### Manually + +1. Install `yarn` + - https://yarnpkg.com/lang/en/docs/install/#debian-stable + +#### With brew + 1. Install `yarn` - `brew install yarn` 2. Update @@ -94,17 +101,33 @@ Setting up a macro which will fix all the linting issues, optimizes the imports - Working Dir: `$FileDir$` - Advanced Options: None, all deactivated -2. Record macro in this order +2. Record macro (Edit > Macros > Start Macro Recording) in this order - - Action: TsLintFileFixAction + - Action: TsLintFileFixAction (with opened \*.ts file) - Action: OptimizeImports - Action: ReformatWithPrettierAction - - Action: FileWatcher.runForFiles + - Action: FileWatcher.runForFiles (with opened \*.scss file) - Action: SaveAll 3. Save macro as e.g. `Fix & Save` -4. Assign Keyboard shortcut `Ctrl` + `S` to macro `Fix & Save` +4. Assign Keyboard shortcut `Ctrl` + `S` to macro `Fix & Save` (search for macro) + +### Git + +1. Make sure that `git-completion` is working, otherwise run: + `sudo apt-get install git-core bash-completion` + +2. Add branch name to shell + - Download & save + [git-prompt.sh](https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh) + - Add in `.bashrc`: + ``` + # GIT prompt + . ~/Projects/git-prompt.sh + export GIT_PS1_SHOWDIRTYSTATE=1 + export PS1='\[\e[1;32m\]\u\[\e[m\]@\[\e[33m\]\h\[\e[m\]:\[\e[34m\]\w\[\e[m\]$(__git_ps1 " (%s)")\$ ' + ``` ## Build From 2a3f37ab55ce135f598865f97bd8121f31539fb6 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Fri, 20 Dec 2019 13:54:17 +0100 Subject: [PATCH 34/84] build(dep): `@angular-devkit/build-angular` & `@angular/cli` --- package.json | 4 +- yarn.lock | 857 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 783 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index 050420e9..dd0b33a6 100644 --- a/package.json +++ b/package.json @@ -56,8 +56,8 @@ "zone.js": "0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "0.803.20", - "@angular/cli": "8.3.20", + "@angular-devkit/build-angular": "0.803.21", + "@angular/cli": "8.3.21", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", "@babylonjs/inspector": "4.1.0-beta.12", diff --git a/yarn.lock b/yarn.lock index a5f22d7a..1d45ac82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,26 +10,26 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/architect@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.20.tgz#792093259d69012c0763aa9176181b255d8795c8" - integrity sha512-NjyDJ61i9kh8J+qXt0E2j+P5Xsmi2mPasBzwcQyrZZGiho4zC0IFxcdxyzcsXFEupmilJKkjdt2g4QQRC5rUDQ== +"@angular-devkit/architect@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.21.tgz#0e76b6f646ebdbd9bb88d3972b2ca66fed950f7d" + integrity sha512-E2K/YexIWVyKM/xmyxvDjkJf+wX9u4c8YYpNaK4htsRzA06juc7N1MhlL/jURZiRl5b/K9sapYeq3tMX76saxA== dependencies: - "@angular-devkit/core" "8.3.20" + "@angular-devkit/core" "8.3.21" rxjs "6.4.0" -"@angular-devkit/build-angular@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.20.tgz#b19b0d82c75cbdd939b589a33ccb60e2c9f6eec9" - integrity sha512-JDZkZjOqPbOtCMsSKxQf9C+uSTZ7fQGlKGsCpJMzfa4iQ0WrmrhZvnRKQeEpMTTZTpuou/HQeQjyDV+Sx3yumw== - dependencies: - "@angular-devkit/architect" "0.803.20" - "@angular-devkit/build-optimizer" "0.803.20" - "@angular-devkit/build-webpack" "0.803.20" - "@angular-devkit/core" "8.3.20" - "@babel/core" "7.5.5" - "@babel/preset-env" "7.5.5" - "@ngtools/webpack" "8.3.20" +"@angular-devkit/build-angular@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.21.tgz#f3d12ea09748b05eb2d835a7de7997599fb6b752" + integrity sha512-flfgflvfpwdsm3x/U7QnfbtyZPEbsVipzQAoao1Zo58Beq1a+NsKsWbjrF/x4TSoI2czt0OVWXNytlfXM7LMhg== + dependencies: + "@angular-devkit/architect" "0.803.21" + "@angular-devkit/build-optimizer" "0.803.21" + "@angular-devkit/build-webpack" "0.803.21" + "@angular-devkit/core" "8.3.21" + "@babel/core" "7.7.5" + "@babel/preset-env" "7.7.6" + "@ngtools/webpack" "8.3.21" ajv "6.10.2" autoprefixer "9.6.1" browserslist "4.6.6" @@ -37,7 +37,7 @@ caniuse-lite "1.0.30000989" circular-dependency-plugin "5.2.0" clean-css "4.2.1" - copy-webpack-plugin "5.0.4" + copy-webpack-plugin "5.1.1" core-js "3.2.1" file-loader "4.2.0" find-cache-dir "3.0.0" @@ -70,7 +70,7 @@ stylus "0.54.5" stylus-loader "3.0.2" terser "4.3.9" - terser-webpack-plugin "1.4.1" + terser-webpack-plugin "1.4.3" tree-kill "1.2.1" webpack "4.39.2" webpack-dev-middleware "3.7.2" @@ -80,10 +80,10 @@ webpack-subresource-integrity "1.1.0-rc.6" worker-plugin "3.2.0" -"@angular-devkit/build-optimizer@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.20.tgz#36f92c350c1cb3d3d7f1e0f0086feed726478902" - integrity sha512-Vzxf1g1EuzaPBoScDYUhyxemi5chlgnpWmObNo5dzVAVzjxo5gJeDIGpiyDqHvr6LBkprqb6XHcZhMWqIcdIHg== +"@angular-devkit/build-optimizer@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.21.tgz#ecb3b6bba4b13ffbfbdbefb5997f690aa3635203" + integrity sha512-gNN6kPaF4phZco3TmsrNr9tIEKXYsoSeoaUiDUfgmCYwa7fAqM8Ojh7HX6IQuB2PpVmEwKGlCcSh6xDtB33NjA== dependencies: loader-utils "1.2.3" source-map "0.7.3" @@ -100,13 +100,13 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/build-webpack@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.20.tgz#c03bd23a9f147c07201db681bf9fc3bfad95f9d9" - integrity sha512-35af8kD3KG/cIv7AB09YNER5HIPlx55ipBxdVk8D+X3MuUcTmD6fFvqXcV0EPlD1vQephthfzSgtNpvuPv4xuA== +"@angular-devkit/build-webpack@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.21.tgz#fd45754c0123f44fcde8fa6411ebea52d98054f0" + integrity sha512-zCFVla/Xdk8qGVybvnHtoKml2h0/ShasSjT55VNZO1XaTCMqYkQEwwqSGEiVajpauafWjKrKxxBhsmWoI4efAA== dependencies: - "@angular-devkit/architect" "0.803.20" - "@angular-devkit/core" "8.3.20" + "@angular-devkit/architect" "0.803.21" + "@angular-devkit/core" "8.3.21" rxjs "6.4.0" "@angular-devkit/core@8.3.14": @@ -120,10 +120,10 @@ rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/core@8.3.20": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.20.tgz#8a9e17e706905efab9875c16690e1d9328c9d5dd" - integrity sha512-UCfW/BJBJnioJU34QennQhA4o+rLoCXWiSrI2LM7yw8/MEM9I8KbqRETP1My3HjHkQnvP+Qh3noedpcu3Nnt8A== +"@angular-devkit/core@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.21.tgz#447022813e46333e930816c287722d06b9c4dd3a" + integrity sha512-BYyVbrbys535FplX0+GVOlYBg/cyk1U5SRhSxRRFZYi9epVlEBBPk8/6wV4cQPGb6EwXkVj7YtPWXjXcGfzWmA== dependencies: ajv "6.10.2" fast-json-stable-stringify "2.0.0" @@ -139,12 +139,12 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/schematics@8.3.20": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.20.tgz#80e7c31ebfd8f7f8500bfa1cae5c39980b962d6a" - integrity sha512-sDHZakh4e3A5WenR9zr1x6Va9GNRqQlRhqT3xcbkG88v2M0YqEt7dHB7YwnOhm7zSxiWQM8PdWEQHiQ4iu9NyQ== +"@angular-devkit/schematics@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.21.tgz#80d515f480180be18a4130ea691f90153bcab3ea" + integrity sha512-+wH0362CRr/SijVX4w2baY2ANZ4scQ1k2xO8lT+NMeZQkw3IJQPOfwk1IaqiAs2xuBJZcSDH1Gn80+Jh4Dit7w== dependencies: - "@angular-devkit/core" "8.3.20" + "@angular-devkit/core" "8.3.21" rxjs "6.4.0" "@angular-eslint/builder@0.0.1-alpha.17": @@ -168,16 +168,16 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@8.3.20": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.20.tgz#63e8f626e7dcf37e73cda820ab38bcac13423326" - integrity sha512-bCo8zVFZ6iPc1EnHmVCmKvIcV7YkvalBKGNU7LtVHq6qZBI+ZmFtuyL5obKvFg1vJcminjKcY/UcMr9uGcAQrQ== +"@angular/cli@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.21.tgz#cbb05b86b7f34ecd81d52ccad922359e66a16a15" + integrity sha512-ZZpA7mMfIobFT06rBNxm8vucAh8W2s0huJZ4iL0BPujnhIr71PL+gDwssySWDEz2q6i4CkH9QRH76DHhtL6VSQ== dependencies: - "@angular-devkit/architect" "0.803.20" - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" - "@schematics/angular" "8.3.20" - "@schematics/update" "0.803.20" + "@angular-devkit/architect" "0.803.21" + "@angular-devkit/core" "8.3.21" + "@angular-devkit/schematics" "8.3.21" + "@schematics/angular" "8.3.21" + "@schematics/update" "0.803.21" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "^4.1.1" @@ -278,7 +278,27 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.5.5", "@babel/core@>=7.2.2", "@babel/core@^7.0.1", "@babel/core@^7.1.0": +"@babel/core@7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.5.tgz#ae1323cd035b5160293307f50647e83f8ba62f7e" + integrity sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.5" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.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" + +"@babel/core@>=7.2.2", "@babel/core@^7.0.1", "@babel/core@^7.1.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== @@ -309,6 +329,16 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" + integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== + dependencies: + "@babel/types" "^7.7.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -316,6 +346,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-annotate-as-pure@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" + integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" @@ -324,6 +361,14 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" + integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-call-delegate@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" @@ -333,6 +378,23 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" +"@babel/helper-call-delegate@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" + integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== + dependencies: + "@babel/helper-hoist-variables" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-create-regexp-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" + integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== + dependencies: + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + "@babel/helper-define-map@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" @@ -342,6 +404,15 @@ "@babel/types" "^7.5.5" lodash "^4.17.13" +"@babel/helper-define-map@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" + integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" @@ -350,6 +421,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-explode-assignable-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" + integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== + dependencies: + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -359,6 +438,15 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== + dependencies: + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -366,6 +454,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-hoist-variables@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" @@ -373,6 +468,13 @@ dependencies: "@babel/types" "^7.4.4" +"@babel/helper-hoist-variables@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" + integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-member-expression-to-functions@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" @@ -380,6 +482,13 @@ dependencies: "@babel/types" "^7.5.5" +"@babel/helper-member-expression-to-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" + integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" @@ -387,6 +496,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-module-imports@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" + integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" @@ -399,6 +515,18 @@ "@babel/types" "^7.5.5" lodash "^4.17.13" +"@babel/helper-module-transforms@^7.7.4", "@babel/helper-module-transforms@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" + integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" @@ -406,6 +534,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-optimise-call-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" + integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" @@ -429,6 +564,17 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-remap-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" + integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-wrap-function" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-replace-supers@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" @@ -439,6 +585,16 @@ "@babel/traverse" "^7.5.5" "@babel/types" "^7.5.5" +"@babel/helper-replace-supers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" + integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -447,6 +603,14 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-simple-access@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" + integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== + dependencies: + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" @@ -454,6 +618,13 @@ dependencies: "@babel/types" "^7.4.4" +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== + dependencies: + "@babel/types" "^7.7.4" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -464,6 +635,16 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" +"@babel/helper-wrap-function@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" + integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/helpers@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" @@ -473,6 +654,15 @@ "@babel/traverse" "^7.5.5" "@babel/types" "^7.5.5" +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== + dependencies: + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/highlight@^7.0.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" @@ -487,6 +677,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.7.4", "@babel/parser@^7.7.5": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -496,6 +691,15 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" +"@babel/plugin-proposal-async-generator-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" + integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.7.4" + "@babel/plugin-syntax-async-generators" "^7.7.4" + "@babel/plugin-proposal-dynamic-import@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" @@ -504,6 +708,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import" "^7.2.0" +"@babel/plugin-proposal-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" + integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -512,6 +724,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" +"@babel/plugin-proposal-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" + integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" @@ -520,6 +740,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" +"@babel/plugin-proposal-object-rest-spread@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370" + integrity sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + "@babel/plugin-proposal-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" @@ -528,6 +756,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" +"@babel/plugin-proposal-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" + integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" @@ -537,6 +773,14 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" +"@babel/plugin-proposal-unicode-property-regex@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz#433fa9dac64f953c12578b29633f456b68831c4e" + integrity sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" @@ -544,6 +788,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-async-generators@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" + integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" @@ -551,6 +802,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" + integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" @@ -558,6 +816,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" + integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" @@ -565,6 +830,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-object-rest-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" + integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" @@ -572,6 +844,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" + integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-top-level-await@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" + integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -579,6 +865,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-arrow-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" + integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-async-to-generator@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" @@ -588,6 +881,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" +"@babel/plugin-transform-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" + integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.7.4" + "@babel/plugin-transform-block-scoped-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" @@ -595,6 +897,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-block-scoped-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" + integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-block-scoping@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" @@ -603,6 +912,14 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" +"@babel/plugin-transform-block-scoping@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" + integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + "@babel/plugin-transform-classes@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" @@ -617,6 +934,20 @@ "@babel/helper-split-export-declaration" "^7.4.4" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" + integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-define-map" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" @@ -624,6 +955,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-computed-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" + integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-destructuring@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" @@ -631,6 +969,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-destructuring@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" + integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" @@ -640,6 +985,14 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" +"@babel/plugin-transform-dotall-regex@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz#3e9713f1b69f339e87fa796b097d73ded16b937b" + integrity sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-duplicate-keys@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" @@ -647,6 +1000,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-duplicate-keys@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" + integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" @@ -655,6 +1015,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-exponentiation-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" + integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-for-of@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" @@ -662,6 +1030,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-for-of@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" + integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-function-name@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" @@ -670,6 +1045,14 @@ "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" + integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" @@ -677,6 +1060,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" + integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-member-expression-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" @@ -684,6 +1074,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-member-expression-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" + integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-modules-amd@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" @@ -693,6 +1090,15 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-amd@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c" + integrity sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ== + dependencies: + "@babel/helper-module-transforms" "^7.7.5" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-commonjs@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" @@ -703,6 +1109,16 @@ "@babel/helper-simple-access" "^7.1.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-commonjs@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" + integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q== + dependencies: + "@babel/helper-module-transforms" "^7.7.5" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.7.4" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-systemjs@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" @@ -712,6 +1128,15 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-systemjs@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" + integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== + dependencies: + "@babel/helper-hoist-variables" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-umd@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" @@ -720,6 +1145,14 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-modules-umd@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" + integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== + dependencies: + "@babel/helper-module-transforms" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" @@ -727,6 +1160,13 @@ dependencies: regexp-tree "^0.1.6" +"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" + integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" @@ -734,6 +1174,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-new-target@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" + integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-object-super@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" @@ -742,6 +1189,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.5.5" +"@babel/plugin-transform-object-super@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" + integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/plugin-transform-parameters@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" @@ -751,6 +1206,15 @@ "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-parameters@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz#7a884b2460164dc5f194f668332736584c760007" + integrity sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew== + dependencies: + "@babel/helper-call-delegate" "^7.7.4" + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-property-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" @@ -758,6 +1222,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-property-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" + integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" @@ -765,6 +1236,13 @@ dependencies: regenerator-transform "^0.14.0" +"@babel/plugin-transform-regenerator@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9" + integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw== + dependencies: + regenerator-transform "^0.14.0" + "@babel/plugin-transform-reserved-words@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" @@ -772,6 +1250,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-reserved-words@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" + integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-shorthand-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" @@ -779,6 +1264,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-shorthand-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" + integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-spread@^7.2.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" @@ -786,6 +1278,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" + integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-sticky-regex@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" @@ -794,6 +1293,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" +"@babel/plugin-transform-sticky-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" + integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + "@babel/plugin-transform-template-literals@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" @@ -802,6 +1309,14 @@ "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-template-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" + integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typeof-symbol@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" @@ -809,6 +1324,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-typeof-symbol@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" + integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-unicode-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" @@ -818,7 +1340,72 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/preset-env@7.5.5", "@babel/preset-env@^7.0.0": +"@babel/plugin-transform-unicode-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" + integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/preset-env@7.7.6": + version "7.7.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.6.tgz#39ac600427bbb94eec6b27953f1dfa1d64d457b2" + integrity sha512-k5hO17iF/Q7tR9Jv8PdNBZWYW6RofxhnxKjBMc0nG4JTaWvOTiPoO/RLFwAKcA4FpmuBFm6jkoqaRJLGi0zdaQ== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.7.4" + "@babel/plugin-proposal-dynamic-import" "^7.7.4" + "@babel/plugin-proposal-json-strings" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread" "^7.7.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.7.4" + "@babel/plugin-syntax-async-generators" "^7.7.4" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/plugin-syntax-json-strings" "^7.7.4" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + "@babel/plugin-syntax-top-level-await" "^7.7.4" + "@babel/plugin-transform-arrow-functions" "^7.7.4" + "@babel/plugin-transform-async-to-generator" "^7.7.4" + "@babel/plugin-transform-block-scoped-functions" "^7.7.4" + "@babel/plugin-transform-block-scoping" "^7.7.4" + "@babel/plugin-transform-classes" "^7.7.4" + "@babel/plugin-transform-computed-properties" "^7.7.4" + "@babel/plugin-transform-destructuring" "^7.7.4" + "@babel/plugin-transform-dotall-regex" "^7.7.4" + "@babel/plugin-transform-duplicate-keys" "^7.7.4" + "@babel/plugin-transform-exponentiation-operator" "^7.7.4" + "@babel/plugin-transform-for-of" "^7.7.4" + "@babel/plugin-transform-function-name" "^7.7.4" + "@babel/plugin-transform-literals" "^7.7.4" + "@babel/plugin-transform-member-expression-literals" "^7.7.4" + "@babel/plugin-transform-modules-amd" "^7.7.5" + "@babel/plugin-transform-modules-commonjs" "^7.7.5" + "@babel/plugin-transform-modules-systemjs" "^7.7.4" + "@babel/plugin-transform-modules-umd" "^7.7.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" + "@babel/plugin-transform-new-target" "^7.7.4" + "@babel/plugin-transform-object-super" "^7.7.4" + "@babel/plugin-transform-parameters" "^7.7.4" + "@babel/plugin-transform-property-literals" "^7.7.4" + "@babel/plugin-transform-regenerator" "^7.7.5" + "@babel/plugin-transform-reserved-words" "^7.7.4" + "@babel/plugin-transform-shorthand-properties" "^7.7.4" + "@babel/plugin-transform-spread" "^7.7.4" + "@babel/plugin-transform-sticky-regex" "^7.7.4" + "@babel/plugin-transform-template-literals" "^7.7.4" + "@babel/plugin-transform-typeof-symbol" "^7.7.4" + "@babel/plugin-transform-unicode-regex" "^7.7.4" + "@babel/types" "^7.7.4" + browserslist "^4.6.0" + core-js-compat "^3.4.7" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/preset-env@^7.0.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== @@ -890,6 +1477,15 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" +"@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" @@ -905,6 +1501,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" @@ -914,6 +1525,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@babylonjs/core@4.1.0-beta.12": version "4.1.0-beta.12" resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.12.tgz#9aaaa51fa4fc72defb9e444d8376294f3bccbb0b" @@ -1172,12 +1792,12 @@ resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-8.6.0.tgz#8540c5bd40b33fc2f443e7e86f47c0d801b8f413" integrity sha512-K4cvCEa+5hw9qrETQWO+Cha3YbVCAT8yaIKJr/N35KntTL9mQMjoL+51JWLZfBwPV0e19CFgJIyrBnVUTxwr2A== -"@ngtools/webpack@8.3.20": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.20.tgz#a5288171b67c96e8d3b219f5108f1d6cd962d6a3" - integrity sha512-2e9Kat6PQEzqtNsZZpnOIvoDzyGwMELiuBYBa9keZeaXOD6TxjSyCRzHHXAldAXqvh4Uj2qjTid54Sy14CxtsQ== +"@ngtools/webpack@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.21.tgz#d28f2b66a8aeced5260c42ae722192ec5d5e4e56" + integrity sha512-DGqmFQ52sV4uB3y3spQTNLa69oU5cwd1yIqMB4GSM+Qp+hozdzrPA2gVH90N2DDhWe8icsSQHAtZQiR9+BDL8g== dependencies: - "@angular-devkit/core" "8.3.20" + "@angular-devkit/core" "8.3.21" enhanced-resolve "4.1.0" rxjs "6.4.0" tree-kill "1.2.1" @@ -1306,21 +1926,21 @@ "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" -"@schematics/angular@8.3.20": - version "8.3.20" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.20.tgz#737d0a73e891446899a2267c4cc348b6c5a78ca8" - integrity sha512-Y20pSJhQ0KQd8Tk2kPQlmpRDNDaoIKMeOOGLT2FgCFrumxZXuIbBgN9fGDgW40iI2sq80bccOeo24RKkn3QpcA== +"@schematics/angular@8.3.21": + version "8.3.21" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.21.tgz#4902e0b6e8be47006859009bf96a026e3d39dd27" + integrity sha512-KahQ+dHvTsGOZwY6IdzqJZLDEn0G89rrK3OY+7okZujoaLM+LXhxlPoznW1udnZJVTa3VNxYGx11fkgLtRJRqA== dependencies: - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" + "@angular-devkit/core" "8.3.21" + "@angular-devkit/schematics" "8.3.21" -"@schematics/update@0.803.20": - version "0.803.20" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.20.tgz#f6cce4f0ee435d8a4071817ac43e418f2b51d22a" - integrity sha512-MseLreuHdnSLUEnRxZFVSHKKK+3mGXH12SgOSeirwATIL22Df74+Q5BYvsge/Kd2k6s9ak/NCuRXG7FAo8mkMA== +"@schematics/update@0.803.21": + version "0.803.21" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.21.tgz#572c955bb132348bca03a128491ae264b0068a0a" + integrity sha512-D3BRvEBF2cJEgogvFaNOfqtTFHHv/ctSRfOeAYWjUxILtb+2DpuZ9h5QYDFhN9MPgz/vRaOqFORa3sEZCRkX4g== dependencies: - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" + "@angular-devkit/core" "8.3.21" + "@angular-devkit/schematics" "8.3.21" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.5.5" @@ -2458,6 +3078,15 @@ browserslist@^4.7.3: electron-to-chromium "^1.3.306" node-releases "^1.1.40" +browserslist@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" + integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA== + dependencies: + caniuse-lite "^1.0.30001015" + electron-to-chromium "^1.3.322" + node-releases "^1.1.42" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -2547,7 +3176,7 @@ cacache@12.0.2, cacache@^12.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^11.3.2, cacache@^11.3.3: +cacache@^11.3.2: version "11.3.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== @@ -2567,7 +3196,7 @@ cacache@^11.3.2, cacache@^11.3.3: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^12.0.0: +cacache@^12.0.0, cacache@^12.0.3: version "12.0.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== @@ -2668,6 +3297,11 @@ caniuse-lite@^1.0.30001010: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001012.tgz#653ec635e815b9e0fb801890923b0c2079eb34ec" integrity sha512-7RR4Uh04t9K1uYRWzOJmzplgEOAXbfK72oVNokCdMzA67trrhPzy93ahKk1AWHiA0c58tD2P+NHqxrA8FZ+Trg== +caniuse-lite@^1.0.30001015: + version "1.0.30001016" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66" + integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA== + canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -3094,6 +3728,13 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -3139,12 +3780,12 @@ copy-webpack-plugin@5.0.3: serialize-javascript "^1.7.0" webpack-log "^2.0.0" -copy-webpack-plugin@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz#c78126f604e24f194c6ec2f43a64e232b5d43655" - integrity sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg== +copy-webpack-plugin@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" + integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== dependencies: - cacache "^11.3.3" + cacache "^12.0.3" find-cache-dir "^2.1.0" glob-parent "^3.1.0" globby "^7.1.1" @@ -3152,9 +3793,9 @@ copy-webpack-plugin@5.0.4: 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" core-js-compat@^3.1.1: @@ -3165,6 +3806,14 @@ core-js-compat@^3.1.1: browserslist "^4.6.6" semver "^6.3.0" +core-js-compat@^3.4.7: + version "3.6.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.0.tgz#4eb6cb69d03d99159ed7c860cd5fcf7d23a62ea9" + integrity sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg== + dependencies: + browserslist "^4.8.2" + semver "7.0.0" + core-js@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" @@ -3728,6 +4377,11 @@ electron-to-chromium@^1.3.306: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.314.tgz#c186a499ed2c9057bce9eb8dca294d6d5450facc" integrity sha512-IKDR/xCxKFhPts7h+VaSXS02Z1mznP3fli1BbXWXeN89i2gCzKraU8qLpEid8YzKcmZdZD3Mly3cn5/lY9xsBQ== +electron-to-chromium@^1.3.322: + version "1.3.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" + integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -7065,6 +7719,13 @@ node-releases@^1.1.40: dependencies: semver "^6.3.0" +node-releases@^1.1.42: + version "1.1.43" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.43.tgz#2c6ca237f88ce11d49631f11190bb01f8d0549f2" + integrity sha512-Rmfnj52WNhvr83MvuAWHEqXVoZXCcDQssSOffU4n4XOL9sPrP61mSZ88g25NqmABDvH7PiAlFCzoSCSdzA293w== + dependencies: + semver "^6.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -7445,6 +8106,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -8360,6 +9028,18 @@ regexpu-core@^4.5.4: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + 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" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -8818,6 +9498,11 @@ semver@6.3.0, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -8842,6 +9527,11 @@ serialize-javascript@^1.7.0: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -9649,7 +10339,22 @@ tar@^4, tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.3" -terser-webpack-plugin@1.4.1, terser-webpack-plugin@^1.4.1: +terser-webpack-plugin@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + 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" + +terser-webpack-plugin@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== From 479c81b3edc3e1679c43154f1062165b9d63019f Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Wed, 8 Jan 2020 17:28:24 +0100 Subject: [PATCH 35/84] feat(frontend): draw separate mesh per InternalNode1 (#9) * feat(frontend): add multiple voxels * feat(ui): add output for dropped files * doc(readme): add openVDB repo link * feat(vdb): implement `beginLeafOn` iterator * feat(frontend/vdb): draw InternalNode1 chunks * feat(frontend/vdb): don't return LeafNode * feat(frontend/vdb): don't return `LeafNode` in `setValueAndCache` * feat(frontend/vdb): use only key from accessor * feat(frontend/vdb): remove `getLeafNodeAndCache` * feat(frontend/vdb): remove `beginLeafOn` * feat(frontend/vdb): remove `getLeafNodeAndCache` & `beginLeafOn` * fix(frontend/vdb): dispose mesh instead of just remove it: - so we resolve memory issue * refactor(frontend): optimize scene & mesh - https://doc.babylonjs.com/how_to/optimizing_your_scene * refactor(frontend): remove unused method & obj loader * refactor(vdb): increase `InternalNode1` size to reduce draw calls * refactor(vdb): remove inspector & loading obj * refactor(vdb): align to `probeNode` & `probeNodeAndCache` * refactor(vdb): s/grid-to-mesh/node-to-mesh * refactor(vdb): use un-indexed mesh * fix(ui): read normal directly from picked mesh * refactor(frontend): remove `objFileLoader` * refactor(frontend): s/updateGridMesh/updateNodeMesh & key/Node1Origin --- .../scene-viewer-container/grid.service.ts | 41 +- .../scene-viewer-container.actions.ts | 20 +- .../scene-viewer-container.effects.ts | 46 +- .../scene-viewer/scene-viewer.component.ts | 57 ++- .../lib/scene-viewer/scene-viewer.service.ts | 72 ++- libs/vdb/README.md | 1 + libs/vdb/src/lib/math/coord.ts | 8 + libs/vdb/src/lib/tools/grid-to-mesh.spec.ts | 26 - libs/vdb/src/lib/tools/grid-to-mesh.ts | 84 ---- libs/vdb/src/lib/tools/index.ts | 2 +- libs/vdb/src/lib/tools/node-to-mesh.spec.ts | 26 + libs/vdb/src/lib/tools/node-to-mesh.ts | 451 ++++++++++++++++++ libs/vdb/src/lib/tree/index.ts | 1 + libs/vdb/src/lib/tree/internal-node.spec.ts | 87 ++-- libs/vdb/src/lib/tree/internal-node.ts | 21 +- libs/vdb/src/lib/tree/leaf-node.ts | 10 +- libs/vdb/src/lib/tree/node.ts | 8 + libs/vdb/src/lib/tree/root-node.ts | 20 +- libs/vdb/src/lib/tree/value-accessor.ts | 22 +- 19 files changed, 803 insertions(+), 200 deletions(-) delete mode 100644 libs/vdb/src/lib/tools/grid-to-mesh.spec.ts delete mode 100644 libs/vdb/src/lib/tools/grid-to-mesh.ts create mode 100644 libs/vdb/src/lib/tools/node-to-mesh.spec.ts create mode 100644 libs/vdb/src/lib/tools/node-to-mesh.ts diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index 4b2d47c9..9197d9e7 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Coord, Grid, gridToMesh, MeshData } from '@talus/vdb'; +import { Coord, Grid, MeshData, nodeToMesh } from '@talus/vdb'; /** * Keeps the mutable state of the single grid. This state is not part of the store, due to @@ -12,15 +12,46 @@ export class GridService { grid = new Grid(0); accessor = this.grid.getAccessor(); - addVoxel(xyz: Coord, value: number): void { + /** + * Adds a new voxel via accessor to share access path. + * @returns origin of `InternalNode1` of affected node (node containing added voxel). + */ + addVoxel(xyz: Coord, value: number): Coord { this.accessor.setValue(xyz, value); + + return this.accessor.internalNode1Origin; + } + + addVoxels(coords: Coord[], values: number[]): Coord[] { + const affectedOrigins = new Map(); + + if (coords.length !== values.length) { + coords.forEach(xyz => { + const affected = this.addVoxel(xyz, values[0]); + affectedOrigins.set(affected.toString(), affected); + }); + } else { + coords.forEach((xyz, i) => { + const affected = this.addVoxel(xyz, values[i]); + affectedOrigins.set(affected.toString(), affected); + }); + } + + return Array.from(affectedOrigins.values()); } - removeVoxel(xyz: Coord): void { + removeVoxel(xyz: Coord): Coord { this.accessor.setValueOff(xyz, this.grid.background); + + return this.accessor.internalNode1Origin; } - computeMesh(): MeshData | undefined { - return gridToMesh(this.grid); + computeInternalNode1Mesh(origin: Coord): MeshData | undefined { + const internal1 = this.accessor.probeInternalNode1(origin); + + const mesh = nodeToMesh(internal1); + mesh.origin = internal1.origin; + + return mesh; } } diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts index d8f32abc..1651f716 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts @@ -8,11 +8,27 @@ export const addVoxel = createAction( props<{ position: Coord; value: number }>(), ); export const addVoxelFailed = createAction(`${actionTypePrefix} Add voxel failed`); -export const voxelAdded = createAction(`${actionTypePrefix} Voxel added`); +export const voxelAdded = createAction( + `${actionTypePrefix} Voxel added`, + props<{ affectedOrigins: Coord[] }>(), +); + +export const addVoxels = createAction( + `${actionTypePrefix} Add voxels`, + props<{ positions: Coord[]; values: number[] }>(), +); +export const addVoxelsFailed = createAction(`${actionTypePrefix} Add voxels failed`); +export const voxelsAdded = createAction( + `${actionTypePrefix} Voxels added`, + props<{ affectedOrigins: Coord[] }>(), +); export const removeVoxel = createAction( `${actionTypePrefix} Remove voxel`, props<{ position: Coord }>(), ); export const removeVoxelFailed = createAction(`${actionTypePrefix} Remove voxel failed`); -export const voxelRemoved = createAction(`${actionTypePrefix} Voxel removed`); +export const voxelRemoved = createAction( + `${actionTypePrefix} Voxel removed`, + props<{ affectedOrigins: Coord[] }>(), +); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts index 20571c6c..fda8cc88 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts @@ -7,10 +7,13 @@ import { GridService } from './grid.service'; import { addVoxel, addVoxelFailed, + addVoxels, + addVoxelsFailed, removeVoxel, removeVoxelFailed, voxelAdded, voxelRemoved, + voxelsAdded, } from './scene-viewer-container.actions'; @Injectable() @@ -24,28 +27,43 @@ export class SceneViewerContainerEffects { addVoxel$ = createEffect(() => this.actions$.pipe( ofType(addVoxel), - tap({ - next: ({ position, value }) => { - this.gridService.addVoxel(position, value); - this.sceneViewerService.updateGridMesh(this.gridService.computeMesh()); - }, - }), - map(() => voxelAdded()), + map(({ position, value }) => this.gridService.addVoxel(position, value)), + map(affectedOrigin => voxelAdded({ affectedOrigins: [affectedOrigin] })), catchError(() => of(addVoxelFailed())), ), ); + addVoxels$ = createEffect(() => + this.actions$.pipe( + ofType(addVoxels), + map(({ positions, values }) => this.gridService.addVoxels(positions, values)), + map(affectedOrigins => voxelsAdded({ affectedOrigins })), + catchError(() => of(addVoxelsFailed())), + ), + ); + removeVoxel$ = createEffect(() => this.actions$.pipe( ofType(removeVoxel), - tap({ - next: ({ position }) => { - this.gridService.removeVoxel(position); - this.sceneViewerService.updateGridMesh(this.gridService.computeMesh()); - }, - }), - map(() => voxelRemoved()), + map(({ position }) => this.gridService.removeVoxel(position)), + map(affectedOrigin => voxelRemoved({ affectedOrigins: [affectedOrigin] })), catchError(() => of(removeVoxelFailed())), ), ); + + updateGridMesh$ = createEffect( + () => + this.actions$.pipe( + ofType(voxelAdded, voxelsAdded, voxelRemoved), + tap({ + next: ({ affectedOrigins }) => { + affectedOrigins.map(origin => { + const mesh = this.gridService.computeInternalNode1Mesh(origin); + this.sceneViewerService.updateNodeMesh(mesh); + }); + }, + }), + ), + { dispatch: false }, + ); } diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts index 6c5538ae..5d363801 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, ElementRef, + EventEmitter, HostListener, OnInit, Output, @@ -12,25 +13,71 @@ import { SceneViewerService } from './scene-viewer.service'; @Component({ selector: 'ui-scene-viewer', template: ` - + `, styleUrls: ['./scene-viewer.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) export class SceneViewerComponent implements OnInit { + constructor(private sceneViewerService: SceneViewerService) {} + @ViewChild('canvas', { static: true }) canvas: ElementRef; @Output() pointerPick = this.sceneViewerService.pointerPick$; - constructor(private sceneViewerService: SceneViewerService) {} + @Output() dropFiles = new EventEmitter(); + + ngOnInit(): void { + this.sceneViewerService.initialize(this.canvas.nativeElement); + this.sceneViewerService.startRendering(); + } @HostListener('window:resize') onWindowsResize(): void { this.sceneViewerService.resizeView(); } - ngOnInit(): void { - this.sceneViewerService.initialize(this.canvas.nativeElement); - this.sceneViewerService.startRendering(); + onDragOver(event: DragEvent): void { + // Prevent file from being opened + event.preventDefault(); + } + + onDrop(event: DragEvent): void { + // Prevent file from being opened + event.preventDefault(); + + this.dropFiles.emit(this.getFiles(event)); + } + + // Source: https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop + private getFiles(event: DragEvent): File[] { + return event.dataTransfer.items + ? this.getFilesFromDataTransferItemList(event) + : this.getFilesFromDataTransfer(event); + } + + private getFilesFromDataTransferItemList(event: DragEvent): File[] { + const files: File[] = []; + + // Use DataTransferItemList interface to access the file(s) + for (let i = 0; i < event.dataTransfer.items.length; i++) { + // If dropped items aren't files, reject them + if (event.dataTransfer.items[i].kind === 'file') { + files.push(event.dataTransfer.items[i].getAsFile()); + } + } + + return files; + } + + private getFilesFromDataTransfer(event: DragEvent): File[] { + const files: File[] = []; + + // Use DataTransfer interface to access the file(s) + for (let i = 0; i < event.dataTransfer.files.length; i++) { + files.push(event.dataTransfer.files[i]); + } + + return files; } } diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index 1ffeb152..cc507dec 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -7,9 +7,11 @@ import { Engine } from '@babylonjs/core/Engines/engine'; import { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight'; import '@babylonjs/core/Materials/standardMaterial'; import { Vector3 } from '@babylonjs/core/Maths/math.vector'; +import { VertexBuffer } from '@babylonjs/core/Meshes/buffer'; import { Mesh } from '@babylonjs/core/Meshes/mesh'; import { VertexData } from '@babylonjs/core/Meshes/mesh.vertexData'; import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder'; +import { TransformNode } from '@babylonjs/core/Meshes/transformNode'; import '@babylonjs/core/Physics/physicsHelper'; // Needed for `onPointerPick` import { Scene } from '@babylonjs/core/scene'; import { Coord, MeshData } from '@talus/vdb'; @@ -52,12 +54,11 @@ export class CameraFactory { */ @Injectable() export class SceneViewerService { - scene: Scene; - gridMesh: Mesh; - pointerPick$ = new Subject(); private engine: Engine; + private scene: Scene; + private gridNode: TransformNode; // @ts-ignore: noUnusedLocals private light: HemisphericLight; @@ -65,8 +66,7 @@ export class SceneViewerService { initialize(canvas: HTMLCanvasElement): void { this.engine = this.engineFactory.create(canvas); - this.scene = new Scene(this.engine); - + this.createScene(); this.createCamera(); this.createLight(); @@ -86,22 +86,43 @@ export class SceneViewerService { this.engine.resize(); } - updateGridMesh(mesh?: MeshData): void { - this.scene.removeMesh(this.gridMesh); + updateNodeMesh(mesh?: MeshData): void { + const meshName = `node1 [${mesh.origin}]`; + + this.deleteMesh(meshName); if (mesh) { - this.gridMesh = new Mesh('grid', this.scene); const data = new VertexData(); + const nodeMesh = new Mesh(meshName, this.scene, this.gridNode); + // https://www.html5gamedevs.com/topic/31617-mesh-without-indices/?tab=comments#comment-181659 + // https://doc.babylonjs.com/how_to/optimizing_your_scene#using-unindexed-meshes + nodeMesh._unIndexed = true; data.colors = mesh.colors; - data.indices = mesh.indices; + data.normals = mesh.normals; data.positions = mesh.positions; - data.applyToMesh(this.gridMesh); - this.gridMesh.convertToFlatShadedMesh(); + data.applyToMesh(nodeMesh); + + // https://doc.babylonjs.com/how_to/optimizing_your_scene + // https://www.html5gamedevs.com/topic/12504-performancedraw-calls/ + nodeMesh.freezeNormals(); + nodeMesh.freezeWorldMatrix(); } } + private createScene(): void { + // https://doc.babylonjs.com/how_to/optimizing_your_scene + this.scene = new Scene(this.engine, { + useGeometryUniqueIdsMap: true, + useClonedMeshhMap: true, + }); + this.scene.freezeMaterials(); + + // Used only as parent to have all nodes grouped together + this.gridNode = new TransformNode('grid', this.scene); + } + private createCamera(): void { const camera: ArcRotateCamera = this.cameraFactory.create( 'camera', @@ -113,8 +134,9 @@ export class SceneViewerService { ); camera.inertia = 0; camera.panningInertia = 0; + camera.wheelPrecision = 1.0; - camera.panningSensibility = 20; + camera.panningSensibility = 10; camera.angularSensibilityX = 200; camera.angularSensibilityY = 100; @@ -131,12 +153,36 @@ export class SceneViewerService { const info: PointerPickInfo = { pickedPoint: vector3ToCoord(pickInfo.pickedPoint), pointerButton: event.button, - normal: vector3ToCoord(pickInfo.getNormal()), + normal: this.getNormal(pickInfo), }; this.pointerPick$.next(info); }; } + + /** + * PickingInfo.getNormal() requires to have indices which are not available + * for an unindexed custom mesh. Therefore, read normals directly from picked mesh. + * + * https://github.com/BabylonJS/Babylon.js/blob/master/src/Collisions/pickingInfo.ts#L65 + */ + private getNormal(pickInfo: PickingInfo): Coord { + const normals = pickInfo.pickedMesh.getVerticesData(VertexBuffer.NormalKind); + + return [ + normals[pickInfo.faceId * 9], + normals[pickInfo.faceId * 9 + 1], + normals[pickInfo.faceId * 9 + 2], + ]; + } + + private deleteMesh(name: string): void { + const oldMesh = this.scene.getMeshByName(name); + + if (oldMesh) { + oldMesh.dispose(); + } + } } function vector3ToCoord(vector: Vector3): Coord { diff --git a/libs/vdb/README.md b/libs/vdb/README.md index bc063f73..76cc2814 100644 --- a/libs/vdb/README.md +++ b/libs/vdb/README.md @@ -17,6 +17,7 @@ When manipulating data in OpenVDB, the three essential objects are ### Sources +- [Repo](https://github.com/AcademySoftwareFoundation/openvdb) - [Overview](https://www.openvdb.org/documentation/doxygen/overview.html) - [Cookbook](https://www.openvdb.org/documentation/doxygen/codeExamples.html) diff --git a/libs/vdb/src/lib/math/coord.ts b/libs/vdb/src/lib/math/coord.ts index 0001351f..f0ec4069 100644 --- a/libs/vdb/src/lib/math/coord.ts +++ b/libs/vdb/src/lib/math/coord.ts @@ -24,3 +24,11 @@ export function createMaxCoord(): Coord { export function createMinCoord(): Coord { return [Number.MIN_VALUE, Number.MIN_VALUE, Number.MIN_VALUE]; } + +export function areEqual(c1: Coord, c2: Coord): boolean { + return c1[0] === c2[0] && c1[1] === c2[1] && c1[2] === c2[2]; +} + +export function clone(c: Coord): Coord { + return [c[0], c[1], c[2]]; +} diff --git a/libs/vdb/src/lib/tools/grid-to-mesh.spec.ts b/libs/vdb/src/lib/tools/grid-to-mesh.spec.ts deleted file mode 100644 index ab6a602f..00000000 --- a/libs/vdb/src/lib/tools/grid-to-mesh.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Grid } from '../grid'; -import { gridToMesh } from './grid-to-mesh'; - -describe('gridToMesh()', () => { - it('should generate the mesh', () => { - const grid = new Grid(0); - const accessor = grid.getAccessor(); - - accessor.setValue([0, 0, 0], 1); - accessor.setValue([0, 0, 1], 1); - - const meshData = gridToMesh(grid); - - const voxels = 2; - - const corners = 8; - const triangles = 12; - - const xyz = 3; - const rgba = 4; - - expect(meshData.positions.length).toEqual(voxels * corners * xyz); - expect(meshData.colors.length).toEqual(voxels * corners * rgba); - expect(meshData.indices.length).toEqual(voxels * triangles * xyz); - }); -}); diff --git a/libs/vdb/src/lib/tools/grid-to-mesh.ts b/libs/vdb/src/lib/tools/grid-to-mesh.ts deleted file mode 100644 index fe5218ec..00000000 --- a/libs/vdb/src/lib/tools/grid-to-mesh.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Babylon.js has a left-handed coordinate system with Y pointing up. - * Furthermore, the front face of a facet is considered the face where the facet’s vertices - * are positioned counterclockwise. - * - * Position of a facet is the location of the facet’s barycenter (a.k.a. centroid). - * - * 6-------7 - * /| /| - * / | / | - * Y 3--|----2 | - * | Z | 5----|--4 - * | / | / | / - * 0--- X 0-------1 - */ - -import { Grid } from '../grid'; - -export interface MeshData { - colors: number[]; - indices: number[]; - // normals: number[]; - positions: number[]; -} - -/** - * Returns a mesh if there are any active voxels saved in the grid. - * Otherwise, returns `undefined` i.e. if there are no active voxels. - */ -export function gridToMesh(grid: Grid): MeshData | undefined { - const mesh: MeshData = { - colors: [], - indices: [], - positions: [], - // normals: [], - }; - - let vertexCount = 0; - for (const voxel of grid.beginVoxelOn()) { - const [x, y, z] = voxel.globalCoord; - - mesh.indices.push(...[5, 0, 3, 3, 6, 5].map(i => i + vertexCount)); // Left - mesh.indices.push(...[1, 4, 7, 7, 2, 1].map(i => i + vertexCount)); // Right - - mesh.indices.push(...[5, 4, 1, 1, 0, 5].map(i => i + vertexCount)); // Bottom - mesh.indices.push(...[7, 6, 3, 3, 2, 7].map(i => i + vertexCount)); // Top - - mesh.indices.push(...[0, 1, 2, 2, 3, 0].map(i => i + vertexCount)); // Front - mesh.indices.push(...[4, 5, 6, 6, 7, 4].map(i => i + vertexCount)); // Back - - // mesh.normals.push(-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); // Left - // mesh.normals.push(1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0); // Right - - // mesh.normals.push(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); // Bottom - // mesh.normals.push(0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0); // Top - - // mesh.normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); // Front - // mesh.normals.push(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1); // Back - - mesh.positions.push(x, y, z); // 0 - mesh.positions.push(x + 1, y, z); // 1 - mesh.positions.push(x + 1, y + 1, z); // 2 - mesh.positions.push(x, y + 1, z); // 3 - - mesh.positions.push(x + 1, y, z + 1); // 4 - mesh.positions.push(x, y, z + 1); // 5 - mesh.positions.push(x, y + 1, z + 1); // 6 - mesh.positions.push(x + 1, y + 1, z + 1); // 7 - - vertexCount += 8; - - mesh.colors.push(0, 1, 0, 1); - mesh.colors.push(0, 1, 0, 1); - mesh.colors.push(0, 1, 0, 1); - mesh.colors.push(0, 1, 0, 1); - - mesh.colors.push(0, 1, 0, 1); - mesh.colors.push(0, 1, 0, 1); - mesh.colors.push(0, 1, 0, 1); - mesh.colors.push(0, 1, 0, 1); - } - - return vertexCount !== 0 ? mesh : undefined; -} diff --git a/libs/vdb/src/lib/tools/index.ts b/libs/vdb/src/lib/tools/index.ts index e2f1c696..479b8e5c 100644 --- a/libs/vdb/src/lib/tools/index.ts +++ b/libs/vdb/src/lib/tools/index.ts @@ -1 +1 @@ -export * from './grid-to-mesh'; +export * from './node-to-mesh'; diff --git a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts new file mode 100644 index 00000000..60cdd34e --- /dev/null +++ b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts @@ -0,0 +1,26 @@ +import { Grid } from '../grid'; +import { nodeToMesh } from './node-to-mesh'; + +describe('nodeToMesh()', () => { + it('should generate the mesh', () => { + const grid = new Grid(0); + const accessor = grid.getAccessor(); + + accessor.setValue([0, 0, 0], 1); + accessor.setValue([0, 0, 1], 1); + + const meshData = nodeToMesh(grid.tree.root); + + const voxels = 2; + + const triangles = 12; + const triangleCorners = triangles * 3; + + const xyz = 3; + const rgba = 4; + + expect(meshData.positions.length).toEqual(voxels * triangleCorners * xyz); + expect(meshData.colors.length).toEqual(voxels * triangleCorners * rgba); + expect(meshData.normals.length).toEqual(meshData.positions.length); + }); +}); diff --git a/libs/vdb/src/lib/tools/node-to-mesh.ts b/libs/vdb/src/lib/tools/node-to-mesh.ts new file mode 100644 index 00000000..f3d73b8f --- /dev/null +++ b/libs/vdb/src/lib/tools/node-to-mesh.ts @@ -0,0 +1,451 @@ +/** + * Babylon.js has a left-handed coordinate system with Y pointing up. + * Furthermore, the front face of a facet is considered the face where the facet’s vertices + * are positioned counterclockwise. + * + * Position of a facet is the location of the facet’s barycenter (a.k.a. centroid). + * + * 6-------7 + * /| /| + * / | / | + * Y 3--|----2 | + * | Z | 5----|--4 + * | / | / | / + * 0--- X 0-------1 + */ + +import { Coord } from '../math'; +import { HashableNode } from '../tree/node'; + +export interface MeshData { + colors: number[]; + normals: number[]; + origin?: Coord; + positions: number[]; +} + +/** + * Returns a mesh if there are any active voxels saved in the grid. + * Otherwise, returns `undefined` i.e. if there are no active voxels. + * + * Doesn't use indices, since it is more efficient to send 32 positions + * instead of 24 positions and 32 indices for a cube. + * See: https://doc.babylonjs.com/how_to/optimizing_your_scene#using-unindexed-meshes + */ +export function nodeToMesh(node: HashableNode): MeshData | undefined { + const mesh: MeshData = { + colors: [], + positions: [], + normals: [], + }; + + const r = Math.random(); + const g = Math.random(); + const b = Math.random(); + + for (const voxel of node.beginVoxelOn()) { + const [x, y, z] = voxel.globalCoord; + + const v0 = [x, y, z]; + const v1 = [x + 1, y, z]; + const v2 = [x + 1, y + 1, z]; + const v3 = [x, y + 1, z]; + const v4 = [x + 1, y, z + 1]; + const v5 = [x, y, z + 1]; + const v6 = [x, y + 1, z + 1]; + const v7 = [x + 1, y + 1, z + 1]; + + mesh.positions.push( + // Front + v4[0], + v4[1], + v4[2], + v5[0], + v5[1], + v5[2], + v6[0], + v6[1], + v6[2], + v4[0], + v4[1], + v4[2], + v6[0], + v6[1], + v6[2], + v7[0], + v7[1], + v7[2], + + // Back + v0[0], + v0[1], + v0[2], + v1[0], + v1[1], + v1[2], + v2[0], + v2[1], + v2[2], + v0[0], + v0[1], + v0[2], + v2[0], + v2[1], + v2[2], + v3[0], + v3[1], + v3[2], + + // Left + v5[0], + v5[1], + v5[2], + v0[0], + v0[1], + v0[2], + v3[0], + v3[1], + v3[2], + v5[0], + v5[1], + v5[2], + v3[0], + v3[1], + v3[2], + v6[0], + v6[1], + v6[2], + + // Right + v1[0], + v1[1], + v1[2], + v4[0], + v4[1], + v4[2], + v7[0], + v7[1], + v7[2], + v1[0], + v1[1], + v1[2], + v7[0], + v7[1], + v7[2], + v2[0], + v2[1], + v2[2], + + // Top + v3[0], + v3[1], + v3[2], + v2[0], + v2[1], + v2[2], + v7[0], + v7[1], + v7[2], + v3[0], + v3[1], + v3[2], + v7[0], + v7[1], + v7[2], + v6[0], + v6[1], + v6[2], + + // Bottom + v5[0], + v5[1], + v5[2], + v4[0], + v4[1], + v4[2], + v1[0], + v1[1], + v1[2], + v5[0], + v5[1], + v5[2], + v1[0], + v1[1], + v1[2], + v0[0], + v0[1], + v0[2], + ); + + // Front + mesh.normals.push( + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + + // Back + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + + // Left + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + + // Right + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + + // Top + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + + // Bottom + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + ); + + mesh.colors.push( + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + r, + g, + b, + 1, + ); + } + + return mesh.positions.length !== 0 ? mesh : undefined; +} diff --git a/libs/vdb/src/lib/tree/index.ts b/libs/vdb/src/lib/tree/index.ts index 54c0aae2..6ed61bee 100644 --- a/libs/vdb/src/lib/tree/index.ts +++ b/libs/vdb/src/lib/tree/index.ts @@ -1 +1,2 @@ +export * from './leaf-node'; export * from './internal-node'; diff --git a/libs/vdb/src/lib/tree/internal-node.spec.ts b/libs/vdb/src/lib/tree/internal-node.spec.ts index b8b51738..8307d50e 100644 --- a/libs/vdb/src/lib/tree/internal-node.spec.ts +++ b/libs/vdb/src/lib/tree/internal-node.spec.ts @@ -5,12 +5,12 @@ import { LeafNode } from './leaf-node'; describe('InternalNode', () => { describe('InternalNode1', () => { describe('static config values', () => { - expect(InternalNode1.LOG2DIM).toEqual(2); - expect(InternalNode1.TOTAL).toEqual(5); - expect(InternalNode1.DIM).toEqual(32); - expect(InternalNode1.NUM_VALUES).toEqual(64); + expect(InternalNode1.LOG2DIM).toEqual(3); + expect(InternalNode1.TOTAL).toEqual(3 + 3); + expect(InternalNode1.DIM).toEqual(64); + expect(InternalNode1.NUM_VALUES).toEqual(512); expect(InternalNode1.LEVEL).toEqual(1); - expect(InternalNode1.NUM_VOXELS).toEqual(32_768); + expect(InternalNode1.NUM_VOXELS).toEqual(262_144); }); describe('setValueOn()', () => { @@ -50,28 +50,28 @@ describe('InternalNode', () => { describe('coordToOffset()', () => { it.each([ [[0, 0, LeafNode.DIM], 1], - [[0, LeafNode.DIM, LeafNode.DIM], 4 + 1], - [[LeafNode.DIM, LeafNode.DIM, LeafNode.DIM], 16 + 4 + 1], + [[0, LeafNode.DIM, LeafNode.DIM], 8 + 1], + [[LeafNode.DIM, LeafNode.DIM, LeafNode.DIM], 64 + 8 + 1], [[0, 0, LeafNode.DIM * 0], 0], [[0, 0, LeafNode.DIM * 1], 1], [[0, 0, LeafNode.DIM * 2], 2], [[0, 0, LeafNode.DIM * 3], 3], - [[0, LeafNode.DIM * 0, 0], 0 * 4], - [[0, LeafNode.DIM * 1, 0], 1 * 4], - [[0, LeafNode.DIM * 2, 0], 2 * 4], - [[0, LeafNode.DIM * 3, 0], 3 * 4], + [[0, LeafNode.DIM * 0, 0], 0 * 8], + [[0, LeafNode.DIM * 1, 0], 1 * 8], + [[0, LeafNode.DIM * 2, 0], 2 * 8], + [[0, LeafNode.DIM * 3, 0], 3 * 8], - [[LeafNode.DIM * 0, 0, 0], 0 * 16], - [[LeafNode.DIM * 1, 0, 0], 1 * 16], - [[LeafNode.DIM * 2, 0, 0], 2 * 16], - [[LeafNode.DIM * 3, 0, 0], 3 * 16], + [[LeafNode.DIM * 0, 0, 0], 0 * 64], + [[LeafNode.DIM * 1, 0, 0], 1 * 64], + [[LeafNode.DIM * 2, 0, 0], 2 * 64], + [[LeafNode.DIM * 3, 0, 0], 3 * 64], - // 24 / 8 = 3 -> 3 x 16 = 48 ╮ - // 9 / 8 = 1 -> 1 x 4 = 4 ├─> 48 + 4 + 2 = 54 - // 17 / 8 = 2 -> 2 x 1 = 2 ╯ - [[24, 9, 17], 54], + // 24 / 8 = 3 -> 3 x 64 = 192 ╮ + // 9 / 8 = 1 -> 1 x 8 = 8 ├─> 192 + 8 + 2 = 202 + // 17 / 8 = 2 -> 2 x 1 = 2 ╯ + [[24, 9, 17], 202], ])('should return for coordinate %j the offset (%j)', (xyz: Coord, offset: number) => { const child = new InternalNode1([0, 0, 0]); @@ -82,11 +82,12 @@ describe('InternalNode', () => { describe('isValueOn()', () => { it('should set each voxel', () => { const node1 = new InternalNode1([0, 0, 0]); + const maxDim = InternalNode1.DIM / 4; // Shorten test running time let onCounter = 0; - for (let x = 0; x < InternalNode1.DIM; x++) { - for (let y = 0; y < InternalNode1.DIM; y++) { - for (let z = 0; z < InternalNode1.DIM; z++) { + for (let x = 0; x < maxDim; x++) { + for (let y = 0; y < maxDim; y++) { + for (let z = 0; z < maxDim; z++) { node1.setValueOn([x, y, z], onCounter); expect(node1.getValue([x, y, z])).toEqual(onCounter); @@ -95,18 +96,19 @@ describe('InternalNode', () => { } } - expect(onCounter).toEqual(Math.pow(InternalNode1.DIM, 3)); + expect(onCounter).toEqual(Math.pow(maxDim, 3)); }); }); describe('onVoxelCount()', () => { it('should count all activated voxels', () => { const node1 = new InternalNode1([0, 0, 0]); + const maxDim = InternalNode1.DIM / 4; // Shorten test running time let onCounter = 0; - for (let x = 0; x < InternalNode1.DIM; x++) { - for (let y = 0; y < InternalNode1.DIM; y++) { - for (let z = 0; z < InternalNode1.DIM; z++) { + for (let x = 0; x < maxDim; x++) { + for (let y = 0; y < maxDim; y++) { + for (let z = 0; z < maxDim; z++) { node1.setValueOn([x, y, z], 42); onCounter++; @@ -115,7 +117,7 @@ describe('InternalNode', () => { } } - expect(onCounter).toEqual(Math.pow(InternalNode1.DIM, 3)); + expect(onCounter).toEqual(Math.pow(maxDim, 3)); }); }); @@ -143,11 +145,11 @@ describe('InternalNode', () => { describe('InternalNode2', () => { describe('static config values', () => { expect(InternalNode2.LOG2DIM).toEqual(2); - expect(InternalNode2.TOTAL).toEqual(7); - expect(InternalNode2.DIM).toEqual(128); + expect(InternalNode2.TOTAL).toEqual(2 + 3 + 3); + expect(InternalNode2.DIM).toEqual(256); expect(InternalNode2.NUM_VALUES).toEqual(64); expect(InternalNode2.LEVEL).toEqual(2); - expect(InternalNode2.NUM_VOXELS).toEqual(2_097_152); + expect(InternalNode2.NUM_VOXELS).toEqual(16_777_216); }); describe('setValueOn()', () => { @@ -176,14 +178,14 @@ describe('InternalNode', () => { describe('coordToOffset()', () => { it.each([ [[0, 0, 0], 0], - [[0, 0, 128], 0], - [[0, 0, 32], 1], - [[0, 0, 64], 2], - [[0, 0, 96], 3], - - [[0, 0, 32], 1], - [[0, 32, 0], 4], - [[32, 0, 0], 16], + [[0, 0, 256], 0], + [[0, 0, 64], 1], + [[0, 0, 128], 2], + [[0, 0, 192], 3], + + [[0, 0, 64], 1], + [[0, 64, 0], 4], + [[64, 0, 0], 16], ])('should return for coordinate %j the offset (%j)', (xyz: Coord, offset: number) => { const child = new InternalNode2([0, 0, 0]); @@ -194,18 +196,19 @@ describe('InternalNode', () => { describe('onVoxelCount()', () => { it('should count all activated voxels', () => { const node2 = new InternalNode2([0, 0, 0]); + const maxDim = InternalNode2.DIM / 4; // Shorten test running time let onCounter = 0; - for (let x = 0; x < InternalNode2.DIM; x++) { - for (let y = 0; y < InternalNode2.DIM; y++) { - for (let z = 0; z < InternalNode2.DIM; z++) { + for (let x = 0; x < maxDim; x++) { + for (let y = 0; y < maxDim; y++) { + for (let z = 0; z < maxDim; z++) { node2.setValueOn([x, y, z], 42); onCounter++; } } } - expect(onCounter).toEqual(Math.pow(InternalNode2.DIM, 3)); + expect(onCounter).toEqual(Math.pow(maxDim, 3)); }); }); diff --git a/libs/vdb/src/lib/tree/internal-node.ts b/libs/vdb/src/lib/tree/internal-node.ts index 306bce01..b877927e 100644 --- a/libs/vdb/src/lib/tree/internal-node.ts +++ b/libs/vdb/src/lib/tree/internal-node.ts @@ -8,9 +8,9 @@ import { ValueAccessor3 } from './value-accessor'; import { Voxel } from './voxel'; abstract class InternalNode implements HashableNode { + origin: Coord; protected childMask: NodeMask; protected valueMask: NodeMask; - protected origin: Coord; protected nodes: NodeUnion>[]; @@ -78,6 +78,23 @@ abstract class InternalNode implements HashableNode { return node.getValue(); } + probeInternalNode1AndCache( + xyz: Coord, + accessor: ValueAccessor3, + ): InternalNode1 | undefined { + const i: Index = this.coordToOffset(xyz); + const node = this.nodes[i]; + + if (this.childMask.isOff(i)) { + return undefined; + } + + const child = node.getChild(); + accessor.insert(xyz, child); + + return child instanceof InternalNode1 ? child : child.probeInternalNode1AndCache(xyz, accessor); + } + setValueOn(xyz: Coord, value: T): void { const i: Index = this.coordToOffset(xyz); const node = this.nodes[i]; @@ -242,7 +259,7 @@ abstract class InternalNode implements HashableNode { export class InternalNode1 extends InternalNode { // tslint:disable:no-bitwise - static readonly LOG2DIM = 2; // log2 of tile count in one dimension + static readonly LOG2DIM = 3; // log2 of tile count in one dimension static readonly TOTAL = InternalNode1.LOG2DIM + LeafNode.TOTAL; // log2 of voxel count in one dimension static readonly DIM = 1 << InternalNode1.TOTAL; // total voxel count in one dimension static readonly DIM_MAX_INDEX_INVERTED: Index = ~(InternalNode1.DIM - 1); // Performance: max index diff --git a/libs/vdb/src/lib/tree/leaf-node.ts b/libs/vdb/src/lib/tree/leaf-node.ts index 4cada089..6fbed000 100644 --- a/libs/vdb/src/lib/tree/leaf-node.ts +++ b/libs/vdb/src/lib/tree/leaf-node.ts @@ -1,5 +1,6 @@ import { Coord } from '../math/coord'; import { NodeMask } from '../util/node-mask'; +import { InternalNode1 } from './internal-node'; import { LeafBuffer } from './leaf-buffer'; import { HashableNode } from './node'; import { ValueAccessor3 } from './value-accessor'; @@ -21,12 +22,13 @@ export class LeafNode implements HashableNode { static readonly LEVEL: Index = 0; // level 0 = leaf // tslint:enable:no-bitwise + // Global grid index coordinates (x,y,z) of the local origin of this node + readonly origin: Coord; + // Buffer containing the actual data values private buffer: LeafBuffer; // Bitmask that determines which voxels are active private valueMask: NodeMask; - // Global grid index coordinates (x,y,z) of the local origin of this node - private readonly origin: Coord; /** * Return the linear table offset of the given global or local coordinates. @@ -119,6 +121,10 @@ export class LeafNode implements HashableNode { return this.getValue(xyz); } + probeInternalNode1AndCache(xyz: Coord, _: ValueAccessor3): InternalNode1 | undefined { + throw new Error(`Shouldn't be called on LeafNode`); + } + /** * @brief Change the value of the voxel at the given coordinates and mark it as active. * @note Used internally by ValueAccessor. diff --git a/libs/vdb/src/lib/tree/node.ts b/libs/vdb/src/lib/tree/node.ts index e4c34174..a4fff5bb 100644 --- a/libs/vdb/src/lib/tree/node.ts +++ b/libs/vdb/src/lib/tree/node.ts @@ -1,3 +1,4 @@ +import { InternalNode1 } from '@talus/vdb'; import { Coord } from '../math/coord'; import { ValueAccessor3 } from './value-accessor'; import { Voxel } from './voxel'; @@ -33,11 +34,18 @@ export interface HashableNode extends Node { */ getValueAndCache(xyz: Coord, accessor: ValueAccessor3): T; + /** + * Same as probeNode() except, if necessary, update the accessor with pointers + * to the nodes along the path from the root node to the node containing (x, y, z). + */ + probeInternalNode1AndCache(xyz: Coord, accessor: ValueAccessor3): InternalNode1 | undefined; + /** * Change the value of the voxel at the given coordinates and mark it as active. * If necessary, update the accessor with pointers to the nodes along the path * from the root node to the node containing the voxel. * @note Used internally by ValueAccessor. + * @return The affected `LeafNode` in which a value was set. */ setValueAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void; diff --git a/libs/vdb/src/lib/tree/root-node.ts b/libs/vdb/src/lib/tree/root-node.ts index 20d3dc9e..caabf4b5 100644 --- a/libs/vdb/src/lib/tree/root-node.ts +++ b/libs/vdb/src/lib/tree/root-node.ts @@ -1,5 +1,5 @@ import { Coord } from '../math/coord'; -import { InternalNode2 } from './internal-node'; +import { InternalNode1, InternalNode2 } from './internal-node'; import { HashableNode } from './node'; import { ValueAccessor3 } from './value-accessor'; import { Voxel } from './voxel'; @@ -57,6 +57,22 @@ export class RootNode implements HashableNode { return struct.getTile().value; } + probeInternalNode1AndCache( + xyz: Coord, + accessor: ValueAccessor3, + ): InternalNode1 | undefined { + const struct = this.findCoord(xyz); + + if (!struct || struct.isTile()) { + return undefined; + } + + const child = struct.getChild(); + accessor.insert(xyz, child); + + return child.probeInternalNode1AndCache(xyz, accessor); + } + setValueOn(xyz: Coord, value: T): void { const struct = this.findCoord(xyz); let child: HashableNode; @@ -92,7 +108,7 @@ export class RootNode implements HashableNode { if (child) { accessor.insert(xyz, child); - child.setValueOn(xyz, value); + child.setValueAndCache(xyz, value, accessor); } } diff --git a/libs/vdb/src/lib/tree/value-accessor.ts b/libs/vdb/src/lib/tree/value-accessor.ts index 9ba01796..4b881ff4 100644 --- a/libs/vdb/src/lib/tree/value-accessor.ts +++ b/libs/vdb/src/lib/tree/value-accessor.ts @@ -1,4 +1,4 @@ -import { Coord, createMaxCoord } from '../math/coord'; +import { clone, Coord, createMaxCoord } from '../math/coord'; import { InternalNode1, InternalNode2 } from './internal-node'; import { LeafNode } from './leaf-node'; import { HashableNode } from './node'; @@ -28,7 +28,9 @@ import { Tree } from './tree'; * The configuration is hard-coded and has a depth of four. */ export class ValueAccessor3 { - constructor(private tree: Tree) {} + get internalNode1Origin(): Coord { + return clone(this.internalKey1); + } private leafKey: Coord = createMaxCoord(); private leafNode: LeafNode; @@ -39,6 +41,8 @@ export class ValueAccessor3 { private internalKey2: Coord = createMaxCoord(); private internalNode2: InternalNode2; + constructor(private tree: Tree) {} + /** * Return true if any of the nodes along the path to the given voxel have been cached. */ @@ -46,6 +50,20 @@ export class ValueAccessor3 { return this.isHashed2(xyz) || this.isHashed1(xyz) || this.isHashed0(xyz); } + /** + * @returns Returns the node that contains voxel (x, y, z) + * and if it doesn't exist, return undefined. + */ + probeInternalNode1(xyz: Coord): InternalNode1 | undefined { + if (this.isHashed1(xyz)) { + return this.internalNode1; + } else if (this.isHashed2(xyz)) { + return this.internalNode2.probeInternalNode1AndCache(xyz, this); + } else { + return this.tree.root.probeInternalNode1AndCache(xyz, this); + } + } + /** * Return the value of the voxel at the given coordinates. */ From caa2751e7092a6d3707f4a6609aefe8a35b74351 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 8 Jan 2020 17:42:34 +0100 Subject: [PATCH 36/84] feat(benchmark): test single vs. multiple `array.push()` --- .../src/app/vdb/node-to-mesh.benchmark.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 apps/benchmark/src/app/vdb/node-to-mesh.benchmark.ts diff --git a/apps/benchmark/src/app/vdb/node-to-mesh.benchmark.ts b/apps/benchmark/src/app/vdb/node-to-mesh.benchmark.ts new file mode 100644 index 00000000..b06dcd42 --- /dev/null +++ b/apps/benchmark/src/app/vdb/node-to-mesh.benchmark.ts @@ -0,0 +1,34 @@ +import { benchmark, suite } from '../../main'; + +suite('[NodeToMesh] array.push()', () => { + benchmark('multiple small push', () => { + const positions: number[] = []; + + positions.push(1); + positions.push(2); + positions.push(3); + positions.push(4); + positions.push(5); + positions.push(6); + positions.push(7); + positions.push(8); + positions.push(9); + positions.push(10); + positions.push(11); + positions.push(12); + positions.push(13); + positions.push(14); + positions.push(15); + positions.push(16); + positions.push(17); + positions.push(18); + positions.push(19); + positions.push(20); + }); + + benchmark('single big push', () => { + const positions: number[] = []; + + positions.push(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); + }); +}); From 97be3c4787e44812b7239a0f3c6ad4dd8cc2b5af Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 8 Jan 2020 17:50:59 +0100 Subject: [PATCH 37/84] build(CircleCi): update node to `13.5.0` & cypress `3.8.1` --- .circleci/config.yml | 6 +++--- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 854fadfc..24488b48 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,17 +7,17 @@ aliases: # https://github.com/CircleCI-Public/circleci-dockerfiles/tree/master/node/images - &use_docker_node docker: - - image: circleci/node:13.4.0-stretch + - image: circleci/node:13.5.0-stretch - &use_docker_node_browsers docker: - - image: circleci/node:13.4.0-stretch-browsers + - image: circleci/node:13.5.0-stretch-browsers # https://github.com/cypress-io/cypress-docker-images/tree/master/included - &use_docker_cypress_included docker: # 3.8.0 fails with `Error: write EPIPE` when running `benchmark`!? - - image: cypress/included:3.7.0 + - image: cypress/included:3.8.1 - &workspace ~/talus diff --git a/package.json b/package.json index dd0b33a6..c4f774eb 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "babylonjs": "4.1.0-beta.12", "benchmark": "2.1.4", "codelyzer": "5.2.1", - "cypress": "3.7.0", + "cypress": "3.8.1", "dotenv": "8.2.0", "gh-pages": "2.1.1", "jasmine-marbles": "0.6.0", diff --git a/yarn.lock b/yarn.lock index 1d45ac82..2062f3a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3988,10 +3988,10 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= -cypress@3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.7.0.tgz#e2cd71b87b6ce0d4c72c6ea25da1005d75c1f231" - integrity sha512-o+vfRxqAba8TduelzfZQ4WHmj2yNEjaoO2EuZ8dZ9pJpuW+WGtBGheKIp6zkoQsp8ZgFe8OoHh1i2mY8BDnMAw== +cypress@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.1.tgz#7821084e0ead81d35ffa29f2141c977dfdfc2343" + integrity sha512-eLk5OpL/ZMDfQx9t7ZaDUAGVcvSOPTi7CG1tiUnu9BGk7caBiDhuFi3Tz/D5vWqH/Dl6Uh4X+Au4W+zh0xzbXw== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/xvfb" "1.2.4" From 797aef03b4a5bc5da25e0d45124bf499661982d1 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 9 Jan 2020 09:31:01 +0100 Subject: [PATCH 38/84] build(nx): nx migrate @nrwl/workspace (v8.11.0) - nx migrate --run-migrations=migrations.json --- apps/benchmark/tslint.json | 5 +- libs/vdb/tslint.json | 5 +- package.json | 10 +- yarn.lock | 229 +++++++++++++++++++++---------------- 4 files changed, 145 insertions(+), 104 deletions(-) diff --git a/apps/benchmark/tslint.json b/apps/benchmark/tslint.json index 04809f83..8e2f21b3 100644 --- a/apps/benchmark/tslint.json +++ b/apps/benchmark/tslint.json @@ -1 +1,4 @@ -{ "extends": "../../tslint.json", "rules": [] } +{ + "extends": "../../tslint.json", + "rules": {} +} diff --git a/libs/vdb/tslint.json b/libs/vdb/tslint.json index 04809f83..8e2f21b3 100644 --- a/libs/vdb/tslint.json +++ b/libs/vdb/tslint.json @@ -1 +1,4 @@ -{ "extends": "../../tslint.json", "rules": [] } +{ + "extends": "../../tslint.json", + "rules": {} +} diff --git a/package.json b/package.json index c4f774eb..689cc85c 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@babylonjs/materials": "4.1.0-beta.12", "@ngrx/effects": "8.6.0", "@ngrx/store": "8.6.0", - "@nrwl/angular": "8.9.0", + "@nrwl/angular": "8.11.0", "core-js": "3.6.0", "hammerjs": "2.0.8", "mnemonist": "0.32.0", @@ -61,10 +61,10 @@ "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", "@babylonjs/inspector": "4.1.0-beta.12", - "@nrwl/cypress": "8.9.0", - "@nrwl/jest": "8.9.0", - "@nrwl/node": "8.9.0", - "@nrwl/workspace": "8.9.0", + "@nrwl/cypress": "8.11.0", + "@nrwl/jest": "8.11.0", + "@nrwl/node": "8.11.0", + "@nrwl/workspace": "8.11.0", "@types/benchmark": "1.0.31", "@types/jest": "24.0.24", "@types/node": "12.12.21", diff --git a/yarn.lock b/yarn.lock index 2062f3a3..1d0a9d17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1808,32 +1808,32 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@nrwl/angular@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-8.9.0.tgz#54b5bf31d969a8cd8a49f9e1a112f3d0fa7ac437" - integrity sha512-FxMKD3g5JQ3LwInRv1Pa8X1efG/nSoeBOTMbtEJs7CnaTonMWMPbY8QNSFidM8J+dWxOMDs9DXm5v66eOELpnw== +"@nrwl/angular@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-8.11.0.tgz#d65f8800acb852544fec4b11b0b49fe12bbb34b3" + integrity sha512-MIFwd2WdY8uvW1oySPzGxs2kYtprXIHYzXkkW3L5BMY0yVWTUqpUpmtMHQBPgA2E2OCIIO7jpccrXMRofMU57Q== dependencies: "@angular-devkit/schematics" "8.3.14" - "@nrwl/cypress" "8.9.0" - "@nrwl/jest" "8.9.0" + "@nrwl/cypress" "8.11.0" + "@nrwl/jest" "8.11.0" "@schematics/angular" "8.3.14" jasmine-marbles "~0.6.0" -"@nrwl/cli@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-8.9.0.tgz#5553d01909b75efc43e24ee3d5781243fbacbc9a" - integrity sha512-Z2ci9BQNsPeBfJTpXwMJ9NIfMLTEMsPoOXGxlCTjTZcpr6t2TlScVR9BIArgrv4BiMctyKUFRBxe6aX9eO98KA== +"@nrwl/cli@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-8.11.0.tgz#bb45b31c45409af706b2636798ec695a2c6104aa" + integrity sha512-S8z9wgeWObmRuCXWVrQ9yIeWnyJJ4CEIzmuSbs3k+XBx/MTP2QsoluJSYHv4NYxFM2hTboZPNuicNsz16Ua5/Q== dependencies: - "@nrwl/tao" "8.9.0" + "@nrwl/tao" "8.11.0" chalk "2.4.2" tmp "0.0.33" yargs "^11.0.0" yargs-parser "10.0.0" -"@nrwl/cypress@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-8.9.0.tgz#90016e1f9f4442436e5c3ce65d30923355d22210" - integrity sha512-xVTp5Lyy2HRYqJn3xwFJ85bzJiDygKuSm7ZXKJojCqg4ZwCBJDOoE3GzT/gYs1jRrKhV/jizkXkNtJA1UK2HZQ== +"@nrwl/cypress@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-8.11.0.tgz#d0771f9a5f4e1cb25c7230de6372d3da9d9adcf0" + integrity sha512-AB8Df+eX/qTR05EDswhk1hr9/RxNBe41mUzUq3KGvXEj7xMw+6Jt3JmBnoISk2olqDTB1DM3gLV0ytSC1FkktQ== dependencies: "@angular-devkit/architect" "0.803.14" "@angular-devkit/core" "8.3.14" @@ -1843,37 +1843,37 @@ tsconfig-paths-webpack-plugin "3.2.0" webpack-node-externals "1.7.2" -"@nrwl/jest@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-8.9.0.tgz#be8d07c0c3b10d918e119eaa8b51a14013c3cb97" - integrity sha512-Vi10aiIAsNb5xqedyPT173nQLhblfFZG/GleO+SkM9qXjRLm6n1KgFdiLuOI5V+mtU0UcCSd+SbI2uJsk19i2w== +"@nrwl/jest@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-8.11.0.tgz#ed02e7facc90c91bff0f6974a3d329d1e83ca9f4" + integrity sha512-EyuuNAItQDSwJNtsDTs7zINdRG9GjU2rnTJsonMdnsdZIikM0HD8xooF/XzdIqfbc5c7ZZ46LqCChQ8PhWqBhQ== dependencies: "@angular-devkit/architect" "0.803.14" "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" -"@nrwl/linter@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-8.9.0.tgz#260a7ccaf9cc951042f5c23f480114a20794e0b8" - integrity sha512-e4mkAaR6BrgPWxw8YMhvuhIQUl7epm7rDnriZ3Y93DF/tfFNh5R5Hy57Nix52NDlnjP6kVcf2lxvrPSUi4iyrA== +"@nrwl/linter@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-8.11.0.tgz#9113d574dabfedda4059b8130e1299a95b4169c6" + integrity sha512-a66Hx84XJZTziiVNyqoan1lhcI10NFLfta0Sgk+9gGHuaT4KI3NjAhKSUNSchIlyN8enRb+Gl3Wenv2CHnqyJw== dependencies: "@angular-devkit/architect" "0.803.14" "@angular-eslint/builder" "0.0.1-alpha.17" -"@nrwl/node@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-8.9.0.tgz#91f7770053f67672fa53d207b0fa57220c147da4" - integrity sha512-wCKLdeUnlohPJ7B4m3YUrn727i7simRzeByfHbslxnY85U0PmbVkOZXs6RlQxAh0dErNAbDfgN+vRPESVn9Eng== +"@nrwl/node@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-8.11.0.tgz#8e21f869ef4b9139cc9bed0ae6ee19802f11888f" + integrity sha512-H4LXQO1TYn5XjTo5bEySzuNSzu/gIffWbm4DHX9Ilie2iRr1fBDLD+/oo5qNLGhLuFWM8o9gKG6FDpNAhI7B6g== dependencies: "@angular-devkit/architect" "0.803.14" "@angular-devkit/build-webpack" "0.803.14" "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" - "@nrwl/jest" "8.9.0" - "@nrwl/linter" "8.9.0" + "@nrwl/jest" "8.11.0" + "@nrwl/linter" "8.11.0" circular-dependency-plugin "5.2.0" - copy-webpack-plugin "5.0.3" - fork-ts-checker-webpack-plugin "0.4.15" + copy-webpack-plugin "5.1.1" + fork-ts-checker-webpack-plugin "^3.1.1" license-webpack-plugin "2.1.2" source-map-support "0.5.12" tree-kill "1.2.1" @@ -1881,12 +1881,13 @@ tsconfig-paths-webpack-plugin "3.2.0" webpack "4.41.2" webpack-dev-server "3.9.0" + webpack-merge "4.2.1" webpack-node-externals "1.7.2" -"@nrwl/tao@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-8.9.0.tgz#f28a8a62e2613d30805fd85f2e9234fb01d39133" - integrity sha512-hAIw7J94qv+i+JMs6aB0ZS/eBOlYJ0L50VeaFWk2n94FmDNW4WFKIQRuNBM4CGcdpT+h1z3tR7QeWPjCaXk3Ow== +"@nrwl/tao@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-8.11.0.tgz#bf03d8825cccb06a7fd7d7c498b278deda882f78" + integrity sha512-9N+Vk/M8u1XVjMiLvtjEeFXYkb1TfSFvlKR0XyY7arCYmA/a6z594D4nUADjpDogNy2cyxBXcAjkKTOK1FSqZw== dependencies: "@angular-devkit/architect" "0.803.14" "@angular-devkit/core" "8.3.14" @@ -1896,21 +1897,21 @@ minimist "^1.2.0" strip-json-comments "2.0.1" -"@nrwl/workspace@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-8.9.0.tgz#4dc3d1ff9b34ce983158a5aa4bf3a0ef28c0df69" - integrity sha512-mwimmwx1V5kO9DXVygw++PoRhyIrut+LSQ3VGWu+ui9qwNQlcCLPwQQdHHp447qGdcb8Qne9ZPMHXUt8sWo5EQ== +"@nrwl/workspace@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-8.11.0.tgz#42b37098db2ad31047db1907169f6969907feee1" + integrity sha512-3cougMUedrOO8v1164i6I+mrGyDm1Uv2yFrYwMAnAcW+9s9Yy2KgEJ4HyBb4rJIhi7uKyQk9u9Q9QQtJsW+Kjg== dependencies: "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" - "@nrwl/cli" "8.9.0" + "@nrwl/cli" "8.11.0" chalk "2.4.2" cosmiconfig "4.0.0" fs-extra "6.0.0" + hasha "5.1.0" ignore "5.0.4" npm-run-all "4.1.5" opn "^5.3.0" - prettier "1.18.2" rxjs "^6.4.0" semver "5.4.1" strip-json-comments "2.0.1" @@ -2477,6 +2478,14 @@ anymatch@^3.0.1: normalize-path "^3.0.0" picomatch "^2.0.4" +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + app-root-path@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" @@ -2977,7 +2986,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@^3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3176,26 +3185,6 @@ cacache@12.0.2, cacache@^12.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^11.3.2: - version "11.3.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" - integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== - dependencies: - 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" - cacache@^12.0.0, cacache@^12.0.3: version "12.0.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" @@ -3416,7 +3405,7 @@ chokidar@^2.0.2, chokidar@^2.1.1: optionalDependencies: fsevents "^1.2.7" -chokidar@^2.0.4, chokidar@^2.1.8: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -3435,6 +3424,21 @@ chokidar@^2.0.4, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.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" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" @@ -3762,24 +3766,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-webpack-plugin@5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz#2179e3c8fd69f13afe74da338896f1f01a875b5c" - integrity sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q== - dependencies: - cacache "^11.3.2" - 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" - copy-webpack-plugin@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" @@ -5027,19 +5013,19 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-webpack-plugin@0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.4.15.tgz#7cd9f94f3dd58cd1fe8f953f876e72090eda3f6d" - integrity sha512-qNYuygh2GxXehBvQZ5rI5YlQFn+7ZV6kmkyD9Sgs33dWl73NZdUOB5aCp8v0EXJn176AhPrZP8YCMT3h01fs+g== +fork-ts-checker-webpack-plugin@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== dependencies: babel-code-frame "^6.22.0" chalk "^2.4.1" - chokidar "^2.0.4" - lodash "^4.17.11" + chokidar "^3.3.0" micromatch "^3.1.10" minimatch "^3.0.4" - resolve "^1.5.0" + semver "^5.6.0" tapable "^1.0.0" + worker-rpc "^0.1.0" form-data@~2.3.2: version "2.3.3" @@ -5137,6 +5123,11 @@ fsevents@^2.0.6: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a" integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ== +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5236,6 +5227,13 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" +glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -5472,6 +5470,14 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasha@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.1.0.tgz#dd05ccdfcfe7dab626247ce2a58efe461922f4ca" + integrity sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5896,7 +5902,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-binary-path@^2.1.0: +is-binary-path@^2.1.0, is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== @@ -6032,7 +6038,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -6129,6 +6135,11 @@ is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -7349,6 +7360,11 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -7751,7 +7767,7 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -8366,6 +8382,11 @@ picomatch@^2.0.4, picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + pidtree@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b" @@ -8603,11 +8624,6 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prettier@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== - prettier@1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" @@ -8945,6 +8961,13 @@ readdirp@^3.1.1: dependencies: picomatch "^2.0.4" +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + realpath-native@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" @@ -9247,7 +9270,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0: +resolve@1.x, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== @@ -10707,6 +10730,11 @@ type-fest@^0.5.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== +type-fest@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -11319,6 +11347,13 @@ worker-plugin@3.2.0: dependencies: loader-utils "^1.1.0" +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" From e50fa260bef4aa6a9699c8d5584c7ed17efe318c Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 9 Jan 2020 10:57:12 +0100 Subject: [PATCH 39/84] fix(benchmark): add `.nxignore` to get benchmark through linter --- .nxignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .nxignore diff --git a/.nxignore b/.nxignore new file mode 100644 index 00000000..34902dd4 --- /dev/null +++ b/.nxignore @@ -0,0 +1,2 @@ +# Hack for getting benchmark app (generated with ng g @nrwl/node:application) through linting +/apps/benchmark From 22b39b69bfdaa312a89a161bcf3a185c2176239c Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 9 Jan 2020 11:06:55 +0100 Subject: [PATCH 40/84] build(dep): update dependencies --- .../lib/scene-viewer/scene-viewer.service.ts | 2 +- package.json | 26 +- yarn.lock | 317 ++++++++++-------- 3 files changed, 187 insertions(+), 158 deletions(-) diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index cc507dec..451bfbc2 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -115,7 +115,7 @@ export class SceneViewerService { // https://doc.babylonjs.com/how_to/optimizing_your_scene this.scene = new Scene(this.engine, { useGeometryUniqueIdsMap: true, - useClonedMeshhMap: true, + useClonedMeshMap: true, }); this.scene.freezeMaterials(); diff --git a/package.json b/package.json index 689cc85c..c7ed7855 100644 --- a/package.json +++ b/package.json @@ -44,48 +44,48 @@ "@angular/platform-browser": "8.2.14", "@angular/platform-browser-dynamic": "8.2.14", "@angular/router": "8.2.14", - "@babylonjs/core": "4.1.0-beta.12", - "@babylonjs/materials": "4.1.0-beta.12", + "@babylonjs/core": "4.1.0-beta.18", + "@babylonjs/materials": "4.1.0-beta.18", "@ngrx/effects": "8.6.0", "@ngrx/store": "8.6.0", "@nrwl/angular": "8.11.0", - "core-js": "3.6.0", + "core-js": "3.6.2", "hammerjs": "2.0.8", "mnemonist": "0.32.0", - "rxjs": "6.5.3", + "rxjs": "6.5.4", "zone.js": "0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "0.803.21", - "@angular/cli": "8.3.21", + "@angular-devkit/build-angular": "0.803.22", + "@angular/cli": "8.3.22", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", - "@babylonjs/inspector": "4.1.0-beta.12", + "@babylonjs/inspector": "4.1.0-beta.18", "@nrwl/cypress": "8.11.0", "@nrwl/jest": "8.11.0", "@nrwl/node": "8.11.0", "@nrwl/workspace": "8.11.0", "@types/benchmark": "1.0.31", - "@types/jest": "24.0.24", - "@types/node": "12.12.21", - "babylonjs": "4.1.0-beta.12", + "@types/jest": "24.0.25", + "@types/node": "13.1.5", + "babylonjs": "4.1.0-beta.18", "benchmark": "2.1.4", "codelyzer": "5.2.1", "cypress": "3.8.1", "dotenv": "8.2.0", - "gh-pages": "2.1.1", + "gh-pages": "2.2.0", "jasmine-marbles": "0.6.0", "jest": "24.9.0", "jest-junit": "10.0.0", "jest-preset-angular": "7.1.1", "junit-xml": "1.2.0", "prettier": "1.19.1", - "stylelint": "12.0.0", + "stylelint": "12.0.1", "stylelint-config-recommended": "3.0.0", "stylelint-config-recommended-scss": "4.1.0", "stylelint-config-standard": "19.0.0", "stylelint-scss": "3.13.0", - "ts-jest": "24.2.0", + "ts-jest": "24.3.0", "ts-node": "8.5.4", "tslint": "5.20.1", "typescript": "3.5.3" diff --git a/yarn.lock b/yarn.lock index 1d0a9d17..edf45950 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,31 +10,31 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/architect@0.803.21": - version "0.803.21" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.21.tgz#0e76b6f646ebdbd9bb88d3972b2ca66fed950f7d" - integrity sha512-E2K/YexIWVyKM/xmyxvDjkJf+wX9u4c8YYpNaK4htsRzA06juc7N1MhlL/jURZiRl5b/K9sapYeq3tMX76saxA== +"@angular-devkit/architect@0.803.22": + version "0.803.22" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.22.tgz#33b54099298aaef5f93ffefb8b91a98ea9f85387" + integrity sha512-5Gr0LH+Hjd/NLdmi660VBoo3WbzQM7/yeG+ziktb7hbeVaYK4Mejtcg/DJnCoZ3hzlZuZokWVwvpdFo+A9xKbg== dependencies: - "@angular-devkit/core" "8.3.21" + "@angular-devkit/core" "8.3.22" rxjs "6.4.0" -"@angular-devkit/build-angular@0.803.21": - version "0.803.21" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.21.tgz#f3d12ea09748b05eb2d835a7de7997599fb6b752" - integrity sha512-flfgflvfpwdsm3x/U7QnfbtyZPEbsVipzQAoao1Zo58Beq1a+NsKsWbjrF/x4TSoI2czt0OVWXNytlfXM7LMhg== +"@angular-devkit/build-angular@0.803.22": + version "0.803.22" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.22.tgz#0fa668e84c237c6b1ab524e50b0ccaedc3a92929" + integrity sha512-2q9qLsD52D4GACUAuQhvkgQ7vLAhZzdU0jzfs74RTxqUZ3PS6Ltrrwpdg2kp9RlQ53+nSCYjWBDLk1CxoEt4pg== dependencies: - "@angular-devkit/architect" "0.803.21" - "@angular-devkit/build-optimizer" "0.803.21" - "@angular-devkit/build-webpack" "0.803.21" - "@angular-devkit/core" "8.3.21" + "@angular-devkit/architect" "0.803.22" + "@angular-devkit/build-optimizer" "0.803.22" + "@angular-devkit/build-webpack" "0.803.22" + "@angular-devkit/core" "8.3.22" "@babel/core" "7.7.5" "@babel/preset-env" "7.7.6" - "@ngtools/webpack" "8.3.21" + "@ngtools/webpack" "8.3.22" ajv "6.10.2" autoprefixer "9.6.1" - browserslist "4.6.6" + browserslist "4.8.3" cacache "12.0.2" - caniuse-lite "1.0.30000989" + caniuse-lite "1.0.30001019" circular-dependency-plugin "5.2.0" clean-css "4.2.1" copy-webpack-plugin "5.1.1" @@ -80,10 +80,10 @@ webpack-subresource-integrity "1.1.0-rc.6" worker-plugin "3.2.0" -"@angular-devkit/build-optimizer@0.803.21": - version "0.803.21" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.21.tgz#ecb3b6bba4b13ffbfbdbefb5997f690aa3635203" - integrity sha512-gNN6kPaF4phZco3TmsrNr9tIEKXYsoSeoaUiDUfgmCYwa7fAqM8Ojh7HX6IQuB2PpVmEwKGlCcSh6xDtB33NjA== +"@angular-devkit/build-optimizer@0.803.22": + version "0.803.22" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.22.tgz#6d09cbb5fd28ab7bd22ddc54e938f305dfff8b20" + integrity sha512-VIDeQcBn88PjHBTen3BRVA7DJiKEJdDwukx61mUvUDOcY7S5Ot5WqG0nrZifRjha17Z+fl3XuwS9TZNYmlF7WQ== dependencies: loader-utils "1.2.3" source-map "0.7.3" @@ -100,13 +100,13 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/build-webpack@0.803.21": - version "0.803.21" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.21.tgz#fd45754c0123f44fcde8fa6411ebea52d98054f0" - integrity sha512-zCFVla/Xdk8qGVybvnHtoKml2h0/ShasSjT55VNZO1XaTCMqYkQEwwqSGEiVajpauafWjKrKxxBhsmWoI4efAA== +"@angular-devkit/build-webpack@0.803.22": + version "0.803.22" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.22.tgz#079b2ded794308b2dc93769406bdb0a1e32015c0" + integrity sha512-RDLAhKHfTFzthzeawHEefYB1MxHiU2I32QzXI3XTCpR2XySw5JG9jIVIcsyDHQH1JtIfpHGq8vgfiTsE3r0YWA== dependencies: - "@angular-devkit/architect" "0.803.21" - "@angular-devkit/core" "8.3.21" + "@angular-devkit/architect" "0.803.22" + "@angular-devkit/core" "8.3.22" rxjs "6.4.0" "@angular-devkit/core@8.3.14": @@ -120,10 +120,10 @@ rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/core@8.3.21": - version "8.3.21" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.21.tgz#447022813e46333e930816c287722d06b9c4dd3a" - integrity sha512-BYyVbrbys535FplX0+GVOlYBg/cyk1U5SRhSxRRFZYi9epVlEBBPk8/6wV4cQPGb6EwXkVj7YtPWXjXcGfzWmA== +"@angular-devkit/core@8.3.22": + version "8.3.22" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.22.tgz#085cc1cf356cec00d0a1cea83ef1f21277f5ff55" + integrity sha512-lOEYcvK3MktjR9YZT/cUjiQE5dZxl8rZ/vgWgwDiL7RtzfXTt8lPapoJe7YKS53gLbUYiBNPCtTyTAqnslWgGA== dependencies: ajv "6.10.2" fast-json-stable-stringify "2.0.0" @@ -139,12 +139,12 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/schematics@8.3.21": - version "8.3.21" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.21.tgz#80d515f480180be18a4130ea691f90153bcab3ea" - integrity sha512-+wH0362CRr/SijVX4w2baY2ANZ4scQ1k2xO8lT+NMeZQkw3IJQPOfwk1IaqiAs2xuBJZcSDH1Gn80+Jh4Dit7w== +"@angular-devkit/schematics@8.3.22": + version "8.3.22" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.22.tgz#41461768cc6cf54708d55311e59b9defa7bff484" + integrity sha512-ETLdV1ftT+ZuuiHl6FjFQ4XLQznWMcxWognX+qgByn+DQOXsYRRvZK1L5eG/SG8CKJ8NL5oteTDloDnghARHFw== dependencies: - "@angular-devkit/core" "8.3.21" + "@angular-devkit/core" "8.3.22" rxjs "6.4.0" "@angular-eslint/builder@0.0.1-alpha.17": @@ -168,16 +168,16 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@8.3.21": - version "8.3.21" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.21.tgz#cbb05b86b7f34ecd81d52ccad922359e66a16a15" - integrity sha512-ZZpA7mMfIobFT06rBNxm8vucAh8W2s0huJZ4iL0BPujnhIr71PL+gDwssySWDEz2q6i4CkH9QRH76DHhtL6VSQ== +"@angular/cli@8.3.22": + version "8.3.22" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.22.tgz#2512e0aeaffdbb30ace35dc288eeba9a86f28b95" + integrity sha512-OT2rzwnxwI0ETP7rXCxjxsIAZEYo9wHP/5rRbu3m15GlQ3Bclq34ZDRwC/bRxXL5+1DfmhAs9AjtYNoFoDM4Tg== dependencies: - "@angular-devkit/architect" "0.803.21" - "@angular-devkit/core" "8.3.21" - "@angular-devkit/schematics" "8.3.21" - "@schematics/angular" "8.3.21" - "@schematics/update" "0.803.21" + "@angular-devkit/architect" "0.803.22" + "@angular-devkit/core" "8.3.22" + "@angular-devkit/schematics" "8.3.22" + "@schematics/angular" "8.3.22" + "@schematics/update" "0.803.22" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "^4.1.1" @@ -1534,58 +1534,58 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babylonjs/core@4.1.0-beta.12": - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.12.tgz#9aaaa51fa4fc72defb9e444d8376294f3bccbb0b" - integrity sha512-o5IUXJJWwZpON4YRytvYJkdhuKVf5Kf8bieotp4TVqo+ECB+mUGvxkDFoa/Mc1A0QLT7YcDSuibYQbu6asRrTQ== +"@babylonjs/core@4.1.0-beta.18": + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.18.tgz#8d4cde4e8c791f1ff979d3a95834fcb78980970b" + integrity sha512-P4k/9aMmiMPU8YG+zJy0PZRog0cOqSplApHa8KtqdexILdQECM09jpFmv4ql2SCKXF643TD4+Iqv56TXzqfuDw== dependencies: tslib "^1.10.0" -"@babylonjs/gui@4.1.0-beta.12": - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.12.tgz#b467209fde28479e340dd0db107736b0334ae6a3" - integrity sha512-7WjS0liqvtSnJKqCR3ft2cwyOlqFiAUDQwzsSax4f1Iq9ql4M5J5+LC0FLXgkAGiltut8JjioSdEG39kD3T0TA== +"@babylonjs/gui@4.1.0-beta.18": + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.18.tgz#43142a5b32c49e1453aa61a7cbe359b3c8f4af56" + integrity sha512-onsQLXTp9jipvlBcy34U9U1Du6fM2IGcBzFt0aU27rpsKSNauLcveKP8oteHluNRqBWRHranoLDeipnEy0rGbQ== dependencies: - "@babylonjs/core" "4.1.0-beta.12" + "@babylonjs/core" "4.1.0-beta.18" tslib "^1.10.0" -"@babylonjs/inspector@4.1.0-beta.12": - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.12.tgz#c2e489b2a6a29d65523eec93a44346b1e65c97ec" - integrity sha512-Wga2Q5Gu5CBiR3zNMV30hCeTlDt5DxOGogOmMlkU9IfXg84VcpgjjHa4a1NV/nDaJtOP+sANKIvxVyAgtMhhhQ== - dependencies: - "@babylonjs/core" "4.1.0-beta.12" - "@babylonjs/gui" "4.1.0-beta.12" - "@babylonjs/loaders" "4.1.0-beta.12" - "@babylonjs/materials" "4.1.0-beta.12" - "@babylonjs/serializers" "4.1.0-beta.12" - babylonjs-gltf2interface "4.1.0-beta.12" +"@babylonjs/inspector@4.1.0-beta.18": + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.18.tgz#a42b0ce0baae40f5b0d67752dbe98b988199561e" + integrity sha512-1/bNWlqjZZ5uTwByuXhtRRwnA2WKXb6F1YFRJHIJ0ZtdW94y+UNzY43pBVQVD1A/7fY2G9P9tbdP0OF4M/JdLA== + dependencies: + "@babylonjs/core" "4.1.0-beta.18" + "@babylonjs/gui" "4.1.0-beta.18" + "@babylonjs/loaders" "4.1.0-beta.18" + "@babylonjs/materials" "4.1.0-beta.18" + "@babylonjs/serializers" "4.1.0-beta.18" + babylonjs-gltf2interface "4.1.0-beta.18" tslib "^1.10.0" -"@babylonjs/loaders@4.1.0-beta.12": - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.12.tgz#a0225a705507705ca9d4730eede87c95aa4b84c7" - integrity sha512-FIZxjltGLMP3DSCtos365HjPpL7zOfzkERe+X5/yy9zkMKPrzZGcKv90MZyEx+9lrjMTV3sueDMNTnp6d9pc/g== +"@babylonjs/loaders@4.1.0-beta.18": + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.18.tgz#09cd54ad6440570e8b024b515b1f739c471c8f58" + integrity sha512-Dsh4pxVFoqIeg1A5hWN281QSPotWMroqSMS3Zrm7KejKvdcT9J4NqFneYyMSMZyBBIMCdoYAdsF2w1gfkWW9ww== dependencies: - "@babylonjs/core" "4.1.0-beta.12" - babylonjs-gltf2interface "4.1.0-beta.12" + "@babylonjs/core" "4.1.0-beta.18" + babylonjs-gltf2interface "4.1.0-beta.18" tslib "^1.10.0" -"@babylonjs/materials@4.1.0-beta.12": - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.12.tgz#71dfe537b54c243e8c7db0a46683986c6d284008" - integrity sha512-lwJ6SZySiQiT+dijkg3yddgU71sGzmiO2Zm8JzSsRJkuA2P6K8s1sZUDVAhI5h6Im8i7LiSFWLPQQjZsDaOAkA== +"@babylonjs/materials@4.1.0-beta.18": + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.18.tgz#7a3e01eff726041a59e13f84fb89099bd629cec9" + integrity sha512-iC3qvwLfMkKDO8ALRiw1xqTjaXoaDPGuKvN6SIZQYTgnBTGLt+Zl6wZ6Org76QwUdqyOwgnyJasg+m56SgmY9g== dependencies: - "@babylonjs/core" "4.1.0-beta.12" + "@babylonjs/core" "4.1.0-beta.18" tslib "^1.10.0" -"@babylonjs/serializers@4.1.0-beta.12": - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.12.tgz#0c5f6a0050af4a6b7384a6d3dcb34a8f496ea58a" - integrity sha512-T2YWPPgj6voKowx9YanPTaFqPatxfBR3oVm/uPtt2iRFvt8POy1wYWBBzjFHRJKicQflhA2LEfHWFr82xyzCCg== +"@babylonjs/serializers@4.1.0-beta.18": + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.18.tgz#1a36debb01d59b67fc7ff6cfec318eb215bc0548" + integrity sha512-U12cY43vIZf5ULvPt6A6pDp8meYdabHjSAsPExulRLy6cxhbZcWLJrXBif6ugKOz8y1Ow8GiPO0NtPVbfl8YBg== dependencies: - "@babylonjs/core" "4.1.0-beta.12" - babylonjs-gltf2interface "4.1.0-beta.12" + "@babylonjs/core" "4.1.0-beta.18" + babylonjs-gltf2interface "4.1.0-beta.18" tslib "^1.10.0" "@cnakazawa/watch@^1.0.3": @@ -1792,12 +1792,12 @@ resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-8.6.0.tgz#8540c5bd40b33fc2f443e7e86f47c0d801b8f413" integrity sha512-K4cvCEa+5hw9qrETQWO+Cha3YbVCAT8yaIKJr/N35KntTL9mQMjoL+51JWLZfBwPV0e19CFgJIyrBnVUTxwr2A== -"@ngtools/webpack@8.3.21": - version "8.3.21" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.21.tgz#d28f2b66a8aeced5260c42ae722192ec5d5e4e56" - integrity sha512-DGqmFQ52sV4uB3y3spQTNLa69oU5cwd1yIqMB4GSM+Qp+hozdzrPA2gVH90N2DDhWe8icsSQHAtZQiR9+BDL8g== +"@ngtools/webpack@8.3.22": + version "8.3.22" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.22.tgz#f6792d66430fb48c890a8145dee5088e3519860b" + integrity sha512-MES7Q0k6GpQEY74cxElUVy7jIaDBSLvY+eOUN2GKL5CznvBSp3+U5px6X7ZjPGzCp7no1L1JkV9g2e0hPatlcw== dependencies: - "@angular-devkit/core" "8.3.21" + "@angular-devkit/core" "8.3.22" enhanced-resolve "4.1.0" rxjs "6.4.0" tree-kill "1.2.1" @@ -1927,21 +1927,21 @@ "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" -"@schematics/angular@8.3.21": - version "8.3.21" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.21.tgz#4902e0b6e8be47006859009bf96a026e3d39dd27" - integrity sha512-KahQ+dHvTsGOZwY6IdzqJZLDEn0G89rrK3OY+7okZujoaLM+LXhxlPoznW1udnZJVTa3VNxYGx11fkgLtRJRqA== +"@schematics/angular@8.3.22": + version "8.3.22" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.22.tgz#fab009312bd3d50115332f2c41a92e15744ac09f" + integrity sha512-vD+UgPdbEoFPOH6xe2laFpHn/MC9R5C4A/+J9yQ6HBg5kt1YdyIBakvPOcXQCyWr5VZzDmTyMO76rd3zaef3DQ== dependencies: - "@angular-devkit/core" "8.3.21" - "@angular-devkit/schematics" "8.3.21" + "@angular-devkit/core" "8.3.22" + "@angular-devkit/schematics" "8.3.22" -"@schematics/update@0.803.21": - version "0.803.21" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.21.tgz#572c955bb132348bca03a128491ae264b0068a0a" - integrity sha512-D3BRvEBF2cJEgogvFaNOfqtTFHHv/ctSRfOeAYWjUxILtb+2DpuZ9h5QYDFhN9MPgz/vRaOqFORa3sEZCRkX4g== +"@schematics/update@0.803.22": + version "0.803.22" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.22.tgz#88b2fd3c5c2e3c5b2f453b912b281df14c94fd34" + integrity sha512-X+1sJ7YadcYxDqcLX7l7MEAIL3SHIXpCqToQdAZbAE06NdTFvg5eqiKreSdmm7ZdfL0dBe6oXi/yCDVMoL2zcw== dependencies: - "@angular-devkit/core" "8.3.21" - "@angular-devkit/schematics" "8.3.21" + "@angular-devkit/core" "8.3.22" + "@angular-devkit/schematics" "8.3.22" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.5.5" @@ -2026,10 +2026,10 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@24.0.24": - version "24.0.24" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.24.tgz#0f2f523dc77cc1bc6bef34eaf287ede887a73f05" - integrity sha512-vgaG968EDPSJPMunEDdZvZgvxYSmeH8wKqBlHSkBt1pV2XlLEVDzsj1ZhLuI4iG4Pv841tES61txSBF0obh4CQ== +"@types/jest@24.0.25": + version "24.0.25" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.25.tgz#2aba377824ce040114aa906ad2cac2c85351360f" + integrity sha512-hnP1WpjN4KbGEK4dLayul6lgtys6FPz0UfxMeMQCv0M+sTnzN3ConfiO72jHgLxl119guHgI8gLqDOrRLsyp2g== dependencies: jest-diff "^24.3.0" @@ -2048,10 +2048,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== -"@types/node@12.12.21": - version "12.12.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.21.tgz#aa44a6363291c7037111c47e4661ad210aded23f" - integrity sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA== +"@types/node@13.1.5": + version "13.1.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.5.tgz#4d5efc52a1d3e45d13e5ec9f911cbc5b089ccaec" + integrity sha512-wupvfmtbqRJzjCm1H2diy7wo31Gn1OzvqoxCfQuKM9eSecogzP0WTlrjdq7cf7jgSO2ZX6hxwgRPR8Wt7FA22g== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2846,15 +2846,15 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -babylonjs-gltf2interface@4.1.0-beta.12: - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.12.tgz#38dbc4d3b48e76d4b29d9508092d62eb17e4ae26" - integrity sha512-BOLX7C2elDVd9UtJXPnOF7qMCy7LebtpySCEnhlsZDvCIVWqBhQgzXA/d3Oeb4tGtpiZtaB87WG2bzuLWL0FzA== +babylonjs-gltf2interface@4.1.0-beta.18: + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.18.tgz#afc333500bc60066d364769f17b1bddb540754b0" + integrity sha512-DIsZ0/NhmQ9XI7mPcvqfwCdhZn6l6yiJWvHMmsTFLHaIaVUhDiUomjxAF4yPIYeX2PbtmxkJpv4TJY7QnXF9MA== -babylonjs@4.1.0-beta.12: - version "4.1.0-beta.12" - resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.12.tgz#f42d88d865c9ba984506afde3b054dec215af092" - integrity sha512-SyQVqarSuBDAmIkIzGctb35XSwuRAv+vI9CaE5rz4ls35pbvPdj0Nf3sZUePUDw6CZueRp3z2sL+zgPuvbg3Ow== +babylonjs@4.1.0-beta.18: + version "4.1.0-beta.18" + resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.18.tgz#e0c2bfe10d960adba1c5425c3c4b77c5b5fc48da" + integrity sha512-9hblkZ5Y0n16e4SBDMIglsMRpvMuLgE2IvqoTOhWHWLMJX6jtX75ZnLhBFjGIjlvO3L18H1vCUQRgIcS29wotg== bail@^1.0.0: version "1.0.4" @@ -3069,7 +3069,16 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@4.6.6, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.6: +browserslist@4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" + integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== + dependencies: + caniuse-lite "^1.0.30001017" + electron-to-chromium "^1.3.322" + node-releases "^1.1.44" + +browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.6: version "4.6.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== @@ -3276,7 +3285,12 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@1.0.30000989, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000984: +caniuse-lite@1.0.30001019: + version "1.0.30001019" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz#857e3fccaad2b2feb3f1f6d8a8f62d747ea648e1" + integrity sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g== + +caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000984: version "1.0.30000989" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== @@ -3291,6 +3305,11 @@ caniuse-lite@^1.0.30001015: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66" integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA== +caniuse-lite@^1.0.30001017: + version "1.0.30001020" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz#3f04c1737500ffda78be9beb0b5c1e2070e15926" + integrity sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA== + canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -3805,10 +3824,10 @@ core-js@3.2.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== -core-js@3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.0.tgz#2b854e451de1967d1e29896025cdc13a2518d9ea" - integrity sha512-AHPTNKzyB+YwgDWoSOCaid9PUSEF6781vsfiK8qUz62zRR448/XgK2NtCbpiUGizbep8Lrpt0Du19PpGGZvw3Q== +core-js@3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.2.tgz#2799ea1a59050f0acf50dfe89b916d6503b16caa" + integrity sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg== core-js@^2.4.0: version "2.6.9" @@ -5079,12 +5098,12 @@ fs-extra@6.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: - graceful-fs "^4.1.2" + graceful-fs "^4.2.0" jsonfile "^4.0.0" universalify "^0.1.0" @@ -5198,19 +5217,17 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -gh-pages@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-2.1.1.tgz#5be70a92f9cb70404bafabd8bb149c0e9a8c264b" - integrity sha512-yNW2SFp9xGRP/8Sk2WXuLI/Gn92oOL4HBgudn6PsqAnuWT90Y1tozJoTfX1WdrDSW5Rb90kLVOf5mm9KJ/2fDw== +gh-pages@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-2.2.0.tgz#74ebeaca8d2b9a11279dcbd4a39ddfff3e6caa24" + integrity sha512-c+yPkNOPMFGNisYg9r4qvsMIjVYikJv7ImFOhPIVPt0+AcRUamZ7zkGRLHz7FKB0xrlZ+ddSOJsZv9XAFVXLmA== dependencies: async "^2.6.1" commander "^2.18.0" email-addresses "^3.0.1" filenamify-url "^1.0.0" - fs-extra "^7.0.0" + fs-extra "^8.1.0" globby "^6.1.0" - graceful-fs "^4.1.11" - rimraf "^2.6.2" glob-parent@^3.1.0: version "3.1.0" @@ -5350,6 +5367,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -7742,6 +7764,13 @@ node-releases@^1.1.42: dependencies: semver "^6.3.0" +node-releases@^1.1.44: + version "1.1.45" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2" + integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg== + dependencies: + semver "^6.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -9363,10 +9392,10 @@ rxjs@6.4.0: dependencies: tslib "^1.9.0" -rxjs@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== +rxjs@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== dependencies: tslib "^1.9.0" @@ -10206,10 +10235,10 @@ stylelint-scss@3.13.0: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.2" -stylelint@12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-12.0.0.tgz#2e8613675f7be11769ce474f45137fdf7751380a" - integrity sha512-TwqtATrFOT07SPlUGyHN7tVhWqxwitn5BlAvyBQy/ekA+Nwu4mLU9L1dvGQPNxHUBLowjvkSW18QzHHR6/FVVQ== +stylelint@12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-12.0.1.tgz#5b1f3bf7333320acce322b49852c8b85e94ce7e4" + integrity sha512-1mn39pqZiC/e8KUPoRMc1WMM83Upb2ILaSGxkCvKxALHutEOs2txcPQocJiXdO4Zx4FY4prGqjlkwrbthAxqig== dependencies: autoprefixer "^9.7.1" balanced-match "^1.0.0" @@ -10586,10 +10615,10 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q== -ts-jest@24.2.0: - version "24.2.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.2.0.tgz#7abca28c2b4b0a1fdd715cd667d65d047ea4e768" - integrity sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag== +ts-jest@24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.3.0.tgz#b97814e3eab359ea840a1ac112deae68aa440869" + integrity sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ== dependencies: bs-logger "0.x" buffer-from "1.x" From 088dbed479955645724899d43249d048ca3de7f3 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Mon, 13 Jan 2020 09:44:36 +0100 Subject: [PATCH 41/84] feat(frontend): add undo/redo & enable `strictNullChecks` (#10) * feat(frontend): add undo/redo & enforce `strictNullChecks` * feat(frontend): undo/redo with max buffer size * test(frontend): handle possible `undefined` * feat(frontend): make remove a voxel undoable * feat(frontend): place initial voxel at [0, 0, 0] * fix(frontend): dispose previous history if new `addUndo` * refactor(frontend): extract method for creating `addUndo` --- apps/benchmark/src/main.ts | 4 +- apps/frontend/src/app/app.actions.ts | 2 +- apps/frontend/src/app/app.module.ts | 2 + apps/frontend/src/app/app.reducer.ts | 22 +++++- .../scene-viewer-container/grid.service.ts | 7 +- .../scene-viewer-container.actions.ts | 2 +- .../scene-viewer-container.component.spec.ts | 3 +- .../scene-viewer-container.component.ts | 8 +- .../scene-viewer-container.effects.ts | 2 +- .../src/app/undo-redo/undo-redo.actions.ts | 21 +++++ .../src/app/undo-redo/undo-redo.effects.ts | 58 ++++++++++++++ .../src/app/undo-redo/undo-redo.module.ts | 8 ++ .../src/app/undo-redo/undo-redo.reducer.ts | 76 +++++++++++++++++++ .../scene-viewer/scene-viewer.component.ts | 16 +++- .../lib/scene-viewer/scene-viewer.service.ts | 52 +++++++------ libs/vdb/src/lib/tools/node-to-mesh.spec.ts | 9 ++- libs/vdb/src/lib/tools/node-to-mesh.ts | 2 - libs/vdb/src/lib/tree/root-node.ts | 10 ++- tsconfig.json | 21 ++--- 19 files changed, 269 insertions(+), 56 deletions(-) create mode 100644 apps/frontend/src/app/undo-redo/undo-redo.actions.ts create mode 100644 apps/frontend/src/app/undo-redo/undo-redo.effects.ts create mode 100644 apps/frontend/src/app/undo-redo/undo-redo.module.ts create mode 100644 apps/frontend/src/app/undo-redo/undo-redo.reducer.ts diff --git a/apps/benchmark/src/main.ts b/apps/benchmark/src/main.ts index 10319c92..d6bb2c68 100644 --- a/apps/benchmark/src/main.ts +++ b/apps/benchmark/src/main.ts @@ -86,7 +86,9 @@ function convertToTestSuite(suiteName: string, currentSuite: Benchmark.Suite): T } function sumUpTotalTime(): void { - report.time = report.suites.map(s => s.time).reduce((previous, current) => previous + current, 0); + report.time = report.suites + .map(s => s.time) + .reduce((previous, current) => (previous && current ? previous + current : 0), 0); } function everySuiteFinished(): boolean { diff --git a/apps/frontend/src/app/app.actions.ts b/apps/frontend/src/app/app.actions.ts index ab592e7e..d2d34e5c 100644 --- a/apps/frontend/src/app/app.actions.ts +++ b/apps/frontend/src/app/app.actions.ts @@ -1,6 +1,6 @@ import { createAction } from '@ngrx/store'; -const actionTypePrefix = '[App]'; +const actionTypePrefix = '[app]'; export const wentOnline = createAction(`${actionTypePrefix} Went online`); export const wentOffline = createAction(`${actionTypePrefix} Went offline`); diff --git a/apps/frontend/src/app/app.module.ts b/apps/frontend/src/app/app.module.ts index 58db50bd..00108552 100644 --- a/apps/frontend/src/app/app.module.ts +++ b/apps/frontend/src/app/app.module.ts @@ -10,6 +10,7 @@ import { AppEffects } from './app.effects'; import { metaReducers, ROOT_REDUCERS } from './app.reducer'; import { SceneViewerContainerModule } from './scene-viewer-container'; import { ToolsPanelModule } from './tools-panel/tools-panel.module'; +import { UndoRedoModule } from './undo-redo/undo-redo.module'; @NgModule({ declarations: [AppComponent], @@ -38,6 +39,7 @@ import { ToolsPanelModule } from './tools-panel/tools-panel.module'; SceneViewerContainerModule, SidenavShellModule, ToolsPanelModule, + UndoRedoModule, ], providers: [], bootstrap: [AppComponent], diff --git a/apps/frontend/src/app/app.reducer.ts b/apps/frontend/src/app/app.reducer.ts index 82ec8af7..c100b744 100644 --- a/apps/frontend/src/app/app.reducer.ts +++ b/apps/frontend/src/app/app.reducer.ts @@ -10,8 +10,10 @@ import { import { environment } from '../environments/environment'; import * as fromSceneViewerContainer from './scene-viewer-container/scene-viewer-container.reducer'; import * as fromToolsPanel from './tools-panel/tools-panel.reducer'; +import * as fromUndoRedo from './undo-redo/undo-redo.reducer'; export interface State { + [fromUndoRedo.featureKey]: fromUndoRedo.State; [fromToolsPanel.featureKey]: fromToolsPanel.State; [fromSceneViewerContainer.featureKey]: fromSceneViewerContainer.State; } @@ -27,8 +29,9 @@ export const ROOT_REDUCERS = new InjectionToken> 'Root reducers token', { factory: () => ({ - [fromToolsPanel.featureKey]: fromToolsPanel.reducer, [fromSceneViewerContainer.featureKey]: fromSceneViewerContainer.reducer, + [fromToolsPanel.featureKey]: fromToolsPanel.reducer, + [fromUndoRedo.featureKey]: fromUndoRedo.reducer, }), }, ); @@ -78,3 +81,20 @@ export const selectSelectedToolId = createSelector( selectToolsPanelState, fromToolsPanel.selectSelectedToolId, ); + +/** + * UndoRedo reducers + */ +export const selectUndoRedoState = createFeatureSelector( + fromUndoRedo.featureKey, +); + +export const selectCurrentUndoAction = createSelector( + selectUndoRedoState, + fromUndoRedo.selectCurrentUndoAction, +); + +export const selectCurrentRedoAction = createSelector( + selectUndoRedoState, + fromUndoRedo.selectCurrentRedoAction, +); diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index 9197d9e7..8e2ff485 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -49,9 +49,10 @@ export class GridService { computeInternalNode1Mesh(origin: Coord): MeshData | undefined { const internal1 = this.accessor.probeInternalNode1(origin); - const mesh = nodeToMesh(internal1); - mesh.origin = internal1.origin; + if (!internal1) { + return undefined; + } - return mesh; + return nodeToMesh(internal1); } } diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts index 1651f716..3f2833a2 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts @@ -1,7 +1,7 @@ import { createAction, props } from '@ngrx/store'; import { Coord } from '@talus/vdb'; -const actionTypePrefix = '[SceneViewerContainer]'; +const actionTypePrefix = `[sceneViewerContainer]`; export const addVoxel = createAction( `${actionTypePrefix} Add voxel`, diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index cc914e18..81227396 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -66,7 +66,8 @@ describe('SceneViewerContainerComponent', () => { normal: [0, 0, 0], }); - expect(mockStore.dispatch).not.toHaveBeenCalled(); + // Only once called due to first initial added voxel at [0, 0, 0] + expect(mockStore.dispatch).toHaveBeenCalledTimes(1); }); it.each([ diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index d9efee4c..2abe4572 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; +import { AfterViewInit, ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; // import '@babylonjs/core/Rendering/edgesRenderer'; // import '@babylonjs/core/Rendering/outlineRenderer'; import { select, Store } from '@ngrx/store'; @@ -19,7 +19,7 @@ import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; `, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SceneViewerContainerComponent { +export class SceneViewerContainerComponent implements AfterViewInit { @ViewChild(SceneViewerComponent, { static: false }) private sceneViewerComponent: SceneViewerComponent; @@ -28,6 +28,10 @@ export class SceneViewerContainerComponent { constructor(private store: Store) {} + ngAfterViewInit(): void { + this.store.dispatch(addVoxel({ position: [0, 0, 0], value: 42 })); + } + onPointerPick(event: PointerPickInfo, selectedToolId: Tool): void { this.dispatchPickAction(event, selectedToolId); } diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts index fda8cc88..a9eab0b4 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts @@ -59,7 +59,7 @@ export class SceneViewerContainerEffects { next: ({ affectedOrigins }) => { affectedOrigins.map(origin => { const mesh = this.gridService.computeInternalNode1Mesh(origin); - this.sceneViewerService.updateNodeMesh(mesh); + this.sceneViewerService.updateNodeMesh(mesh, origin); }); }, }), diff --git a/apps/frontend/src/app/undo-redo/undo-redo.actions.ts b/apps/frontend/src/app/undo-redo/undo-redo.actions.ts new file mode 100644 index 00000000..c1bf041d --- /dev/null +++ b/apps/frontend/src/app/undo-redo/undo-redo.actions.ts @@ -0,0 +1,21 @@ +import { Action, createAction, props } from '@ngrx/store'; + +const actionTypePrefix = `[undoRedo]`; + +export const addUndo = createAction( + `${actionTypePrefix} Add undo`, + props<{ redoAction: Action; undoAction: Action }>(), +); + +export const undo = createAction(`${actionTypePrefix} Undo`); + +export const undone = createAction(`${actionTypePrefix} Undone`); + +export const addRedo = createAction( + `${actionTypePrefix} Add redo`, + props<{ redoAction: Action }>(), +); + +export const redo = createAction(`${actionTypePrefix} Redo`); + +export const redone = createAction(`${actionTypePrefix} Redone`); diff --git a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts new file mode 100644 index 00000000..be660702 --- /dev/null +++ b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts @@ -0,0 +1,58 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { Action, select, Store } from '@ngrx/store'; +import { filter, map, switchMap, withLatestFrom } from 'rxjs/operators'; +import * as fromApp from '../app.reducer'; +import { addVoxel, removeVoxel } from '../scene-viewer-container/scene-viewer-container.actions'; +import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; + +@Injectable() +export class UndoRedoEffects { + constructor(private actions$: Actions, private store: Store) {} + + undo$ = createEffect(() => + this.actions$.pipe( + ofType(undo), + withLatestFrom(this.store.pipe(select(fromApp.selectCurrentUndoAction))), + switchMap(([action, currentUndoAction]) => + currentUndoAction ? [currentUndoAction, undone()] : [undone()], + ), + ), + ); + + redo$ = createEffect(() => + this.actions$.pipe( + ofType(redo), + withLatestFrom(this.store.pipe(select(fromApp.selectCurrentRedoAction))), + switchMap(([action, currentRedoAction]) => + currentRedoAction ? [currentRedoAction, redone()] : [redone()], + ), + ), + ); + + userTriggeredActions$ = this.actions$.pipe( + withLatestFrom(this.store.pipe(select(fromApp.selectUndoRedoState))), + filter(([action, state]) => !state.isUndoRedoing), + map(([action, state]) => action), + ); + + addUndoActionForAddVoxel$ = createEffect(() => + this.userTriggeredActions$.pipe( + ofType(addVoxel), + map(action => [action, removeVoxel({ position: action.position })]), + map(this.createAddUndo), + ), + ); + + addUndoActionForRemoveVoxel$ = createEffect(() => + this.userTriggeredActions$.pipe( + ofType(removeVoxel), + map(action => [action, addVoxel({ position: action.position, value: 42 })]), + map(this.createAddUndo), + ), + ); + + createAddUndo([redoAction, undoAction]: Action[]): Action { + return addUndo({ redoAction, undoAction }); + } +} diff --git a/apps/frontend/src/app/undo-redo/undo-redo.module.ts b/apps/frontend/src/app/undo-redo/undo-redo.module.ts new file mode 100644 index 00000000..7dd160d4 --- /dev/null +++ b/apps/frontend/src/app/undo-redo/undo-redo.module.ts @@ -0,0 +1,8 @@ +import { NgModule } from '@angular/core'; +import { EffectsModule } from '@ngrx/effects'; +import { UndoRedoEffects } from './undo-redo.effects'; + +@NgModule({ + imports: [EffectsModule.forFeature([UndoRedoEffects])], +}) +export class UndoRedoModule {} diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts new file mode 100644 index 00000000..5b717a4e --- /dev/null +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts @@ -0,0 +1,76 @@ +import { Action, createReducer, on } from '@ngrx/store'; +import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; + +/** + * Use normal reducer instead of meta-reducer, to have the state in the normal store + * and therefore accessible (e.g. for display in app the number of redo actions). + * Also use normal effects to run/replay/dispatch the action to be undone. + */ + +export const featureKey = 'undoRedo'; + +export interface State { + currentIndex: number; + isUndoRedoing: boolean; + redoActions: Action[]; + undoActions: Action[]; +} + +export const initialState: State = { + currentIndex: -1, + isUndoRedoing: false, + redoActions: [], + undoActions: [], +}; + +const maxBufferSize = 10; +const maxBufferIndex = maxBufferSize - 1; + +export const reducer = createReducer( + initialState, + + on(addUndo, (state, { redoAction, undoAction }) => { + const newIndex = state.currentIndex + 1; + + const redoActions = state.redoActions.slice(0, newIndex); + const undoActions = state.undoActions.slice(0, newIndex); + + return { + ...state, + currentIndex: newIndex > maxBufferIndex ? maxBufferIndex : newIndex, + redoActions: [...redoActions.slice(-maxBufferIndex), redoAction], + undoActions: [...undoActions.slice(-maxBufferIndex), undoAction], + }; + }), + + on(undo, redo, state => { + return { + ...state, + isUndoRedoing: true, + }; + }), + + on(undone, state => { + const newIndex = state.currentIndex - 1; + + return { + ...state, + isUndoRedoing: false, + currentIndex: newIndex < 0 ? -1 : newIndex, + }; + }), + + on(redone, state => { + const newIndex = state.currentIndex + 1; + const maxRedoIndex = state.redoActions.length - 1; + + return { + ...state, + isUndoRedoing: false, + currentIndex: newIndex > maxRedoIndex ? maxRedoIndex : newIndex, + }; + }), +); + +export const selectCurrentUndoAction = (state: State) => state.undoActions[state.currentIndex]; +export const selectCurrentRedoAction = (state: State) => state.redoActions[state.currentIndex + 1]; diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts index 5d363801..7363c467 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts @@ -51,7 +51,7 @@ export class SceneViewerComponent implements OnInit { // Source: https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop private getFiles(event: DragEvent): File[] { - return event.dataTransfer.items + return event.dataTransfer && event.dataTransfer.items ? this.getFilesFromDataTransferItemList(event) : this.getFilesFromDataTransfer(event); } @@ -59,11 +59,19 @@ export class SceneViewerComponent implements OnInit { private getFilesFromDataTransferItemList(event: DragEvent): File[] { const files: File[] = []; + if (!event.dataTransfer) { + return files; + } + // Use DataTransferItemList interface to access the file(s) for (let i = 0; i < event.dataTransfer.items.length; i++) { // If dropped items aren't files, reject them if (event.dataTransfer.items[i].kind === 'file') { - files.push(event.dataTransfer.items[i].getAsFile()); + const file = event.dataTransfer.items[i].getAsFile(); + + if (file) { + files.push(file); + } } } @@ -73,6 +81,10 @@ export class SceneViewerComponent implements OnInit { private getFilesFromDataTransfer(event: DragEvent): File[] { const files: File[] = []; + if (!event.dataTransfer) { + return files; + } + // Use DataTransfer interface to access the file(s) for (let i = 0; i < event.dataTransfer.files.length; i++) { files.push(event.dataTransfer.files[i]); diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index 451bfbc2..cf4d42fd 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@angular/core'; +import { AbstractMesh } from '@babylonjs/core'; // Babylon.js needs to target individual files to fully benefit from tree shaking. // See: https://doc.babylonjs.com/features/es6_support#tree-shaking import { ArcRotateCamera } from '@babylonjs/core/Cameras/arcRotateCamera'; @@ -10,7 +11,6 @@ import { Vector3 } from '@babylonjs/core/Maths/math.vector'; import { VertexBuffer } from '@babylonjs/core/Meshes/buffer'; import { Mesh } from '@babylonjs/core/Meshes/mesh'; import { VertexData } from '@babylonjs/core/Meshes/mesh.vertexData'; -import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder'; import { TransformNode } from '@babylonjs/core/Meshes/transformNode'; import '@babylonjs/core/Physics/physicsHelper'; // Needed for `onPointerPick` import { Scene } from '@babylonjs/core/scene'; @@ -71,11 +71,6 @@ export class SceneViewerService { this.createLight(); this.registerPointerPick(); - - const box = MeshBuilder.CreateBox('box', {}, this.scene); - box.position.x = 0.5; - box.position.y = 0.5; - box.position.z = 0.5; } startRendering(): void { @@ -86,8 +81,8 @@ export class SceneViewerService { this.engine.resize(); } - updateNodeMesh(mesh?: MeshData): void { - const meshName = `node1 [${mesh.origin}]`; + updateNodeMesh(mesh: MeshData | undefined, origin: Coord): void { + const meshName = `node1 [${origin}]`; this.deleteMesh(meshName); @@ -140,7 +135,10 @@ export class SceneViewerService { camera.angularSensibilityX = 200; camera.angularSensibilityY = 100; - camera.attachControl(this.engine.getRenderingCanvas(), true, false, 2); + const renderingCanvas = this.engine.getRenderingCanvas(); + if (renderingCanvas) { + camera.attachControl(renderingCanvas, true, false, 2); + } camera.setPosition(new Vector3(20, 20, -20)); } @@ -150,30 +148,34 @@ export class SceneViewerService { private registerPointerPick(): void { this.scene.onPointerPick = (event: PointerEvent, pickInfo: PickingInfo): void => { - const info: PointerPickInfo = { - pickedPoint: vector3ToCoord(pickInfo.pickedPoint), - pointerButton: event.button, - normal: this.getNormal(pickInfo), - }; - - this.pointerPick$.next(info); + if (pickInfo.pickedMesh && pickInfo.pickedPoint) { + const info: PointerPickInfo = { + pickedPoint: vector3ToCoord(pickInfo.pickedPoint), + pointerButton: event.button, + normal: this.getNormal(pickInfo.pickedMesh, pickInfo.faceId), + }; + + this.pointerPick$.next(info); + } }; } /** * PickingInfo.getNormal() requires to have indices which are not available - * for an unindexed custom mesh. Therefore, read normals directly from picked mesh. + * for an un-indexed custom mesh. Therefore, read normals directly from picked mesh. * * https://github.com/BabylonJS/Babylon.js/blob/master/src/Collisions/pickingInfo.ts#L65 */ - private getNormal(pickInfo: PickingInfo): Coord { - const normals = pickInfo.pickedMesh.getVerticesData(VertexBuffer.NormalKind); - - return [ - normals[pickInfo.faceId * 9], - normals[pickInfo.faceId * 9 + 1], - normals[pickInfo.faceId * 9 + 2], - ]; + private getNormal(pickedMesh: AbstractMesh, faceId: number): Coord { + const normals = pickedMesh.getVerticesData(VertexBuffer.NormalKind); + + if (!normals) { + throw new Error('Could not get normals from picked mesh.'); + } + + const faceIndex = faceId * 9; + + return [normals[faceIndex], normals[faceIndex + 1], normals[faceIndex + 2]]; } private deleteMesh(name: string): void { diff --git a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts index 60cdd34e..a221ae6c 100644 --- a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts +++ b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts @@ -19,8 +19,11 @@ describe('nodeToMesh()', () => { const xyz = 3; const rgba = 4; - expect(meshData.positions.length).toEqual(voxels * triangleCorners * xyz); - expect(meshData.colors.length).toEqual(voxels * triangleCorners * rgba); - expect(meshData.normals.length).toEqual(meshData.positions.length); + expect(meshData).toBeDefined(); + if (meshData) { + expect(meshData.positions.length).toEqual(voxels * triangleCorners * xyz); + expect(meshData.colors.length).toEqual(voxels * triangleCorners * rgba); + expect(meshData.normals.length).toEqual(meshData.positions.length); + } }); }); diff --git a/libs/vdb/src/lib/tools/node-to-mesh.ts b/libs/vdb/src/lib/tools/node-to-mesh.ts index f3d73b8f..321478fb 100644 --- a/libs/vdb/src/lib/tools/node-to-mesh.ts +++ b/libs/vdb/src/lib/tools/node-to-mesh.ts @@ -14,13 +14,11 @@ * 0--- X 0-------1 */ -import { Coord } from '../math'; import { HashableNode } from '../tree/node'; export interface MeshData { colors: number[]; normals: number[]; - origin?: Coord; positions: number[]; } diff --git a/libs/vdb/src/lib/tree/root-node.ts b/libs/vdb/src/lib/tree/root-node.ts index caabf4b5..d26b7bde 100644 --- a/libs/vdb/src/lib/tree/root-node.ts +++ b/libs/vdb/src/lib/tree/root-node.ts @@ -74,8 +74,8 @@ export class RootNode implements HashableNode { } setValueOn(xyz: Coord, value: T): void { + let child: HashableNode | undefined; const struct = this.findCoord(xyz); - let child: HashableNode; if (!struct) { child = new InternalNode2(xyz, this._background); @@ -93,7 +93,7 @@ export class RootNode implements HashableNode { } setValueAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void { - let child: HashableNode; + let child: HashableNode | undefined; const struct = this.findCoord(xyz); if (!struct) { @@ -113,7 +113,7 @@ export class RootNode implements HashableNode { } setValueOffAndCache(xyz: Coord, value: T, accessor: ValueAccessor3): void { - let child: HashableNode; + let child: HashableNode | undefined; const struct = this.findCoord(xyz); if (!struct) { @@ -202,6 +202,10 @@ class NodeStruct { constructor(private child?: HashableNode) {} getChild(): HashableNode { + if (!this.child) { + throw new Error('Access undefined child.'); + } + return this.child; } diff --git a/tsconfig.json b/tsconfig.json index 79137cd9..5139f576 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,26 +1,27 @@ { "compileOnSave": false, "compilerOptions": { - "rootDir": ".", - "sourceMap": true, + "baseUrl": ".", "declaration": false, - "moduleResolution": "node", "emitDecoratorMetadata": true, "esModuleInterop": true, "experimentalDecorators": true, "importHelpers": true, - "target": "es2015", - "module": "esnext", - "typeRoots": ["node_modules/@types"], "lib": ["es2017", "dom"], - "skipLibCheck": true, - "skipDefaultLibCheck": true, - "baseUrl": ".", + "module": "esnext", + "moduleResolution": "node", "paths": { "@talus/ui": ["libs/ui/src/index.ts"], "@talus/math": ["libs/math/src/index.ts"], "@talus/vdb": ["libs/vdb/src/index.ts"] - } + }, + "rootDir": ".", + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strictNullChecks": true, + "target": "es2015", + "typeRoots": ["node_modules/@types"] }, "exclude": ["node_modules", "tmp"] } From 700ff89aa65ffae75b252ddae42d6f9e23ff9a87 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Tue, 14 Jan 2020 08:09:33 +0100 Subject: [PATCH 42/84] feat(frontend): set active state of voxel, return color when deleting (#11) --- .../scene-viewer-container/grid.service.ts | 2 +- libs/vdb/src/lib/tree/internal-node.ts | 21 ++++++++++++++++ libs/vdb/src/lib/tree/leaf-node.ts | 15 ++++++++++++ libs/vdb/src/lib/tree/node.ts | 8 +++++++ libs/vdb/src/lib/tree/root-node.ts | 24 +++++++++++++++++++ libs/vdb/src/lib/tree/value-accessor.spec.ts | 21 ++++++++++++++++ libs/vdb/src/lib/tree/value-accessor.ts | 14 +++++++++++ libs/vdb/src/lib/util/node-mask.ts | 4 ++++ 8 files changed, 108 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index 8e2ff485..83e49344 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -41,7 +41,7 @@ export class GridService { } removeVoxel(xyz: Coord): Coord { - this.accessor.setValueOff(xyz, this.grid.background); + this.accessor.setActiveState(xyz, false); return this.accessor.internalNode1Origin; } diff --git a/libs/vdb/src/lib/tree/internal-node.ts b/libs/vdb/src/lib/tree/internal-node.ts index b877927e..072d7e9c 100644 --- a/libs/vdb/src/lib/tree/internal-node.ts +++ b/libs/vdb/src/lib/tree/internal-node.ts @@ -163,6 +163,27 @@ abstract class InternalNode implements HashableNode { } } + setActiveStateAndCache(xyz: Coord, on: boolean, accessor: ValueAccessor3): void { + const i: Index = this.coordToOffset(xyz); + const node = this.nodes[i]; + let hasChild = this.childMask.isOn(i); + + if (!hasChild) { + if (on !== this.valueMask.isOn(i)) { + // If the voxel belongs to a tile with the wrong active state, + // then a child subtree must be constructed. + // 'on' is the voxel's new state, therefore '!on' is the tile's current state + hasChild = true; + this.setChildNode(i, this.createChildNode(xyz, node.getValue(), !on)); + } + } + + if (hasChild) { + accessor.insert(xyz, node.getChild()); + node.getChild().setActiveStateAndCache(xyz, on, accessor); + } + } + isValueOn(xyz: Coord): boolean { const i: Index = this.coordToOffset(xyz); if (this.childMask.isOff(i)) { diff --git a/libs/vdb/src/lib/tree/leaf-node.ts b/libs/vdb/src/lib/tree/leaf-node.ts index 6fbed000..b7d9b10d 100644 --- a/libs/vdb/src/lib/tree/leaf-node.ts +++ b/libs/vdb/src/lib/tree/leaf-node.ts @@ -98,6 +98,13 @@ export class LeafNode implements HashableNode { this.valueMask.setOff(offset); } + /** + * Set the active state of the voxel at the given coordinates but don't change its value. + */ + setActiveState(xyz: Coord, on: boolean): void { + this.valueMask.set(LeafNode.coordToOffset(xyz), on); + } + /** * Return the value of the voxel at the given coordinates. */ @@ -149,6 +156,14 @@ export class LeafNode implements HashableNode { return this.isValueOn(xyz); } + /** + * @brief Set the active state of the voxel at the given coordinates without changing its value. + * @note Used internally by ValueAccessor. + */ + setActiveStateAndCache(xyz: Coord, on: boolean, _: ValueAccessor3): void { + return this.setActiveState(xyz, on); + } + /** * Return the global coordinates for a linear table offset. */ diff --git a/libs/vdb/src/lib/tree/node.ts b/libs/vdb/src/lib/tree/node.ts index a4fff5bb..01d4c8cc 100644 --- a/libs/vdb/src/lib/tree/node.ts +++ b/libs/vdb/src/lib/tree/node.ts @@ -64,6 +64,14 @@ export interface HashableNode extends Node { * @note Used internally by ValueAccessor. */ isValueOnAndCache(xyz: Coord, accessor: ValueAccessor3): boolean; + + /** + * Set the active state of the voxel at the given coordinates without changing its value. + * If necessary, update the accessor with pointers to the nodes along the path + * from the root node to the node containing the voxel. + * @note Used internally by ValueAccessor. + */ + setActiveStateAndCache(xyz: Coord, on: boolean, accessor: ValueAccessor3): void; } export interface IterableNode { diff --git a/libs/vdb/src/lib/tree/root-node.ts b/libs/vdb/src/lib/tree/root-node.ts index d26b7bde..8366e667 100644 --- a/libs/vdb/src/lib/tree/root-node.ts +++ b/libs/vdb/src/lib/tree/root-node.ts @@ -134,6 +134,30 @@ export class RootNode implements HashableNode { } } + setActiveStateAndCache(xyz: Coord, on: boolean, accessor: ValueAccessor3): void { + let child: HashableNode | undefined; + const struct = this.findCoord(xyz); + + if (!struct) { + if (on) { + child = new InternalNode2(xyz, this._background); + this.table.set(RootNode.coordToKey(xyz), new NodeStruct(child)); + } /*else { + // Nothing to do; (x, y, z) is background and therefore already inactive. + }*/ + } else if (struct.isChild()) { + child = struct.getChild(); + } else if (on !== struct.getTile().active) { + child = new InternalNode2(xyz, struct.getTile().value, !on); + struct.setChild(child); + } + + if (child) { + accessor.insert(xyz, child); + child.setActiveStateAndCache(xyz, on, accessor); + } + } + isValueOn(xyz: Coord): boolean { const struct = this.findCoord(xyz); diff --git a/libs/vdb/src/lib/tree/value-accessor.spec.ts b/libs/vdb/src/lib/tree/value-accessor.spec.ts index 425daade..d110c44e 100644 --- a/libs/vdb/src/lib/tree/value-accessor.spec.ts +++ b/libs/vdb/src/lib/tree/value-accessor.spec.ts @@ -64,6 +64,27 @@ describe('ValueAccessor', () => { }); }); + describe('setActiveState()', () => { + it('should set state', () => { + const tree = new Tree(0); + const accessor = new ValueAccessor3(tree); + + accessor.setValueOn([0, 0, 0], 1496); + expect(accessor.getValue([0, 0, 0])).toEqual(1496); + expect(accessor.isValueOn([0, 0, 0])).toEqual(true); + + accessor.setActiveState([0, 0, 0], false); + expect(accessor.getValue([0, 0, 0])).toEqual(1496); + expect(accessor.isValueOn([0, 0, 0])).toBeFalsy(); + + accessor.setActiveState([0, 0, 0], true); + expect(accessor.getValue([0, 0, 0])).toEqual(1496); + expect(accessor.isValueOn([0, 0, 0])).toBeTruthy(); + + expect(accessor.isCached([0, 0, 0])).toBeTruthy(); + }); + }); + describe('isValueOn()', () => { it('should set value and (de)activate voxel', () => { const tree = new Tree(0); diff --git a/libs/vdb/src/lib/tree/value-accessor.ts b/libs/vdb/src/lib/tree/value-accessor.ts index 4b881ff4..d2d54fa0 100644 --- a/libs/vdb/src/lib/tree/value-accessor.ts +++ b/libs/vdb/src/lib/tree/value-accessor.ts @@ -126,6 +126,20 @@ export class ValueAccessor3 { return this.tree.root.isValueOnAndCache(xyz, this); } + /** + * Set the active state of the voxel at the given coordinates without changing its value. + */ + setActiveState(xyz: Coord, on: boolean): void { + if (this.isHashed0(xyz)) { + this.leafNode.setActiveStateAndCache(xyz, on, this); + } else if (this.isHashed1(xyz)) { + this.internalNode1.setActiveStateAndCache(xyz, on, this); + } else if (this.isHashed2(xyz)) { + this.internalNode2.setActiveStateAndCache(xyz, on, this); + } + this.tree.root.setActiveStateAndCache(xyz, on, this); + } + // tslint:disable:no-bitwise insert(xyz: Coord, node: HashableNode): void { if (node instanceof LeafNode) { diff --git a/libs/vdb/src/lib/util/node-mask.ts b/libs/vdb/src/lib/util/node-mask.ts index a654a154..5c45e9a8 100644 --- a/libs/vdb/src/lib/util/node-mask.ts +++ b/libs/vdb/src/lib/util/node-mask.ts @@ -51,4 +51,8 @@ export class NodeMask { isOff(i: Index): boolean { return this.mask.test(i) === false; } + + set(i: Index, on: boolean): void { + on ? this.setOn(i) : this.setOff(i); + } } From 4b355762fa659818140d539ef1a8aeb2f7d407c0 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Wed, 15 Jan 2020 10:19:15 +0100 Subject: [PATCH 43/84] feat(ui/frontend): add menu-bar (#12) * feat(frontend): add menu-bar * feat(frontend): add menu-bar-container * test(frontend): inject mock store for menu-bar-container * refactor(frontend): add missing `menu-bar.component` * test(frontend): import `MenuBarModule` --- apps/frontend/src/app/app.component.scss | 11 +++++ apps/frontend/src/app/app.component.spec.ts | 14 +++++- apps/frontend/src/app/app.component.ts | 31 +++++++----- apps/frontend/src/app/app.module.ts | 2 + .../menu-bar-container.actions.ts | 6 +++ .../menu-bar-container.component.spec.ts | 42 ++++++++++++++++ .../menu-bar-container.component.ts | 40 ++++++++++++++++ .../menu-bar-container.module.ts | 10 ++++ .../app/tools-panel/tools-panel.actions.ts | 2 +- .../src/app/undo-redo/undo-redo.effects.ts | 5 +- .../src/app/undo-redo/undo-redo.reducer.ts | 3 +- libs/ui/src/index.ts | 5 +- libs/ui/src/lib/menu-bar/index.ts | 2 + .../src/lib/menu-bar/menu-bar.component.scss | 5 ++ .../lib/menu-bar/menu-bar.component.spec.ts | 24 ++++++++++ .../ui/src/lib/menu-bar/menu-bar.component.ts | 48 +++++++++++++++++++ libs/ui/src/lib/menu-bar/menu-bar.module.ts | 11 +++++ .../scene-viewer/scene-viewer.component.scss | 4 +- .../sidenav-shell.component.scss | 1 - 19 files changed, 244 insertions(+), 22 deletions(-) create mode 100644 apps/frontend/src/app/app.component.scss create mode 100644 apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts create mode 100644 apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts create mode 100644 apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts create mode 100644 apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts create mode 100644 libs/ui/src/lib/menu-bar/index.ts create mode 100644 libs/ui/src/lib/menu-bar/menu-bar.component.scss create mode 100644 libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts create mode 100644 libs/ui/src/lib/menu-bar/menu-bar.component.ts create mode 100644 libs/ui/src/lib/menu-bar/menu-bar.module.ts diff --git a/apps/frontend/src/app/app.component.scss b/apps/frontend/src/app/app.component.scss new file mode 100644 index 00000000..f2cbf979 --- /dev/null +++ b/apps/frontend/src/app/app.component.scss @@ -0,0 +1,11 @@ +:host { + display: flex; + flex-flow: column; + height: 100%; +} + +main { + flex-grow: 1; + // https://stackoverflow.com/a/38383437 + min-height: 0; +} diff --git a/apps/frontend/src/app/app.component.spec.ts b/apps/frontend/src/app/app.component.spec.ts index 4605e2a5..20f333bc 100644 --- a/apps/frontend/src/app/app.component.spec.ts +++ b/apps/frontend/src/app/app.component.spec.ts @@ -5,6 +5,13 @@ import { RouterTestingModule } from '@angular/router/testing'; import { SceneViewerTestModule, SidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; +@Component({ + selector: 'fe-menu-bar-container', + template: '', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +class MenuBarContainerStubComponent {} + @Component({ selector: 'fe-scene-viewer-container', template: '', @@ -22,7 +29,12 @@ class ToolsPanelStubComponent {} describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [AppComponent, SceneViewerContainerStubComponent, ToolsPanelStubComponent], + declarations: [ + AppComponent, + MenuBarContainerStubComponent, + SceneViewerContainerStubComponent, + ToolsPanelStubComponent, + ], imports: [ BrowserAnimationsModule, RouterTestingModule, diff --git a/apps/frontend/src/app/app.component.ts b/apps/frontend/src/app/app.component.ts index a5ef2d16..26ac5b17 100644 --- a/apps/frontend/src/app/app.component.ts +++ b/apps/frontend/src/app/app.component.ts @@ -3,21 +3,30 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ selector: 'fe-root', template: ` - - - - +
+ +
- - Right - +
+ + + + - - - - + + Right + + + + + + +
+ + `, changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./app.component.scss'], }) export class AppComponent { title = 'frontend'; diff --git a/apps/frontend/src/app/app.module.ts b/apps/frontend/src/app/app.module.ts index 00108552..67ca1a26 100644 --- a/apps/frontend/src/app/app.module.ts +++ b/apps/frontend/src/app/app.module.ts @@ -8,6 +8,7 @@ import { SidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; import { AppEffects } from './app.effects'; import { metaReducers, ROOT_REDUCERS } from './app.reducer'; +import { MenuBarContainerModule } from './menu-bar-container/menu-bar-container.module'; import { SceneViewerContainerModule } from './scene-viewer-container'; import { ToolsPanelModule } from './tools-panel/tools-panel.module'; import { UndoRedoModule } from './undo-redo/undo-redo.module'; @@ -36,6 +37,7 @@ import { UndoRedoModule } from './undo-redo/undo-redo.module'; }, }), + MenuBarContainerModule, SceneViewerContainerModule, SidenavShellModule, ToolsPanelModule, diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts new file mode 100644 index 00000000..04d964a2 --- /dev/null +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts @@ -0,0 +1,6 @@ +import { createAction } from '@ngrx/store'; + +const actionTypePrefix = `[menuBarContainer]`; + +export const undo = createAction(`${actionTypePrefix} Undo`); +export const redo = createAction(`${actionTypePrefix} Redo`); diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts new file mode 100644 index 00000000..d4ec9c9e --- /dev/null +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts @@ -0,0 +1,42 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { Store, StoreModule } from '@ngrx/store'; +import { MockStore } from '@ngrx/store/testing'; +import { ROOT_REDUCERS, State } from '../app.reducer'; +import { MenuBarContainerComponent } from './menu-bar-container.component'; +import { MenuBarContainerModule } from './menu-bar-container.module'; + +describe('MenuBarComponent', () => { + let component: MenuBarContainerComponent; + let fixture: ComponentFixture; + + let store: MockStore; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [], + imports: [ + MenuBarContainerModule, + StoreModule.forRoot(ROOT_REDUCERS, { + runtimeChecks: { + strictStateImmutability: true, + strictActionImmutability: true, + strictStateSerializability: true, + strictActionSerializability: true, + }, + }), + ], + }).compileComponents(); + + store = TestBed.get>(Store); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MenuBarContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts new file mode 100644 index 00000000..a2e76188 --- /dev/null +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts @@ -0,0 +1,40 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { Action, Store } from '@ngrx/store'; +import { UiMenuBarConfig } from '@talus/ui'; +import * as fromApp from '../app.reducer'; +import { redo, undo } from './menu-bar-container.actions'; + +@Component({ + selector: 'fe-menu-bar-container', + template: ` + + `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MenuBarContainerComponent { + menuConfig: UiMenuBarConfig = { + menus: [ + { + label: 'Edit', + menuItems: [ + { + icon: 'undo', + label: 'Undo', + value: undo(), + }, + { + icon: 'redo', + label: 'Redo', + value: redo(), + }, + ], + }, + ], + }; + + constructor(private store: Store) {} + + onMenuItemClick(action: Action): void { + this.store.dispatch(action); + } +} diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts new file mode 100644 index 00000000..b8d0c534 --- /dev/null +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { MenuBarModule } from '@talus/ui'; +import { MenuBarContainerComponent } from './menu-bar-container.component'; + +@NgModule({ + declarations: [MenuBarContainerComponent], + imports: [MenuBarModule], + exports: [MenuBarContainerComponent], +}) +export class MenuBarContainerModule {} diff --git a/apps/frontend/src/app/tools-panel/tools-panel.actions.ts b/apps/frontend/src/app/tools-panel/tools-panel.actions.ts index 308ce61b..1827a91b 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.actions.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.actions.ts @@ -1,4 +1,4 @@ import { createAction, props } from '@ngrx/store'; import { Tool } from './tool.model'; -export const selectTool = createAction('[ToolsPanel] Select tool', props<{ id: Tool }>()); +export const selectTool = createAction('[toolsPanel] Select tool', props<{ id: Tool }>()); diff --git a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts index be660702..65d2a52c 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts @@ -3,6 +3,7 @@ import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Action, select, Store } from '@ngrx/store'; import { filter, map, switchMap, withLatestFrom } from 'rxjs/operators'; import * as fromApp from '../app.reducer'; +import * as menuBarContainerActions from '../menu-bar-container/menu-bar-container.actions'; import { addVoxel, removeVoxel } from '../scene-viewer-container/scene-viewer-container.actions'; import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; @@ -12,7 +13,7 @@ export class UndoRedoEffects { undo$ = createEffect(() => this.actions$.pipe( - ofType(undo), + ofType(undo, menuBarContainerActions.undo), withLatestFrom(this.store.pipe(select(fromApp.selectCurrentUndoAction))), switchMap(([action, currentUndoAction]) => currentUndoAction ? [currentUndoAction, undone()] : [undone()], @@ -22,7 +23,7 @@ export class UndoRedoEffects { redo$ = createEffect(() => this.actions$.pipe( - ofType(redo), + ofType(redo, menuBarContainerActions.redo), withLatestFrom(this.store.pipe(select(fromApp.selectCurrentRedoAction))), switchMap(([action, currentRedoAction]) => currentRedoAction ? [currentRedoAction, redone()] : [redone()], diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts index 5b717a4e..ad36de14 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts @@ -1,4 +1,5 @@ import { Action, createReducer, on } from '@ngrx/store'; +import * as menuBarContainerActions from '../menu-bar-container/menu-bar-container.actions'; import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; /** @@ -43,7 +44,7 @@ export const reducer = createReducer( }; }), - on(undo, redo, state => { + on(undo, menuBarContainerActions.undo, redo, menuBarContainerActions.redo, state => { return { ...state, isUndoRedoing: true, diff --git a/libs/ui/src/index.ts b/libs/ui/src/index.ts index 03119d04..5793e9fa 100644 --- a/libs/ui/src/index.ts +++ b/libs/ui/src/index.ts @@ -1,4 +1,5 @@ -export * from './lib/ui.module'; -export * from './lib/sidenav-shell'; +export * from './lib/menu-bar'; export * from './lib/scene-viewer'; +export * from './lib/sidenav-shell'; export * from './lib/toolbar'; +export * from './lib/ui.module'; diff --git a/libs/ui/src/lib/menu-bar/index.ts b/libs/ui/src/lib/menu-bar/index.ts new file mode 100644 index 00000000..3a658a8f --- /dev/null +++ b/libs/ui/src/lib/menu-bar/index.ts @@ -0,0 +1,2 @@ +export * from './menu-bar.component'; +export * from './menu-bar.module'; diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.scss b/libs/ui/src/lib/menu-bar/menu-bar.component.scss new file mode 100644 index 00000000..22da7177 --- /dev/null +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.scss @@ -0,0 +1,5 @@ +$angular-button-height: 36px; + +mat-toolbar { + height: $angular-button-height; +} diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts new file mode 100644 index 00000000..1d7c4150 --- /dev/null +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { MenuBarComponent } from './menu-bar.component'; +import { MenuBarModule } from './menu-bar.module'; + +describe('MenuBarComponent', () => { + let component: MenuBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [MenuBarModule], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MenuBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.ts new file mode 100644 index 00000000..35a0b300 --- /dev/null +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.ts @@ -0,0 +1,48 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; + +export interface UiMenuBarConfig { + menus: UiMenuBarMenu[]; +} + +interface UiMenuBarMenu { + label: string; + menuItems: UiMenuBarMenuItem[]; +} + +interface UiMenuBarMenuItem { + icon?: string; + label: string; + value: T; +} + +@Component({ + selector: 'ui-menu-bar', + template: ` + + + + + + + + + `, + styleUrls: ['./menu-bar.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MenuBarComponent { + @Input() menuConfig: UiMenuBarConfig = { menus: [] }; + + @Output() menuItemClick = new EventEmitter(); + + onMenuItemClick(value: any): void { + this.menuItemClick.emit(value); + } +} diff --git a/libs/ui/src/lib/menu-bar/menu-bar.module.ts b/libs/ui/src/lib/menu-bar/menu-bar.module.ts new file mode 100644 index 00000000..63616842 --- /dev/null +++ b/libs/ui/src/lib/menu-bar/menu-bar.module.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule } from '@angular/material'; +import { MenuBarComponent } from './menu-bar.component'; + +@NgModule({ + declarations: [MenuBarComponent], + imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule], + exports: [MenuBarComponent], +}) +export class MenuBarModule {} diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss b/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss index 519ffd16..5a6bfab9 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss @@ -1,6 +1,4 @@ -:host, canvas { - display: block; - width: 100%; height: 100%; + width: 100%; } diff --git a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.scss b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.scss index dbc3fea8..62b77cef 100644 --- a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.scss +++ b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.scss @@ -1,6 +1,5 @@ :host, mat-sidenav-container { - display: block; height: 100%; } From 03395436c5bd2eee0e4fd99d617002b60bf6405a Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Wed, 15 Jan 2020 11:28:10 +0100 Subject: [PATCH 44/84] feat(frontend): undo/redo with start/end actions (#13) * feat(frontend): undo/redo with start/end actions * test(frontend): provide `valueToColor()` * feat(frontend): set random color when adding a voxel * test(frontend): add same color of voxel * refactor(frontend): use directly `props` * refactor(frontend): throw error when coord&values not same length --- apps/frontend/src/app/app.reducer.ts | 18 +++- .../scene-viewer-container/grid.service.ts | 60 ++++++++++---- .../scene-viewer-container.actions.ts | 13 +-- .../scene-viewer-container.component.spec.ts | 4 +- .../scene-viewer-container.component.ts | 2 +- .../scene-viewer-container.effects.ts | 38 ++++++--- .../src/app/undo-redo/undo-redo.actions.ts | 7 +- .../src/app/undo-redo/undo-redo.effects.ts | 80 ++++++++++++++---- .../src/app/undo-redo/undo-redo.reducer.ts | 66 ++++++++++----- libs/vdb/src/lib/tools/node-to-mesh.spec.ts | 2 +- libs/vdb/src/lib/tools/node-to-mesh.ts | 82 +++++++++---------- 11 files changed, 250 insertions(+), 122 deletions(-) diff --git a/apps/frontend/src/app/app.reducer.ts b/apps/frontend/src/app/app.reducer.ts index c100b744..4c401a18 100644 --- a/apps/frontend/src/app/app.reducer.ts +++ b/apps/frontend/src/app/app.reducer.ts @@ -89,12 +89,22 @@ export const selectUndoRedoState = createFeatureSelector(); + addVoxels(coords: Coord[], values: number[]): VoxelChange[] { + const changes = new Map(); if (coords.length !== values.length) { - coords.forEach(xyz => { - const affected = this.addVoxel(xyz, values[0]); - affectedOrigins.set(affected.toString(), affected); - }); - } else { - coords.forEach((xyz, i) => { - const affected = this.addVoxel(xyz, values[i]); - affectedOrigins.set(affected.toString(), affected); - }); + throw new Error(`Coordinates and values don't have the same length.`); } - return Array.from(affectedOrigins.values()); + coords.forEach((xyz, i) => { + const change = this.addVoxel(xyz, values[i]); + changes.set(change.affectedNodeOrigin.toString(), change); + }); + + return Array.from(changes.values()); } - removeVoxel(xyz: Coord): Coord { + removeVoxel(xyz: Coord): VoxelChange { this.accessor.setActiveState(xyz, false); - return this.accessor.internalNode1Origin; + return { + affectedNodeOrigin: this.accessor.internalNode1Origin, + value: this.accessor.getValue(xyz), + position: xyz, + }; } computeInternalNode1Mesh(origin: Coord): MeshData | undefined { @@ -53,6 +69,16 @@ export class GridService { return undefined; } - return nodeToMesh(internal1); + return nodeToMesh(internal1, this.valueToColor); } + + private valueToColor = (value: number): [number, number, number, number] => { + return this.colors[value % 8]; + }; +} + +export interface VoxelChange { + affectedNodeOrigin: Coord; + value: number; + position: Coord; } diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts index 3f2833a2..5154e280 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts @@ -1,5 +1,6 @@ import { createAction, props } from '@ngrx/store'; import { Coord } from '@talus/vdb'; +import { VoxelChange } from './grid.service'; const actionTypePrefix = `[sceneViewerContainer]`; @@ -8,10 +9,7 @@ export const addVoxel = createAction( props<{ position: Coord; value: number }>(), ); export const addVoxelFailed = createAction(`${actionTypePrefix} Add voxel failed`); -export const voxelAdded = createAction( - `${actionTypePrefix} Voxel added`, - props<{ affectedOrigins: Coord[] }>(), -); +export const voxelAdded = createAction(`${actionTypePrefix} Voxel added`, props()); export const addVoxels = createAction( `${actionTypePrefix} Add voxels`, @@ -20,7 +18,7 @@ export const addVoxels = createAction( export const addVoxelsFailed = createAction(`${actionTypePrefix} Add voxels failed`); export const voxelsAdded = createAction( `${actionTypePrefix} Voxels added`, - props<{ affectedOrigins: Coord[] }>(), + props<{ voxelChanges: VoxelChange[] }>(), ); export const removeVoxel = createAction( @@ -28,7 +26,4 @@ export const removeVoxel = createAction( props<{ position: Coord }>(), ); export const removeVoxelFailed = createAction(`${actionTypePrefix} Remove voxel failed`); -export const voxelRemoved = createAction( - `${actionTypePrefix} Voxel removed`, - props<{ affectedOrigins: Coord[] }>(), -); +export const voxelRemoved = createAction(`${actionTypePrefix} Voxel removed`, props()); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index 81227396..931997cf 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -114,7 +114,8 @@ describe('SceneViewerContainerComponent', () => { ])( 'should dispatch `addVoxel` action for %j', (pickedPoint: Coord, position: Coord, normal: Coord) => { - const action = addVoxel({ position, value: 42 }); + const initialAction = addVoxel({ position: [0, 0, 0], value: 42 }); + const action = addVoxel({ position, value: 1 }); stubComponent.pointerPick.next({ pickedPoint, @@ -122,6 +123,7 @@ describe('SceneViewerContainerComponent', () => { normal, }); + expect(mockStore.dispatch).toHaveBeenCalledWith(initialAction); expect(mockStore.dispatch).toHaveBeenCalledWith(action); }, ); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index 2abe4572..b97f0f45 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -49,7 +49,7 @@ export class SceneViewerContainerComponent implements AfterViewInit { switch (selectedToolId) { case Tool.AddVoxel: this.store.dispatch( - addVoxel({ position: this.calcVoxelToAddPosition(pickInfo), value: 42 }), + addVoxel({ position: this.calcVoxelToAddPosition(pickInfo), value: 1 }), ); break; case Tool.RemoveVoxel: diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts index a9eab0b4..d68c5e6e 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { SceneViewerService } from '@talus/ui'; +import { Coord } from '@talus/vdb'; import { of } from 'rxjs'; -import { catchError, map, tap } from 'rxjs/operators'; +import { catchError, map } from 'rxjs/operators'; import { GridService } from './grid.service'; import { addVoxel, @@ -28,7 +29,7 @@ export class SceneViewerContainerEffects { this.actions$.pipe( ofType(addVoxel), map(({ position, value }) => this.gridService.addVoxel(position, value)), - map(affectedOrigin => voxelAdded({ affectedOrigins: [affectedOrigin] })), + map(voxelAdded), catchError(() => of(addVoxelFailed())), ), ); @@ -37,7 +38,7 @@ export class SceneViewerContainerEffects { this.actions$.pipe( ofType(addVoxels), map(({ positions, values }) => this.gridService.addVoxels(positions, values)), - map(affectedOrigins => voxelsAdded({ affectedOrigins })), + map(voxelChanges => voxelsAdded({ voxelChanges })), catchError(() => of(addVoxelsFailed())), ), ); @@ -46,7 +47,7 @@ export class SceneViewerContainerEffects { this.actions$.pipe( ofType(removeVoxel), map(({ position }) => this.gridService.removeVoxel(position)), - map(affectedOrigin => voxelRemoved({ affectedOrigins: [affectedOrigin] })), + map(voxelRemoved), catchError(() => of(removeVoxelFailed())), ), ); @@ -54,16 +55,27 @@ export class SceneViewerContainerEffects { updateGridMesh$ = createEffect( () => this.actions$.pipe( - ofType(voxelAdded, voxelsAdded, voxelRemoved), - tap({ - next: ({ affectedOrigins }) => { - affectedOrigins.map(origin => { - const mesh = this.gridService.computeInternalNode1Mesh(origin); - this.sceneViewerService.updateNodeMesh(mesh, origin); - }); - }, - }), + ofType(voxelAdded, voxelRemoved), + map(({ affectedNodeOrigin }) => this.computeAndUpdateNodeMesh(affectedNodeOrigin)), ), { dispatch: false }, ); + + updateGridMeshMultiple$ = createEffect( + () => + this.actions$.pipe( + ofType(voxelsAdded), + map(({ voxelChanges }) => + voxelChanges.map(change => { + this.computeAndUpdateNodeMesh(change.affectedNodeOrigin); + }), + ), + ), + { dispatch: false }, + ); + + private computeAndUpdateNodeMesh(affectedNodeOrigin: Coord): void { + const mesh = this.gridService.computeInternalNode1Mesh(affectedNodeOrigin); + this.sceneViewerService.updateNodeMesh(mesh, affectedNodeOrigin); + } } diff --git a/apps/frontend/src/app/undo-redo/undo-redo.actions.ts b/apps/frontend/src/app/undo-redo/undo-redo.actions.ts index c1bf041d..a797592b 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.actions.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.actions.ts @@ -4,7 +4,12 @@ const actionTypePrefix = `[undoRedo]`; export const addUndo = createAction( `${actionTypePrefix} Add undo`, - props<{ redoAction: Action; undoAction: Action }>(), + props<{ + redoStartAction: Action; + redoEndActionType: string; + undoStartAction: Action; + undoEndActionType: string; + }>(), ); export const undo = createAction(`${actionTypePrefix} Undo`); diff --git a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts index 65d2a52c..82ce29c0 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts @@ -4,7 +4,12 @@ import { Action, select, Store } from '@ngrx/store'; import { filter, map, switchMap, withLatestFrom } from 'rxjs/operators'; import * as fromApp from '../app.reducer'; import * as menuBarContainerActions from '../menu-bar-container/menu-bar-container.actions'; -import { addVoxel, removeVoxel } from '../scene-viewer-container/scene-viewer-container.actions'; +import { + addVoxel, + removeVoxel, + voxelAdded, + voxelRemoved, +} from '../scene-viewer-container/scene-viewer-container.actions'; import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; @Injectable() @@ -14,9 +19,9 @@ export class UndoRedoEffects { undo$ = createEffect(() => this.actions$.pipe( ofType(undo, menuBarContainerActions.undo), - withLatestFrom(this.store.pipe(select(fromApp.selectCurrentUndoAction))), + withLatestFrom(this.store.pipe(select(fromApp.selectCurrentUndoStartAction))), switchMap(([action, currentUndoAction]) => - currentUndoAction ? [currentUndoAction, undone()] : [undone()], + currentUndoAction ? [currentUndoAction] : [undone()], ), ), ); @@ -24,36 +29,83 @@ export class UndoRedoEffects { redo$ = createEffect(() => this.actions$.pipe( ofType(redo, menuBarContainerActions.redo), - withLatestFrom(this.store.pipe(select(fromApp.selectCurrentRedoAction))), + withLatestFrom(this.store.pipe(select(fromApp.selectCurrentRedoStartAction))), switchMap(([action, currentRedoAction]) => - currentRedoAction ? [currentRedoAction, redone()] : [redone()], + currentRedoAction ? [currentRedoAction] : [redone()], ), ), ); + undoTriggeredActions$ = this.actions$.pipe( + withLatestFrom(this.store.pipe(select(fromApp.selectUndoRedoState))), + filter(([action, state]) => state.isUndoing), + map(([action, state]) => action), + ); + + undone$ = createEffect(() => + this.undoTriggeredActions$.pipe( + withLatestFrom(this.store.pipe(select(fromApp.selectCurrentUndoEndAction))), + filter(([action, undoEndAction]) => action.type === undoEndAction), + map(() => undone()), + ), + ); + + redoTriggeredActions$ = this.actions$.pipe( + withLatestFrom(this.store.pipe(select(fromApp.selectUndoRedoState))), + filter(([action, state]) => state.isRedoing), + map(([action, state]) => action), + ); + + redone$ = createEffect(() => + this.redoTriggeredActions$.pipe( + withLatestFrom(this.store.pipe(select(fromApp.selectCurrentRedoEndAction))), + filter(([action, redoEndAction]) => action.type === redoEndAction), + map(() => redone()), + ), + ); + userTriggeredActions$ = this.actions$.pipe( withLatestFrom(this.store.pipe(select(fromApp.selectUndoRedoState))), - filter(([action, state]) => !state.isUndoRedoing), + filter(([action, state]) => !state.isUndoing && !state.isRedoing), map(([action, state]) => action), ); addUndoActionForAddVoxel$ = createEffect(() => this.userTriggeredActions$.pipe( - ofType(addVoxel), - map(action => [action, removeVoxel({ position: action.position })]), - map(this.createAddUndo), + ofType(voxelAdded), + map(voxelChange => ({ + redoStartAction: addVoxel(voxelChange), + redoEndAction: voxelAdded.type, + undoStartAction: removeVoxel({ position: voxelChange.position }), + undoEndActionType: voxelRemoved.type, + })), + map(({ redoStartAction, redoEndAction, undoStartAction, undoEndActionType }) => + this.createAddUndo(redoStartAction, redoEndAction, undoStartAction, undoEndActionType), + ), ), ); addUndoActionForRemoveVoxel$ = createEffect(() => this.userTriggeredActions$.pipe( - ofType(removeVoxel), - map(action => [action, addVoxel({ position: action.position, value: 42 })]), - map(this.createAddUndo), + ofType(voxelRemoved), + map(voxelChange => ({ + redoStartAction: removeVoxel({ position: voxelChange.position }), + redoEndAction: voxelRemoved.type, + undoStartAction: addVoxel(voxelChange), + undoEndActionType: voxelAdded.type, + })), + map(({ redoStartAction, redoEndAction, undoStartAction, undoEndActionType }) => + this.createAddUndo(redoStartAction, redoEndAction, undoStartAction, undoEndActionType), + ), ), ); - createAddUndo([redoAction, undoAction]: Action[]): Action { - return addUndo({ redoAction, undoAction }); + createAddUndo( + redoStartAction: Action, + redoEndActionType: string, + undoStartAction: Action, + undoEndActionType: string, + ): Action { + return addUndo({ redoStartAction, redoEndActionType, undoStartAction, undoEndActionType }); } } diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts index ad36de14..565251e3 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.ts @@ -12,16 +12,22 @@ export const featureKey = 'undoRedo'; export interface State { currentIndex: number; - isUndoRedoing: boolean; - redoActions: Action[]; - undoActions: Action[]; + isRedoing: boolean; + isUndoing: boolean; + redoEndActionTypes: string[]; + redoStartActions: Action[]; + undoEndActionTypes: string[]; + undoStartActions: Action[]; } export const initialState: State = { currentIndex: -1, - isUndoRedoing: false, - redoActions: [], - undoActions: [], + isRedoing: false, + isUndoing: false, + redoEndActionTypes: [], + redoStartActions: [], + undoEndActionTypes: [], + undoStartActions: [], }; const maxBufferSize = 10; @@ -30,24 +36,38 @@ const maxBufferIndex = maxBufferSize - 1; export const reducer = createReducer( initialState, - on(addUndo, (state, { redoAction, undoAction }) => { - const newIndex = state.currentIndex + 1; + on( + addUndo, + (state, { redoStartAction, redoEndActionType, undoStartAction, undoEndActionType }) => { + const newIndex = state.currentIndex + 1; + + const redoStartActions = state.redoStartActions.slice(0, newIndex); + const redoEndActionTypes = state.redoEndActionTypes.slice(0, newIndex); + const undoStartActions = state.undoStartActions.slice(0, newIndex); + const undoEndActionTypes = state.undoEndActionTypes.slice(0, newIndex); - const redoActions = state.redoActions.slice(0, newIndex); - const undoActions = state.undoActions.slice(0, newIndex); + return { + ...state, + currentIndex: newIndex > maxBufferIndex ? maxBufferIndex : newIndex, + redoStartActions: [...redoStartActions.slice(-maxBufferIndex), redoStartAction], + redoEndActionTypes: [...redoEndActionTypes.slice(-maxBufferIndex), redoEndActionType], + undoStartActions: [...undoStartActions.slice(-maxBufferIndex), undoStartAction], + undoEndActionTypes: [...undoEndActionTypes.slice(-maxBufferIndex), undoEndActionType], + }; + }, + ), + on(undo, menuBarContainerActions.undo, state => { return { ...state, - currentIndex: newIndex > maxBufferIndex ? maxBufferIndex : newIndex, - redoActions: [...redoActions.slice(-maxBufferIndex), redoAction], - undoActions: [...undoActions.slice(-maxBufferIndex), undoAction], + isUndoing: true, }; }), - on(undo, menuBarContainerActions.undo, redo, menuBarContainerActions.redo, state => { + on(redo, menuBarContainerActions.redo, state => { return { ...state, - isUndoRedoing: true, + isRedoing: true, }; }), @@ -56,22 +76,28 @@ export const reducer = createReducer( return { ...state, - isUndoRedoing: false, + isUndoing: false, currentIndex: newIndex < 0 ? -1 : newIndex, }; }), on(redone, state => { const newIndex = state.currentIndex + 1; - const maxRedoIndex = state.redoActions.length - 1; + const maxRedoIndex = state.redoStartActions.length - 1; return { ...state, - isUndoRedoing: false, + isRedoing: false, currentIndex: newIndex > maxRedoIndex ? maxRedoIndex : newIndex, }; }), ); -export const selectCurrentUndoAction = (state: State) => state.undoActions[state.currentIndex]; -export const selectCurrentRedoAction = (state: State) => state.redoActions[state.currentIndex + 1]; +export const selectCurrentRedoStartAction = (state: State) => + state.redoStartActions[state.currentIndex + 1]; +export const selectCurrentRedoEndAction = (state: State) => + state.redoEndActionTypes[state.currentIndex + 1]; +export const selectCurrentUndoStartAction = (state: State) => + state.undoStartActions[state.currentIndex]; +export const selectCurrentUndoEndAction = (state: State) => + state.undoEndActionTypes[state.currentIndex]; diff --git a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts index a221ae6c..4ac01600 100644 --- a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts +++ b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts @@ -9,7 +9,7 @@ describe('nodeToMesh()', () => { accessor.setValue([0, 0, 0], 1); accessor.setValue([0, 0, 1], 1); - const meshData = nodeToMesh(grid.tree.root); + const meshData = nodeToMesh(grid.tree.root, () => [0, 0, 0, 1]); const voxels = 2; diff --git a/libs/vdb/src/lib/tools/node-to-mesh.ts b/libs/vdb/src/lib/tools/node-to-mesh.ts index 321478fb..d666417f 100644 --- a/libs/vdb/src/lib/tools/node-to-mesh.ts +++ b/libs/vdb/src/lib/tools/node-to-mesh.ts @@ -30,19 +30,19 @@ export interface MeshData { * instead of 24 positions and 32 indices for a cube. * See: https://doc.babylonjs.com/how_to/optimizing_your_scene#using-unindexed-meshes */ -export function nodeToMesh(node: HashableNode): MeshData | undefined { +export function nodeToMesh( + node: HashableNode, + valueToColor: (value: T) => [number, number, number, number], +): MeshData | undefined { const mesh: MeshData = { colors: [], positions: [], normals: [], }; - const r = Math.random(); - const g = Math.random(); - const b = Math.random(); - for (const voxel of node.beginVoxelOn()) { const [x, y, z] = voxel.globalCoord; + const [r, g, b, a] = valueToColor(voxel.value); const v0 = [x, y, z]; const v1 = [x + 1, y, z]; @@ -301,147 +301,147 @@ export function nodeToMesh(node: HashableNode): MeshData | undefined { r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, r, g, b, - 1, + a, ); } From 1b569df30c977a1dcc64b9a8ddb5bc147f20daf5 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 15 Jan 2020 11:33:58 +0100 Subject: [PATCH 45/84] build(dep): update dependencies --- package.json | 16 +++---- yarn.lock | 126 +++++++++++++++++++++++++-------------------------- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index c7ed7855..f2688ed0 100644 --- a/package.json +++ b/package.json @@ -44,12 +44,12 @@ "@angular/platform-browser": "8.2.14", "@angular/platform-browser-dynamic": "8.2.14", "@angular/router": "8.2.14", - "@babylonjs/core": "4.1.0-beta.18", - "@babylonjs/materials": "4.1.0-beta.18", + "@babylonjs/core": "4.1.0-beta.20", + "@babylonjs/materials": "4.1.0-beta.20", "@ngrx/effects": "8.6.0", "@ngrx/store": "8.6.0", "@nrwl/angular": "8.11.0", - "core-js": "3.6.2", + "core-js": "3.6.4", "hammerjs": "2.0.8", "mnemonist": "0.32.0", "rxjs": "6.5.4", @@ -60,15 +60,15 @@ "@angular/cli": "8.3.22", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", - "@babylonjs/inspector": "4.1.0-beta.18", + "@babylonjs/inspector": "4.1.0-beta.20", "@nrwl/cypress": "8.11.0", "@nrwl/jest": "8.11.0", "@nrwl/node": "8.11.0", "@nrwl/workspace": "8.11.0", "@types/benchmark": "1.0.31", - "@types/jest": "24.0.25", - "@types/node": "13.1.5", - "babylonjs": "4.1.0-beta.18", + "@types/jest": "24.9.0", + "@types/node": "13.1.7", + "babylonjs": "4.1.0-beta.20", "benchmark": "2.1.4", "codelyzer": "5.2.1", "cypress": "3.8.1", @@ -86,7 +86,7 @@ "stylelint-config-standard": "19.0.0", "stylelint-scss": "3.13.0", "ts-jest": "24.3.0", - "ts-node": "8.5.4", + "ts-node": "8.6.2", "tslint": "5.20.1", "typescript": "3.5.3" } diff --git a/yarn.lock b/yarn.lock index edf45950..fe381a2f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1534,58 +1534,58 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babylonjs/core@4.1.0-beta.18": - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.18.tgz#8d4cde4e8c791f1ff979d3a95834fcb78980970b" - integrity sha512-P4k/9aMmiMPU8YG+zJy0PZRog0cOqSplApHa8KtqdexILdQECM09jpFmv4ql2SCKXF643TD4+Iqv56TXzqfuDw== +"@babylonjs/core@4.1.0-beta.20": + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.20.tgz#fa554a10127e9409bec56b5c77256374b0524390" + integrity sha512-vKVaRNTGz/SgOljfhRhSJaAKajjkoXQQE5AgtdUz6zc4ps+9YPqV4sIFTS8jCSREnlnwpyLe7F8MjVYw4O51Aw== dependencies: tslib "^1.10.0" -"@babylonjs/gui@4.1.0-beta.18": - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.18.tgz#43142a5b32c49e1453aa61a7cbe359b3c8f4af56" - integrity sha512-onsQLXTp9jipvlBcy34U9U1Du6fM2IGcBzFt0aU27rpsKSNauLcveKP8oteHluNRqBWRHranoLDeipnEy0rGbQ== +"@babylonjs/gui@4.1.0-beta.20": + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.20.tgz#20933a191eb8ec6b1c49c809eea5af0f9da62856" + integrity sha512-dxLiAvfrgqaE+LMaulcpb40VYe2VIgWjf/SrHKPNnV7SY9dvaxBjqH7+1J7E8zO0e3n8i6nFuUWZ9ij2lKcGsQ== dependencies: - "@babylonjs/core" "4.1.0-beta.18" + "@babylonjs/core" "4.1.0-beta.20" tslib "^1.10.0" -"@babylonjs/inspector@4.1.0-beta.18": - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.18.tgz#a42b0ce0baae40f5b0d67752dbe98b988199561e" - integrity sha512-1/bNWlqjZZ5uTwByuXhtRRwnA2WKXb6F1YFRJHIJ0ZtdW94y+UNzY43pBVQVD1A/7fY2G9P9tbdP0OF4M/JdLA== - dependencies: - "@babylonjs/core" "4.1.0-beta.18" - "@babylonjs/gui" "4.1.0-beta.18" - "@babylonjs/loaders" "4.1.0-beta.18" - "@babylonjs/materials" "4.1.0-beta.18" - "@babylonjs/serializers" "4.1.0-beta.18" - babylonjs-gltf2interface "4.1.0-beta.18" +"@babylonjs/inspector@4.1.0-beta.20": + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.20.tgz#79224464a772bcf470c3ef352d117560a771356d" + integrity sha512-aonk4bArPhZ+HPj5J13BAyqD/QHBxcAr4oZZgim2DQXjuC40f6ClUYRQH/p0hPJYoy3uR0GiTOvWxx/MPhCOiQ== + dependencies: + "@babylonjs/core" "4.1.0-beta.20" + "@babylonjs/gui" "4.1.0-beta.20" + "@babylonjs/loaders" "4.1.0-beta.20" + "@babylonjs/materials" "4.1.0-beta.20" + "@babylonjs/serializers" "4.1.0-beta.20" + babylonjs-gltf2interface "4.1.0-beta.20" tslib "^1.10.0" -"@babylonjs/loaders@4.1.0-beta.18": - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.18.tgz#09cd54ad6440570e8b024b515b1f739c471c8f58" - integrity sha512-Dsh4pxVFoqIeg1A5hWN281QSPotWMroqSMS3Zrm7KejKvdcT9J4NqFneYyMSMZyBBIMCdoYAdsF2w1gfkWW9ww== +"@babylonjs/loaders@4.1.0-beta.20": + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.20.tgz#31c910fb5f72a3049688181c7c0ffbdd519e8f4e" + integrity sha512-zNqCjb9vR4oArVaOPMqnKMQFzRe3gw0aSY56oBfMisfcwilWRD9Dcc9dy4gn7m5VgPUTIMtMrBfRnrDerNK1yA== dependencies: - "@babylonjs/core" "4.1.0-beta.18" - babylonjs-gltf2interface "4.1.0-beta.18" + "@babylonjs/core" "4.1.0-beta.20" + babylonjs-gltf2interface "4.1.0-beta.20" tslib "^1.10.0" -"@babylonjs/materials@4.1.0-beta.18": - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.18.tgz#7a3e01eff726041a59e13f84fb89099bd629cec9" - integrity sha512-iC3qvwLfMkKDO8ALRiw1xqTjaXoaDPGuKvN6SIZQYTgnBTGLt+Zl6wZ6Org76QwUdqyOwgnyJasg+m56SgmY9g== +"@babylonjs/materials@4.1.0-beta.20": + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.20.tgz#67a3368a894ffa645999a068f995c0802497a7c1" + integrity sha512-uQSaFdQAKdZC/9CLEufvDyQ37SsPC2zuZt9awugB20tRCsYuj0q6FWmrGR+hleVsOoq/xm9e8y0vnf1Kx9F5bg== dependencies: - "@babylonjs/core" "4.1.0-beta.18" + "@babylonjs/core" "4.1.0-beta.20" tslib "^1.10.0" -"@babylonjs/serializers@4.1.0-beta.18": - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.18.tgz#1a36debb01d59b67fc7ff6cfec318eb215bc0548" - integrity sha512-U12cY43vIZf5ULvPt6A6pDp8meYdabHjSAsPExulRLy6cxhbZcWLJrXBif6ugKOz8y1Ow8GiPO0NtPVbfl8YBg== +"@babylonjs/serializers@4.1.0-beta.20": + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.20.tgz#9ce3f3661c9d4246c1215a97482df1d86c3a12ef" + integrity sha512-BWMXr0DxGC1hNOiDaQ2FKlueBP3bdFTs98uoo+sWarKhiaOwKkast8DF7QZnEyZVR6oPvUr06FEYmWZnVgidQg== dependencies: - "@babylonjs/core" "4.1.0-beta.18" - babylonjs-gltf2interface "4.1.0-beta.18" + "@babylonjs/core" "4.1.0-beta.20" + babylonjs-gltf2interface "4.1.0-beta.20" tslib "^1.10.0" "@cnakazawa/watch@^1.0.3": @@ -2026,10 +2026,10 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@24.0.25": - version "24.0.25" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.25.tgz#2aba377824ce040114aa906ad2cac2c85351360f" - integrity sha512-hnP1WpjN4KbGEK4dLayul6lgtys6FPz0UfxMeMQCv0M+sTnzN3ConfiO72jHgLxl119guHgI8gLqDOrRLsyp2g== +"@types/jest@24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.0.tgz#78c6991cd1734cf0d390be24875e310bb0a9fb74" + integrity sha512-dXvuABY9nM1xgsXlOtLQXJKdacxZJd7AtvLsKZ/0b57ruMXDKCOXAC/M75GbllQX6o1pcZ5hAG4JzYy7Z/wM2w== dependencies: jest-diff "^24.3.0" @@ -2048,10 +2048,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== -"@types/node@13.1.5": - version "13.1.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.5.tgz#4d5efc52a1d3e45d13e5ec9f911cbc5b089ccaec" - integrity sha512-wupvfmtbqRJzjCm1H2diy7wo31Gn1OzvqoxCfQuKM9eSecogzP0WTlrjdq7cf7jgSO2ZX6hxwgRPR8Wt7FA22g== +"@types/node@13.1.7": + version "13.1.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.7.tgz#db51d28b8dfacfe4fb2d0da88f5eb0a2eca00675" + integrity sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2846,15 +2846,15 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -babylonjs-gltf2interface@4.1.0-beta.18: - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.18.tgz#afc333500bc60066d364769f17b1bddb540754b0" - integrity sha512-DIsZ0/NhmQ9XI7mPcvqfwCdhZn6l6yiJWvHMmsTFLHaIaVUhDiUomjxAF4yPIYeX2PbtmxkJpv4TJY7QnXF9MA== +babylonjs-gltf2interface@4.1.0-beta.20: + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.20.tgz#90368bda475b3857b3043913d6358f8c4604d05b" + integrity sha512-Y3hGTh+5Yhywc7k8p8n49KKk3Od8u9pSgIp4OOjxliGSuRtc301chifpfVThgcs7UVoowfCXXxdB6mrUzRnFXw== -babylonjs@4.1.0-beta.18: - version "4.1.0-beta.18" - resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.18.tgz#e0c2bfe10d960adba1c5425c3c4b77c5b5fc48da" - integrity sha512-9hblkZ5Y0n16e4SBDMIglsMRpvMuLgE2IvqoTOhWHWLMJX6jtX75ZnLhBFjGIjlvO3L18H1vCUQRgIcS29wotg== +babylonjs@4.1.0-beta.20: + version "4.1.0-beta.20" + resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.20.tgz#46ce13e315f37e98d8930c561f49f81761b6c704" + integrity sha512-FU52D50wsS3Gr/VXWmLEKAqCOA4tuw+BIPJWnCaKmTN644k9IKyzOsZnMz+WulyC29Uce3duUKgv+PCpRMCKig== bail@^1.0.0: version "1.0.4" @@ -3824,10 +3824,10 @@ core-js@3.2.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== -core-js@3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.2.tgz#2799ea1a59050f0acf50dfe89b916d6503b16caa" - integrity sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg== +core-js@3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== core-js@^2.4.0: version "2.6.9" @@ -10668,16 +10668,16 @@ ts-loader@5.4.5: micromatch "^3.1.4" semver "^5.0.1" -ts-node@8.5.4: - version "8.5.4" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.5.4.tgz#a152add11fa19c221d0b48962c210cf467262ab2" - integrity sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw== +ts-node@8.6.2: + version "8.6.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.6.2.tgz#7419a01391a818fbafa6f826a33c1a13e9464e35" + integrity sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg== dependencies: arg "^4.1.0" diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.6" - yn "^3.0.0" + yn "3.1.1" tsconfig-paths-webpack-plugin@3.2.0: version "3.2.0" @@ -11618,7 +11618,7 @@ yauzl@2.4.1: dependencies: fd-slicer "~1.0.1" -yn@^3.0.0: +yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From ce544f56cb59c14c4d0348ef904b3c5d9f3bafe5 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 15 Jan 2020 11:36:24 +0100 Subject: [PATCH 46/84] build(dep): update cypress to `v3.8.2` --- .circleci/config.yml | 2 +- package.json | 2 +- yarn.lock | 14 ++++++++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 24488b48..d271bbd8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,7 +17,7 @@ aliases: - &use_docker_cypress_included docker: # 3.8.0 fails with `Error: write EPIPE` when running `benchmark`!? - - image: cypress/included:3.8.1 + - image: cypress/included:3.8.2 - &workspace ~/talus diff --git a/package.json b/package.json index f2688ed0..23eca823 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "babylonjs": "4.1.0-beta.20", "benchmark": "2.1.4", "codelyzer": "5.2.1", - "cypress": "3.8.1", + "cypress": "3.8.2", "dotenv": "8.2.0", "gh-pages": "2.2.0", "jasmine-marbles": "0.6.0", diff --git a/yarn.lock b/yarn.lock index fe381a2f..af84ef50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3993,10 +3993,10 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= -cypress@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.1.tgz#7821084e0ead81d35ffa29f2141c977dfdfc2343" - integrity sha512-eLk5OpL/ZMDfQx9t7ZaDUAGVcvSOPTi7CG1tiUnu9BGk7caBiDhuFi3Tz/D5vWqH/Dl6Uh4X+Au4W+zh0xzbXw== +cypress@3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.2.tgz#58fa96e1e7dae712403b0f4e8af1efe35442ff7a" + integrity sha512-aTs0u3+dfEuLe0Ct0FVO5jD1ULqxbuqWUZwzBm0rxdLgLxIAOI/A9f/WkgY5Cfy1TEXe8pKC6Wal0ZpnkdGRSw== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/xvfb" "1.2.4" @@ -4009,6 +4009,7 @@ cypress@3.8.1: commander "2.15.1" common-tags "1.8.0" debug "3.2.6" + eventemitter2 "4.1.2" execa "0.10.0" executable "4.1.1" extract-zip "1.6.7" @@ -4577,6 +4578,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +eventemitter2@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15" + integrity sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU= + eventemitter3@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" From 917f489a14feff580f4a6505cb8d4378b438c456 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Wed, 15 Jan 2020 11:38:28 +0100 Subject: [PATCH 47/84] build(dep): update stylelint to `v13.0.0` --- package.json | 2 +- yarn.lock | 404 ++++++++++++++++++++++++++++----------------------- 2 files changed, 223 insertions(+), 183 deletions(-) diff --git a/package.json b/package.json index 23eca823..4b63e8b6 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "jest-preset-angular": "7.1.1", "junit-xml": "1.2.0", "prettier": "1.19.1", - "stylelint": "12.0.1", + "stylelint": "13.0.0", "stylelint-config-recommended": "3.0.0", "stylelint-config-recommended-scss": "4.1.0", "stylelint-config-standard": "19.0.0", diff --git a/yarn.lock b/yarn.lock index af84ef50..adfc6408 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1774,14 +1774,6 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - "@ngrx/effects@8.6.0": version "8.6.0" resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-8.6.0.tgz#a0d7339597a5128c5cf896ddcf93f73406a45860" @@ -1803,10 +1795,26 @@ tree-kill "1.2.1" webpack-sources "1.4.3" -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" "@nrwl/angular@8.11.0": version "8.11.0" @@ -2043,6 +2051,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minimist@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" + integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + "@types/node@*": version "12.7.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" @@ -2053,6 +2066,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.7.tgz#db51d28b8dfacfe4fb2d0da88f5eb0a2eca00675" integrity sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -2549,11 +2567,6 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -2564,13 +2577,18 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -2682,17 +2700,17 @@ autoprefixer@9.6.1: postcss "^7.0.17" postcss-value-parser "^4.0.0" -autoprefixer@^9.7.1: - version "9.7.2" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.2.tgz#26cf729fbb709323b40171a874304884dcceffed" - integrity sha512-LCAfcdej1182uVvPOZnytbq61AhnOZ/4JelDaJGDeNwewyU1AMaNthcHsyz1NRjTmd2FkurMckLWfkHg3Z//KA== +autoprefixer@^9.7.3: + version "9.7.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" + integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== dependencies: - browserslist "^4.7.3" - caniuse-lite "^1.0.30001010" + 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.23" + postcss "^7.0.26" postcss-value-parser "^4.0.2" aws-sign2@~0.7.0: @@ -3069,7 +3087,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@4.8.3: +browserslist@4.8.3, browserslist@^4.8.3: version "4.8.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== @@ -3087,15 +3105,6 @@ browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.6: electron-to-chromium "^1.3.191" node-releases "^1.1.25" -browserslist@^4.7.3: - version "4.7.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3" - integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ== - dependencies: - caniuse-lite "^1.0.30001010" - electron-to-chromium "^1.3.306" - node-releases "^1.1.40" - browserslist@^4.8.2: version "4.8.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" @@ -3237,11 +3246,6 @@ cachedir@1.3.0: dependencies: os-homedir "^1.0.1" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -3266,14 +3270,14 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= +camelcase-keys@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.1.1.tgz#0d24dde78cea4c7d2da7f4ea40b7995083328c8d" + integrity sha512-kEPCddRFChEzO0d6w61yh0WbBiSv9gBnfZWGfXRYPlGqIdIGef6HMR6pgqVSEWCYkrp8B0AtEpEXNY+Jx0xk1A== dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" camelcase@^4.1.0: version "4.1.0" @@ -3295,11 +3299,6 @@ caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000984: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== -caniuse-lite@^1.0.30001010: - version "1.0.30001012" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001012.tgz#653ec635e815b9e0fb801890923b0c2079eb34ec" - integrity sha512-7RR4Uh04t9K1uYRWzOJmzplgEOAXbfK72oVNokCdMzA67trrhPzy93ahKk1AWHiA0c58tD2P+NHqxrA8FZ+Trg== - caniuse-lite@^1.0.30001015: version "1.0.30001016" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66" @@ -3310,6 +3309,11 @@ caniuse-lite@^1.0.30001017: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz#3f04c1737500ffda78be9beb0b5c1e2070e15926" integrity sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA== +caniuse-lite@^1.0.30001020: + version "1.0.30001021" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz#e75ed1ef6dbadd580ac7e7720bb16f07b083f254" + integrity sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g== + canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -3981,13 +3985,6 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: dependencies: cssom "0.3.x" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -4096,7 +4093,7 @@ debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize-keys@^1.0.0: +decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -4266,13 +4263,20 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@^2.0.0, dir-glob@^2.2.2: +dir-glob@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== dependencies: path-type "^3.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -4378,11 +4382,6 @@ electron-to-chromium@^1.3.191: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.230.tgz#2d0618cb6f724391d5fd0926dde84d6c67cbcda9" integrity sha512-r0RljY5DZi9RX4v8mjHxJkDWnQe+nsrkGlHtrDF2uvZcvAkw+iglvlQi1794gZhwRtJoDOomMJlDHL2LfXSCZA== -electron-to-chromium@^1.3.306: - version "1.3.314" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.314.tgz#c186a499ed2c9057bce9eb8dca294d6d5450facc" - integrity sha512-IKDR/xCxKFhPts7h+VaSXS02Z1mznP3fli1BbXWXeN89i2gCzKraU8qLpEid8YzKcmZdZD3Mly3cn5/lY9xsBQ== - electron-to-chromium@^1.3.322: version "1.3.322" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" @@ -4810,17 +4809,16 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== +fast-glob@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" + integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" + "@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" fast-json-stable-stringify@2.0.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -4837,6 +4835,13 @@ fastparse@^1.1.1: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -4977,7 +4982,7 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -4991,7 +4996,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -5250,18 +5255,13 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" -glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - glob@7.0.x: version "7.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" @@ -5319,6 +5319,18 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globby@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" + integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -5342,20 +5354,6 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -5417,6 +5415,11 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" +hard-rejection@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -5704,11 +5707,6 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" @@ -5779,6 +5777,11 @@ indent-string@^3.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -7180,14 +7183,6 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -7276,10 +7271,10 @@ map-obj@^1.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== map-visit@^1.0.0: version "1.0.0" @@ -7353,20 +7348,22 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" +meow@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.0.0.tgz#949196fdf21d979379e3bdccb0411e60f8cffd93" + integrity sha512-x4rYsjigPBDAxY+BGuK83YLhUIqui5wYyZoqb6QJCUOs+0fiYq+i/NV4Jt8OgIfObZFxG9iTyvLDu4UTohGTFw== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.1.1" + decamelize-keys "^1.1.0" + hard-rejection "^2.0.0" + minimist-options "^4.0.1" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.0" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.8.1" + yargs-parser "^16.1.0" merge-descriptors@1.0.1: version "1.0.1" @@ -7378,10 +7375,10 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.4.tgz#c9269589e6885a60cf80605d9522d4b67ca646e3" - integrity sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A== +merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== methods@~1.1.2: version "1.1.2" @@ -7460,6 +7457,11 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" + integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= + mini-css-extract-plugin@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1" @@ -7487,10 +7489,10 @@ minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== +minimist-options@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.0.2.tgz#29c4021373ded40d546186725e57761e4b1984a7" + integrity sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" @@ -7756,13 +7758,6 @@ node-releases@^1.1.25: dependencies: semver "^5.3.0" -node-releases@^1.1.40: - version "1.1.41" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.41.tgz#57674a82a37f812d18e3b26118aefaf53a00afed" - integrity sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg== - dependencies: - semver "^6.3.0" - node-releases@^1.1.42: version "1.1.43" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.43.tgz#2c6ca237f88ce11d49631f11190bb01f8d0549f2" @@ -7785,7 +7780,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8640,7 +8635,7 @@ postcss@7.0.17, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17 source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.21, postcss@^7.0.23: +postcss@^7.0.21: version "7.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1" integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== @@ -8649,6 +8644,15 @@ postcss@^7.0.21, postcss@^7.0.23: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.26: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -8832,10 +8836,10 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== ramda@0.24.1: version "0.24.1" @@ -8923,14 +8927,6 @@ read-package-tree@5.3.1: readdir-scoped-modules "^1.0.0" util-promisify "^2.1.0" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -8939,6 +8935,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg-up@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -8948,6 +8953,16 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -9010,13 +9025,13 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" + indent-string "^4.0.0" + strip-indent "^3.0.0" reflect-metadata@^0.1.2: version "0.1.13" @@ -9343,6 +9358,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -9384,6 +9404,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -10174,10 +10199,12 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" @@ -10241,12 +10268,12 @@ stylelint-scss@3.13.0: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.2" -stylelint@12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-12.0.1.tgz#5b1f3bf7333320acce322b49852c8b85e94ce7e4" - integrity sha512-1mn39pqZiC/e8KUPoRMc1WMM83Upb2ILaSGxkCvKxALHutEOs2txcPQocJiXdO4Zx4FY4prGqjlkwrbthAxqig== +stylelint@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.0.0.tgz#532007f7154c1a5ed14245d857a5884316f5111f" + integrity sha512-6sjgOJbM3iLhnUtmRO0J1vvxie9VnhIZX/2fCehjylv9Gl9u0ytehGCTm9Lhw2p1F8yaNZn5UprvhCB8C3g/Tg== dependencies: - autoprefixer "^9.7.1" + autoprefixer "^9.7.3" balanced-match "^1.0.0" chalk "^3.0.0" cosmiconfig "^6.0.0" @@ -10255,7 +10282,7 @@ stylelint@12.0.1: file-entry-cache "^5.0.1" get-stdin "^7.0.0" global-modules "^2.0.0" - globby "^9.2.0" + globby "^11.0.0" globjoin "^0.1.4" html-tags "^3.1.0" ignore "^5.1.4" @@ -10266,10 +10293,10 @@ stylelint@12.0.1: lodash "^4.17.15" log-symbols "^3.0.0" mathml-tag-names "^2.1.1" - meow "^5.0.0" + meow "^6.0.0" micromatch "^4.0.2" normalize-selector "^0.2.0" - postcss "^7.0.21" + postcss "^7.0.26" postcss-html "^0.36.0" postcss-jsx "^0.36.3" postcss-less "^3.1.4" @@ -10589,10 +10616,10 @@ tree-kill@1.2.1: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== trim-repeated@^1.0.0: version "1.0.0" @@ -10765,7 +10792,12 @@ type-fest@^0.5.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== -type-fest@^0.8.0: +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -11510,7 +11542,7 @@ yargs-parser@10.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@10.x, yargs-parser@^10.0.0: +yargs-parser@10.x: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== @@ -11533,6 +11565,14 @@ yargs-parser@^13.0.0, yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" + integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" From 88cc433b58305f8a2b1ccf84ae8769abe9ead561 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Thu, 16 Jan 2020 09:05:46 +0100 Subject: [PATCH 48/84] refactor(ui): prefix UI components with `Ui` like Angular does with `Mat` (#14) * refactor(ui): prefix `MenuBar` with `Ui` like Angular does with `Mat` * refactor(ui): prefix `SceneViewer` with `Ui` as Angular does with `Mat` * test(ui): check `menu-bar` menus & items * refactor(ui): remove ctor & onInit * test(ui): check if sidnav has left & right navigation * refactor(ui): prefix `SidenavShell` with `Ui` as Angular does with `Mat` * refactor(ui): prefix `SceneViewerService` with `Ui` (ng with `Mat`) * refactor(ui): prefix `SceneViewerTestModule` with `Ui` (ng with `Mat`) * refactor(ui): prefix `ToolbarModule` with `Ui` (ng with `Mat`) --- apps/frontend/src/app/app.component.spec.ts | 6 +- apps/frontend/src/app/app.module.ts | 4 +- .../menu-bar-container.module.ts | 4 +- .../scene-viewer-container.component.ts | 6 +- .../scene-viewer-container.effects.ts | 4 +- .../scene-viewer-container.module.ts | 4 +- .../src/app/tools-panel/tools-panel.module.ts | 4 +- libs/ui/jest.config.js | 4 +- .../lib/menu-bar/menu-bar.component.spec.ts | 81 +++++++++++++++++-- .../ui/src/lib/menu-bar/menu-bar.component.ts | 2 +- libs/ui/src/lib/menu-bar/menu-bar.module.ts | 8 +- libs/ui/src/lib/scene-viewer/index.ts | 2 +- .../scene-viewer.component.spec.ts | 16 ++-- .../scene-viewer/scene-viewer.component.ts | 6 +- .../scene-viewer.module.testing.ts | 12 +-- .../lib/scene-viewer/scene-viewer.module.ts | 12 +-- .../lib/scene-viewer/scene-viewer.service.ts | 2 +- .../sidenav-shell.component.spec.ts | 24 ++++-- .../sidenav-shell/sidenav-shell.component.ts | 14 ++-- .../lib/sidenav-shell/sidenav-shell.module.ts | 26 +++--- .../src/lib/toolbar/toolbar.component.spec.ts | 12 +-- libs/ui/src/lib/toolbar/toolbar.component.ts | 2 +- libs/ui/src/lib/toolbar/toolbar.module.ts | 8 +- libs/ui/tsconfig.spec.json | 2 +- package.json | 1 - yarn.lock | 26 ++++-- 26 files changed, 188 insertions(+), 104 deletions(-) diff --git a/apps/frontend/src/app/app.component.spec.ts b/apps/frontend/src/app/app.component.spec.ts index 20f333bc..49deb6a1 100644 --- a/apps/frontend/src/app/app.component.spec.ts +++ b/apps/frontend/src/app/app.component.spec.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { async, TestBed } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; -import { SceneViewerTestModule, SidenavShellModule } from '@talus/ui'; +import { UiSceneViewerTestModule, UiSidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; @Component({ @@ -38,8 +38,8 @@ describe('AppComponent', () => { imports: [ BrowserAnimationsModule, RouterTestingModule, - SidenavShellModule, - SceneViewerTestModule, + UiSceneViewerTestModule, + UiSidenavShellModule, ], }).compileComponents(); })); diff --git a/apps/frontend/src/app/app.module.ts b/apps/frontend/src/app/app.module.ts index 67ca1a26..72df9030 100644 --- a/apps/frontend/src/app/app.module.ts +++ b/apps/frontend/src/app/app.module.ts @@ -4,7 +4,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterModule } from '@angular/router'; import { EffectsModule } from '@ngrx/effects'; import { StoreModule } from '@ngrx/store'; -import { SidenavShellModule } from '@talus/ui'; +import { UiSidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; import { AppEffects } from './app.effects'; import { metaReducers, ROOT_REDUCERS } from './app.reducer'; @@ -39,7 +39,7 @@ import { UndoRedoModule } from './undo-redo/undo-redo.module'; MenuBarContainerModule, SceneViewerContainerModule, - SidenavShellModule, + UiSidenavShellModule, ToolsPanelModule, UndoRedoModule, ], diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts index b8d0c534..2347c696 100644 --- a/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts @@ -1,10 +1,10 @@ import { NgModule } from '@angular/core'; -import { MenuBarModule } from '@talus/ui'; +import { UiMenuBarModule } from '@talus/ui'; import { MenuBarContainerComponent } from './menu-bar-container.component'; @NgModule({ declarations: [MenuBarContainerComponent], - imports: [MenuBarModule], + imports: [UiMenuBarModule], exports: [MenuBarContainerComponent], }) export class MenuBarContainerModule {} diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index b97f0f45..9026d0b7 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -2,7 +2,7 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, ViewChild } from '@a // import '@babylonjs/core/Rendering/edgesRenderer'; // import '@babylonjs/core/Rendering/outlineRenderer'; import { select, Store } from '@ngrx/store'; -import { PointerButton, PointerPickInfo, SceneViewerComponent } from '@talus/ui'; +import { PointerButton, PointerPickInfo, UiSceneViewerComponent } from '@talus/ui'; import { Coord } from '@talus/vdb'; import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; @@ -20,8 +20,8 @@ import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class SceneViewerContainerComponent implements AfterViewInit { - @ViewChild(SceneViewerComponent, { static: false }) - private sceneViewerComponent: SceneViewerComponent; + @ViewChild(UiSceneViewerComponent, { static: false }) + private sceneViewerComponent: UiSceneViewerComponent; selectedToolId$: Observable = this.store.pipe(select(fromApp.selectSelectedToolId)); voxelCount$: Observable = this.store.pipe(select(fromApp.selectVoxelCount)); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts index d68c5e6e..03c7fe79 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; -import { SceneViewerService } from '@talus/ui'; +import { UiSceneViewerService } from '@talus/ui'; import { Coord } from '@talus/vdb'; import { of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; @@ -22,7 +22,7 @@ export class SceneViewerContainerEffects { constructor( private actions$: Actions, private gridService: GridService, - private sceneViewerService: SceneViewerService, + private sceneViewerService: UiSceneViewerService, ) {} addVoxel$ = createEffect(() => diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts index ac65b3af..2c2622fe 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.module.ts @@ -1,7 +1,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { EffectsModule } from '@ngrx/effects'; -import { SceneViewerModule } from '@talus/ui'; +import { UiSceneViewerModule } from '@talus/ui'; import { GridService } from './grid.service'; import { SceneViewerContainerComponent } from './scene-viewer-container.component'; import { SceneViewerContainerEffects } from './scene-viewer-container.effects'; @@ -11,7 +11,7 @@ import { SceneViewerContainerEffects } from './scene-viewer-container.effects'; imports: [ CommonModule, EffectsModule.forFeature([SceneViewerContainerEffects]), - SceneViewerModule, + UiSceneViewerModule, ], exports: [SceneViewerContainerComponent], providers: [GridService], diff --git a/apps/frontend/src/app/tools-panel/tools-panel.module.ts b/apps/frontend/src/app/tools-panel/tools-panel.module.ts index 55db8f76..fc96800f 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.module.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.module.ts @@ -1,11 +1,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { ToolbarModule } from '@talus/ui'; +import { UiToolbarModule } from '@talus/ui'; import { ToolsPanelComponent } from './tools-panel.component'; @NgModule({ declarations: [ToolsPanelComponent], - imports: [CommonModule, ToolbarModule], + imports: [CommonModule, UiToolbarModule], exports: [ToolsPanelComponent], }) export class ToolsPanelModule {} diff --git a/libs/ui/jest.config.js b/libs/ui/jest.config.js index 35d35ffa..b2ed4000 100644 --- a/libs/ui/jest.config.js +++ b/libs/ui/jest.config.js @@ -21,11 +21,11 @@ module.exports = { ], // https://github.com/nrwl/nx/issues/1439#issuecomment-561268656 // When using `Run test` directly in WebStorm, change the used config to - // this file i.e. `./ui/jest.config.js` and not `/jest.config.js`. + // this file i.e. `./ui/jest.config.js` and not `/jest.config.js`. // Otherwise, following error might occur: // - Cannot find module '@talus/ui' // - Zone is needed for the async() test helper but could not be found. - setupFilesAfterEnv: ['./src/test-setup.ts'], + setupFilesAfterEnv: ['/src/test-setup.ts'], // https://github.com/thymikee/jest-preset-angular/issues/293#issuecomment-513544717 // When using `Run test` directly in WebStorm, the scss couldn't be loaded. diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts index 1d7c4150..86f2eba4 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts @@ -1,24 +1,89 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MenuBarComponent } from './menu-bar.component'; -import { MenuBarModule } from './menu-bar.module'; +import { By } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { UiMenuBarModule } from '@talus/ui'; +import { UiMenuBarComponent } from './menu-bar.component'; -describe('MenuBarComponent', () => { - let component: MenuBarComponent; - let fixture: ComponentFixture; +describe('UiMenuBarComponent', () => { + let component: UiMenuBarComponent; + let fixture: ComponentFixture; + + const expectedMenus = [ + { + label: 'Menu 1', + menuItems: [ + { + label: 'Item 1.1', + icon: 'undo', + value: 'Value 1.1', + }, + ], + }, + { + label: 'Menu 2', + menuItems: [ + { + label: 'Item 2.1', + icon: 'undo', + value: 'Value 2.1', + }, + { + label: 'Item 2.2', + icon: 'undo', + value: 'Value 2.2', + }, + ], + }, + ]; beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [MenuBarModule], + imports: [UiMenuBarModule, BrowserAnimationsModule], }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(MenuBarComponent); + fixture = TestBed.createComponent(UiMenuBarComponent); component = fixture.componentInstance; - fixture.detectChanges(); + // Don't call `detectChanges()`, because of `OnPush` + // See: https://github.com/angular/angular/issues/12313#issuecomment-301848232 + // fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should add all menus', () => { + component.menuConfig = { + menus: expectedMenus, + }; + fixture.detectChanges(); + + const menus = fixture.debugElement.queryAll(By.css('mat-menu')); + const menuButtons = fixture.debugElement.queryAll(By.css('button')); + + expect(menus.length).toEqual(expectedMenus.length); + expect(menuButtons.length).toEqual(expectedMenus.length); + expect(menuButtons[0].nativeElement.textContent).toContain(expectedMenus[0].label); + expect(menuButtons[1].nativeElement.textContent).toContain(expectedMenus[1].label); + }); + + it('should add all menu-items for second menu', () => { + component.menuConfig = { + menus: expectedMenus, + }; + fixture.detectChanges(); + + const menuButtons = fixture.debugElement.queryAll(By.css('button')); + menuButtons[1].nativeElement.click(); + fixture.detectChanges(); + + const menuItemButtons = fixture.debugElement.queryAll(By.css('button.mat-menu-item > span')); + expect(menuItemButtons.length).toEqual(expectedMenus[1].menuItems.length); + + menuItemButtons.forEach((menuItemButton, j) => { + expect(menuItemButton.nativeElement.textContent).toEqual(expectedMenus[1].menuItems[j].label); + }); + }); }); diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.ts index 35a0b300..010b1e28 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.ts @@ -37,7 +37,7 @@ interface UiMenuBarMenuItem { styleUrls: ['./menu-bar.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class MenuBarComponent { +export class UiMenuBarComponent { @Input() menuConfig: UiMenuBarConfig = { menus: [] }; @Output() menuItemClick = new EventEmitter(); diff --git a/libs/ui/src/lib/menu-bar/menu-bar.module.ts b/libs/ui/src/lib/menu-bar/menu-bar.module.ts index 63616842..cff9cb92 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.module.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.module.ts @@ -1,11 +1,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule } from '@angular/material'; -import { MenuBarComponent } from './menu-bar.component'; +import { UiMenuBarComponent } from './menu-bar.component'; @NgModule({ - declarations: [MenuBarComponent], + declarations: [UiMenuBarComponent], imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule], - exports: [MenuBarComponent], + exports: [UiMenuBarComponent], }) -export class MenuBarModule {} +export class UiMenuBarModule {} diff --git a/libs/ui/src/lib/scene-viewer/index.ts b/libs/ui/src/lib/scene-viewer/index.ts index 14b12407..9e369a7f 100644 --- a/libs/ui/src/lib/scene-viewer/index.ts +++ b/libs/ui/src/lib/scene-viewer/index.ts @@ -2,4 +2,4 @@ export * from './scene-viewer.component'; export * from './scene-viewer.module'; export * from './scene-viewer.module.testing'; export { PointerButton } from './pointer-button'; -export { PointerPickInfo, SceneViewerService } from './scene-viewer.service'; +export { PointerPickInfo, UiSceneViewerService } from './scene-viewer.service'; diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.spec.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.component.spec.ts index b9ae1951..abc1db3f 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.spec.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.spec.ts @@ -1,20 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { SceneViewerComponent } from './scene-viewer.component'; -import { SceneViewerTestModule } from './scene-viewer.module.testing'; +import { UiSceneViewerComponent } from './scene-viewer.component'; +import { UiSceneViewerTestModule } from './scene-viewer.module.testing'; -describe('SceneViewerComponent', () => { - let component: SceneViewerComponent; - let fixture: ComponentFixture; +describe('UiSceneViewerComponent', () => { + let component: UiSceneViewerComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [SceneViewerComponent], - imports: [SceneViewerTestModule], + declarations: [UiSceneViewerComponent], + imports: [UiSceneViewerTestModule], }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(SceneViewerComponent); + fixture = TestBed.createComponent(UiSceneViewerComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts index 7363c467..58e40fcd 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.ts @@ -8,7 +8,7 @@ import { Output, ViewChild, } from '@angular/core'; -import { SceneViewerService } from './scene-viewer.service'; +import { UiSceneViewerService } from './scene-viewer.service'; @Component({ selector: 'ui-scene-viewer', @@ -18,8 +18,8 @@ import { SceneViewerService } from './scene-viewer.service'; styleUrls: ['./scene-viewer.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SceneViewerComponent implements OnInit { - constructor(private sceneViewerService: SceneViewerService) {} +export class UiSceneViewerComponent implements OnInit { + constructor(private sceneViewerService: UiSceneViewerService) {} @ViewChild('canvas', { static: true }) canvas: ElementRef; diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.module.testing.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.module.testing.ts index e5b28056..10527d82 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.module.testing.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.module.testing.ts @@ -4,7 +4,7 @@ import { ArcRotateCamera } from '@babylonjs/core/Cameras/arcRotateCamera'; import { NullEngine } from '@babylonjs/core/Engines/nullEngine'; import { Vector3 } from '@babylonjs/core/Maths/math.vector'; import { Scene } from '@babylonjs/core/scene'; -import { CameraFactory, EngineFactory, SceneViewerService } from './scene-viewer.service'; +import { CameraFactory, EngineFactory, UiSceneViewerService } from './scene-viewer.service'; function testCameraFactory(): any { return { @@ -47,16 +47,16 @@ function testEngineFactor(): any { template: ``, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SceneViewerStubComponent {} +export class UiSceneViewerStubComponent {} @NgModule({ - declarations: [SceneViewerStubComponent], - exports: [SceneViewerStubComponent], + declarations: [UiSceneViewerStubComponent], + exports: [UiSceneViewerStubComponent], imports: [CommonModule], providers: [ { provide: CameraFactory, useValue: testCameraFactory() }, { provide: EngineFactory, useValue: testEngineFactor() }, - SceneViewerService, + UiSceneViewerService, ], }) -export class SceneViewerTestModule {} +export class UiSceneViewerTestModule {} diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts index c569b163..cf093c83 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.module.ts @@ -1,12 +1,12 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { SceneViewerComponent } from './scene-viewer.component'; -import { CameraFactory, EngineFactory, SceneViewerService } from './scene-viewer.service'; +import { UiSceneViewerComponent } from './scene-viewer.component'; +import { CameraFactory, EngineFactory, UiSceneViewerService } from './scene-viewer.service'; @NgModule({ - declarations: [SceneViewerComponent], + declarations: [UiSceneViewerComponent], imports: [CommonModule], - exports: [SceneViewerComponent], - providers: [CameraFactory, EngineFactory, SceneViewerService], + exports: [UiSceneViewerComponent], + providers: [CameraFactory, EngineFactory, UiSceneViewerService], }) -export class SceneViewerModule {} +export class UiSceneViewerModule {} diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index cf4d42fd..31960496 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -53,7 +53,7 @@ export class CameraFactory { * provided on module level. Therefore, only one `SceneViewerComponent` at the time is supported. */ @Injectable() -export class SceneViewerService { +export class UiSceneViewerService { pointerPick$ = new Subject(); private engine: Engine; diff --git a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts index 3d684bf3..19f3fa27 100644 --- a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts +++ b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts @@ -1,21 +1,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatSidenav } from '@angular/material'; +import { By } from '@angular/platform-browser'; -import { SidenavShellComponent } from './sidenav-shell.component'; -import { SidenavShellModule } from './sidenav-shell.module'; +import { UiSidenavShellComponent } from './sidenav-shell.component'; +import { UiSidenavShellModule } from './sidenav-shell.module'; describe('SidenavShellComponent', () => { - let component: SidenavShellComponent; - let fixture: ComponentFixture; + let component: UiSidenavShellComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [SidenavShellModule], + imports: [UiSidenavShellModule], declarations: [], }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(SidenavShellComponent); + fixture = TestBed.createComponent(UiSidenavShellComponent); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -23,4 +25,14 @@ describe('SidenavShellComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should have left & right sidenav', () => { + const sidenavs = fixture.debugElement.queryAll(By.directive(MatSidenav)); + const leftSidenavIcon = fixture.debugElement.query(By.css('#left-sidenav-button mat-icon')); + const rightSidenavIcon = fixture.debugElement.query(By.css('#right-sidenav-button mat-icon')); + + expect(sidenavs.length).toEqual(2); + expect(leftSidenavIcon.nativeElement.textContent).toEqual('keyboard_arrow_left'); + expect(rightSidenavIcon.nativeElement.textContent).toEqual('keyboard_arrow_right'); + }); }); diff --git a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts index bc22de2f..d4087cfa 100644 --- a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts +++ b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ selector: 'ui-sidenav-shell-content', @@ -7,7 +7,7 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; `, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SidenavShellContentComponent {} +export class UiSidenavShellContentComponent {} @Component({ selector: 'ui-sidenav-shell-left', @@ -16,7 +16,7 @@ export class SidenavShellContentComponent {} `, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SidenavShellLeftComponent {} +export class UiSidenavShellLeftComponent {} @Component({ selector: 'ui-sidenav-shell-right', @@ -25,7 +25,7 @@ export class SidenavShellLeftComponent {} `, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SidenavShellRightComponent {} +export class UiSidenavShellRightComponent {} @Component({ selector: 'ui-sidenav-shell', @@ -57,8 +57,4 @@ export class SidenavShellRightComponent {} styleUrls: ['./sidenav-shell.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SidenavShellComponent implements OnInit { - constructor() {} - - public ngOnInit(): void {} -} +export class UiSidenavShellComponent {} diff --git a/libs/ui/src/lib/sidenav-shell/sidenav-shell.module.ts b/libs/ui/src/lib/sidenav-shell/sidenav-shell.module.ts index 0486da5c..50a11df6 100644 --- a/libs/ui/src/lib/sidenav-shell/sidenav-shell.module.ts +++ b/libs/ui/src/lib/sidenav-shell/sidenav-shell.module.ts @@ -3,18 +3,18 @@ import { NgModule } from '@angular/core'; import { MatButtonModule, MatIconModule, MatSidenavModule } from '@angular/material'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { - SidenavShellComponent, - SidenavShellContentComponent, - SidenavShellLeftComponent, - SidenavShellRightComponent, + UiSidenavShellComponent, + UiSidenavShellContentComponent, + UiSidenavShellLeftComponent, + UiSidenavShellRightComponent, } from './sidenav-shell.component'; @NgModule({ declarations: [ - SidenavShellComponent, - SidenavShellContentComponent, - SidenavShellLeftComponent, - SidenavShellRightComponent, + UiSidenavShellComponent, + UiSidenavShellContentComponent, + UiSidenavShellLeftComponent, + UiSidenavShellRightComponent, ], imports: [ BrowserAnimationsModule, @@ -24,10 +24,10 @@ import { MatSidenavModule, ], exports: [ - SidenavShellComponent, - SidenavShellContentComponent, - SidenavShellLeftComponent, - SidenavShellRightComponent, + UiSidenavShellComponent, + UiSidenavShellContentComponent, + UiSidenavShellLeftComponent, + UiSidenavShellRightComponent, ], }) -export class SidenavShellModule {} +export class UiSidenavShellModule {} diff --git a/libs/ui/src/lib/toolbar/toolbar.component.spec.ts b/libs/ui/src/lib/toolbar/toolbar.component.spec.ts index 3d0b3276..c422d2a4 100644 --- a/libs/ui/src/lib/toolbar/toolbar.component.spec.ts +++ b/libs/ui/src/lib/toolbar/toolbar.component.spec.ts @@ -1,19 +1,19 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ToolbarComponent } from './toolbar.component'; -import { ToolbarModule } from './toolbar.module'; +import { UiToolbarComponent } from './toolbar.component'; +import { UiToolbarModule } from './toolbar.module'; describe('ToolbarComponent', () => { - let component: ToolbarComponent; - let fixture: ComponentFixture; + let component: UiToolbarComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ToolbarModule], + imports: [UiToolbarModule], }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(ToolbarComponent); + fixture = TestBed.createComponent(UiToolbarComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/libs/ui/src/lib/toolbar/toolbar.component.ts b/libs/ui/src/lib/toolbar/toolbar.component.ts index 68e2f341..d18e85c9 100644 --- a/libs/ui/src/lib/toolbar/toolbar.component.ts +++ b/libs/ui/src/lib/toolbar/toolbar.component.ts @@ -28,7 +28,7 @@ export interface UiToolbarToolChange extends MatButtonToggleChange { `, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class ToolbarComponent { +export class UiToolbarComponent { @Input() tools: UiToolbarToolConfig[]; @Input() selectedToolId: any; diff --git a/libs/ui/src/lib/toolbar/toolbar.module.ts b/libs/ui/src/lib/toolbar/toolbar.module.ts index 6e77b28c..5e5bbd0f 100644 --- a/libs/ui/src/lib/toolbar/toolbar.module.ts +++ b/libs/ui/src/lib/toolbar/toolbar.module.ts @@ -1,11 +1,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatButtonToggleModule, MatIconModule, MatTooltipModule } from '@angular/material'; -import { ToolbarComponent } from './toolbar.component'; +import { UiToolbarComponent } from './toolbar.component'; @NgModule({ - declarations: [ToolbarComponent], + declarations: [UiToolbarComponent], imports: [CommonModule, MatButtonToggleModule, MatIconModule, MatTooltipModule], - exports: [ToolbarComponent], + exports: [UiToolbarComponent], }) -export class ToolbarModule {} +export class UiToolbarModule {} diff --git a/libs/ui/tsconfig.spec.json b/libs/ui/tsconfig.spec.json index 61c376d5..29121926 100644 --- a/libs/ui/tsconfig.spec.json +++ b/libs/ui/tsconfig.spec.json @@ -4,6 +4,6 @@ "outDir": "../../dist/out-tsc", "types": ["jest", "node"] }, - "files": ["src/test-setup.ts"], + "files": ["./src/test-setup.ts"], "include": ["**/*.spec.ts", "**/*.d.ts"] } diff --git a/package.json b/package.json index 4b63e8b6..7925ad6b 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "@ngrx/effects": "8.6.0", "@ngrx/store": "8.6.0", "@nrwl/angular": "8.11.0", - "core-js": "3.6.4", "hammerjs": "2.0.8", "mnemonist": "0.32.0", "rxjs": "6.5.4", diff --git a/yarn.lock b/yarn.lock index adfc6408..46228c18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2347,11 +2347,16 @@ acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: +acorn@^6.0.1, acorn@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== +acorn@^6.0.4: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -3828,11 +3833,6 @@ core-js@3.2.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== -core-js@3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== - core-js@^2.4.0: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" @@ -4525,7 +4525,19 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.11.0, escodegen@^1.9.1: +escodegen@^1.11.0: + version "1.12.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.1.tgz#08770602a74ac34c7a90ca9229e7d51e379abc76" + integrity sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@^1.9.1: version "1.12.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== From 4fe0e282757feec16728359759a46e04dbb4e51f Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 09:13:28 +0100 Subject: [PATCH 49/84] refactor(ui): prefix `UiPointer[Button|PickInfo]` with `Ui` --- .../scene-viewer-container.component.spec.ts | 10 +++++----- .../scene-viewer-container.component.ts | 14 +++++++------- libs/ui/src/lib/scene-viewer/index.ts | 4 ++-- libs/ui/src/lib/scene-viewer/pointer-button.ts | 2 +- .../src/lib/scene-viewer/scene-viewer.service.ts | 10 +++++----- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index 931997cf..85a995e6 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -3,7 +3,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { MemoizedSelector, Store } from '@ngrx/store'; import { MockStore, provideMockStore } from '@ngrx/store/testing'; -import { PointerButton, PointerPickInfo } from '@talus/ui'; +import { UiPointerButton, UiPointerPickInfo } from '@talus/ui'; import { Coord } from '@talus/vdb'; import { Subject } from 'rxjs'; import * as fromApp from '../app.reducer'; @@ -18,7 +18,7 @@ import { SceneViewerContainerComponent } from './scene-viewer-container.componen changeDetection: ChangeDetectionStrategy.OnPush, }) class SceneViewerStubComponent { - @Output() pointerPick = new Subject(); + @Output() pointerPick = new Subject(); } describe('SceneViewerContainerComponent', () => { @@ -62,7 +62,7 @@ describe('SceneViewerContainerComponent', () => { it('should dispatch no action if not PointerButton.Main', () => { stubComponent.pointerPick.next({ pickedPoint: [0, 0, 0], - pointerButton: PointerButton.Secondary, + pointerButton: UiPointerButton.Secondary, normal: [0, 0, 0], }); @@ -119,7 +119,7 @@ describe('SceneViewerContainerComponent', () => { stubComponent.pointerPick.next({ pickedPoint, - pointerButton: PointerButton.Main, + pointerButton: UiPointerButton.Main, normal, }); @@ -175,7 +175,7 @@ describe('SceneViewerContainerComponent', () => { stubComponent.pointerPick.next({ pickedPoint, - pointerButton: PointerButton.Main, + pointerButton: UiPointerButton.Main, normal, }); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index 9026d0b7..179cbf63 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -2,7 +2,7 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, ViewChild } from '@a // import '@babylonjs/core/Rendering/edgesRenderer'; // import '@babylonjs/core/Rendering/outlineRenderer'; import { select, Store } from '@ngrx/store'; -import { PointerButton, PointerPickInfo, UiSceneViewerComponent } from '@talus/ui'; +import { UiPointerButton, UiPointerPickInfo, UiSceneViewerComponent } from '@talus/ui'; import { Coord } from '@talus/vdb'; import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; @@ -32,7 +32,7 @@ export class SceneViewerContainerComponent implements AfterViewInit { this.store.dispatch(addVoxel({ position: [0, 0, 0], value: 42 })); } - onPointerPick(event: PointerPickInfo, selectedToolId: Tool): void { + onPointerPick(event: UiPointerPickInfo, selectedToolId: Tool): void { this.dispatchPickAction(event, selectedToolId); } @@ -41,8 +41,8 @@ export class SceneViewerContainerComponent implements AfterViewInit { // mesh.renderOutline = !mesh.renderOutline; // } - private dispatchPickAction(pickInfo: PointerPickInfo, selectedToolId: Tool): void { - if (pickInfo.pointerButton !== PointerButton.Main) { + private dispatchPickAction(pickInfo: UiPointerPickInfo, selectedToolId: Tool): void { + if (pickInfo.pointerButton !== UiPointerButton.Main) { return; } @@ -58,7 +58,7 @@ export class SceneViewerContainerComponent implements AfterViewInit { } } - private calcVoxelToAddPosition(pickInfo: PointerPickInfo): Coord { + private calcVoxelToAddPosition(pickInfo: UiPointerPickInfo): Coord { const pickedIntegerPoint = this.roundDimensionAlongNormal(pickInfo); // VDB removes fractional-part of the coordinate, i.e. 0.54 -> 0. @@ -80,7 +80,7 @@ export class SceneViewerContainerComponent implements AfterViewInit { return newPoint; } - private calcVoxelToRemovePosition(pickInfo: PointerPickInfo): Coord { + private calcVoxelToRemovePosition(pickInfo: UiPointerPickInfo): Coord { const pickedIntegerPoint = this.roundDimensionAlongNormal(pickInfo); const newPoint: Coord = [ @@ -107,7 +107,7 @@ export class SceneViewerContainerComponent implements AfterViewInit { * Since all the voxels are placed on integer positions the dimension of the picked point * needs to be rounded. */ - private roundDimensionAlongNormal(pickInfo: PointerPickInfo): Coord { + private roundDimensionAlongNormal(pickInfo: UiPointerPickInfo): Coord { return [ pickInfo.normal[0] !== 0 ? Math.round(pickInfo.pickedPoint[0]) : pickInfo.pickedPoint[0], pickInfo.normal[1] !== 0 ? Math.round(pickInfo.pickedPoint[1]) : pickInfo.pickedPoint[1], diff --git a/libs/ui/src/lib/scene-viewer/index.ts b/libs/ui/src/lib/scene-viewer/index.ts index 9e369a7f..7dfea1ff 100644 --- a/libs/ui/src/lib/scene-viewer/index.ts +++ b/libs/ui/src/lib/scene-viewer/index.ts @@ -1,5 +1,5 @@ export * from './scene-viewer.component'; export * from './scene-viewer.module'; export * from './scene-viewer.module.testing'; -export { PointerButton } from './pointer-button'; -export { PointerPickInfo, UiSceneViewerService } from './scene-viewer.service'; +export { UiPointerButton } from './pointer-button'; +export { UiPointerPickInfo, UiSceneViewerService } from './scene-viewer.service'; diff --git a/libs/ui/src/lib/scene-viewer/pointer-button.ts b/libs/ui/src/lib/scene-viewer/pointer-button.ts index 39afd4c3..f5ca1d33 100644 --- a/libs/ui/src/lib/scene-viewer/pointer-button.ts +++ b/libs/ui/src/lib/scene-viewer/pointer-button.ts @@ -1,7 +1,7 @@ /** * https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button#Syntax */ -export enum PointerButton { +export enum UiPointerButton { Main = 0, // usually the left button or the un-initialized state Auxiliary = 1, // usually the wheel button or the middle button (if present) Secondary = 2, // usually the right button diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index 31960496..5dfeb749 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -16,7 +16,7 @@ import '@babylonjs/core/Physics/physicsHelper'; // Needed for `onPointerPick` import { Scene } from '@babylonjs/core/scene'; import { Coord, MeshData } from '@talus/vdb'; import { Subject } from 'rxjs'; -import { PointerButton } from './pointer-button'; +import { UiPointerButton } from './pointer-button'; @Injectable() export class EngineFactory { @@ -54,7 +54,7 @@ export class CameraFactory { */ @Injectable() export class UiSceneViewerService { - pointerPick$ = new Subject(); + pointerPick$ = new Subject(); private engine: Engine; private scene: Scene; @@ -149,7 +149,7 @@ export class UiSceneViewerService { private registerPointerPick(): void { this.scene.onPointerPick = (event: PointerEvent, pickInfo: PickingInfo): void => { if (pickInfo.pickedMesh && pickInfo.pickedPoint) { - const info: PointerPickInfo = { + const info: UiPointerPickInfo = { pickedPoint: vector3ToCoord(pickInfo.pickedPoint), pointerButton: event.button, normal: this.getNormal(pickInfo.pickedMesh, pickInfo.faceId), @@ -191,8 +191,8 @@ function vector3ToCoord(vector: Vector3): Coord { return [vector.x, vector.y, vector.z]; } -export interface PointerPickInfo { +export interface UiPointerPickInfo { pickedPoint: Coord; - pointerButton: PointerButton; + pointerButton: UiPointerButton; normal: Coord; } From 6ecda72f1d2bc2969cf21876094189edbae72ea1 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 09:14:59 +0100 Subject: [PATCH 50/84] build(dep): update handlebars to `v4.7.2` due to security issues --- package.json | 1 + yarn.lock | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/package.json b/package.json index 7925ad6b..512b2fa6 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "cypress": "3.8.2", "dotenv": "8.2.0", "gh-pages": "2.2.0", + "handlebars": "4.7.2", "jasmine-marbles": "0.6.0", "jest": "24.9.0", "jest-junit": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 46228c18..b8e310aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5403,6 +5403,17 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +handlebars@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.2.tgz#01127b3840156a0927058779482031afe0e730d7" + integrity sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + handlebars@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" From 98daf1f233f8653f4203fcde0ff9e0aeccd845e7 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 09:28:15 +0100 Subject: [PATCH 51/84] test(ui): should emit `value` of clicked menu items --- .../lib/menu-bar/menu-bar.component.spec.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts index 86f2eba4..c4121d55 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts @@ -48,6 +48,8 @@ describe('UiMenuBarComponent', () => { // Don't call `detectChanges()`, because of `OnPush` // See: https://github.com/angular/angular/issues/12313#issuecomment-301848232 // fixture.detectChanges(); + + spyOn(component.menuItemClick, 'emit'); }); it('should create', () => { @@ -86,4 +88,23 @@ describe('UiMenuBarComponent', () => { expect(menuItemButton.nativeElement.textContent).toEqual(expectedMenus[1].menuItems[j].label); }); }); + + it('should emit value of clicked menu items', () => { + component.menuConfig = { + menus: expectedMenus, + }; + fixture.detectChanges(); + + const menuButtons = fixture.debugElement.queryAll(By.css('button')); + menuButtons[1].nativeElement.click(); + fixture.detectChanges(); + + const menuItemButtons = fixture.debugElement.queryAll(By.css('button.mat-menu-item > span')); + + menuItemButtons[0].nativeElement.click(); + expect(component.menuItemClick.emit).toBeCalledWith('Value 2.1'); + + menuItemButtons[1].nativeElement.click(); + expect(component.menuItemClick.emit).toBeCalledWith('Value 2.2'); + }); }); From d286d109d67f4d63fe05cf78fac20c488d5dcc5e Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 09:53:38 +0100 Subject: [PATCH 52/84] test(ui): should emit on tool select --- .../src/lib/toolbar/toolbar.component.spec.ts | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/libs/ui/src/lib/toolbar/toolbar.component.spec.ts b/libs/ui/src/lib/toolbar/toolbar.component.spec.ts index c422d2a4..c605ef2a 100644 --- a/libs/ui/src/lib/toolbar/toolbar.component.spec.ts +++ b/libs/ui/src/lib/toolbar/toolbar.component.spec.ts @@ -1,11 +1,25 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { UiToolbarComponent } from './toolbar.component'; +import { By } from '@angular/platform-browser'; +import { UiToolbarComponent, UiToolbarToolConfig } from './toolbar.component'; import { UiToolbarModule } from './toolbar.module'; describe('ToolbarComponent', () => { let component: UiToolbarComponent; let fixture: ComponentFixture; + const tools: UiToolbarToolConfig[] = [ + { + icon: 'add_circle_outline', + tooltip: 'Add', + value: 'Add test value', + }, + { + icon: 'remove_circle_outline', + tooltip: 'Remove', + value: 'Remove test value', + }, + ]; + beforeEach(async(() => { TestBed.configureTestingModule({ imports: [UiToolbarModule], @@ -15,10 +29,27 @@ describe('ToolbarComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(UiToolbarComponent); component = fixture.componentInstance; - fixture.detectChanges(); + // fixture.detectChanges(); + }); + + beforeEach(() => { + spyOn(component.toolChange, 'emit'); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should emit tool change', () => { + component.tools = tools; + fixture.detectChanges(); + + const buttonToggles = fixture.debugElement.queryAll(By.css('button.mat-button-toggle-button')); + expect(buttonToggles.length).toEqual(tools.length); + + buttonToggles[0].nativeElement.click(); + fixture.detectChanges(); + + expect(component.toolChange.emit).toHaveBeenCalled(); + }); }); From ca7f5f3d1a7ca628b2ad6ad2dfa2ce447279f6e0 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 10:08:31 +0100 Subject: [PATCH 53/84] test(ui): should close left & right sidenav --- .../sidenav-shell.component.spec.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts index 19f3fa27..464b0862 100644 --- a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts +++ b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.spec.ts @@ -26,7 +26,7 @@ describe('SidenavShellComponent', () => { expect(component).toBeTruthy(); }); - it('should have left & right sidenav', () => { + it('should have open left & right sidenav', () => { const sidenavs = fixture.debugElement.queryAll(By.directive(MatSidenav)); const leftSidenavIcon = fixture.debugElement.query(By.css('#left-sidenav-button mat-icon')); const rightSidenavIcon = fixture.debugElement.query(By.css('#right-sidenav-button mat-icon')); @@ -35,4 +35,22 @@ describe('SidenavShellComponent', () => { expect(leftSidenavIcon.nativeElement.textContent).toEqual('keyboard_arrow_left'); expect(rightSidenavIcon.nativeElement.textContent).toEqual('keyboard_arrow_right'); }); + + it('should close left & right sidenav', () => { + // Close left sidenav + const leftSidenavButton = fixture.debugElement.query(By.css('#left-sidenav-button')); + leftSidenavButton.nativeElement.click(); + fixture.detectChanges(); + + const leftIconClosed = fixture.debugElement.query(By.css('#left-sidenav-button mat-icon')); + expect(leftIconClosed.nativeElement.textContent).toEqual('keyboard_arrow_right'); + + // Close right sidenav + const rightSidenavButton = fixture.debugElement.query(By.css('#right-sidenav-button')); + rightSidenavButton.nativeElement.click(); + fixture.detectChanges(); + + const rightIconClosed = fixture.debugElement.query(By.css('#right-sidenav-button mat-icon')); + expect(rightIconClosed.nativeElement.textContent).toEqual('keyboard_arrow_left'); + }); }); From d79568c331a5f94a035c63f6fc37e4aa5c7d05e6 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 10:17:38 +0100 Subject: [PATCH 54/84] test(frontend): should dispatch action --- .../menu-bar-container.component.spec.ts | 11 +++++++++++ .../scene-viewer-container.component.spec.ts | 5 ++++- libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts index d4ec9c9e..b8bc23ba 100644 --- a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.spec.ts @@ -2,6 +2,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Store, StoreModule } from '@ngrx/store'; import { MockStore } from '@ngrx/store/testing'; import { ROOT_REDUCERS, State } from '../app.reducer'; +import { undo } from './menu-bar-container.actions'; import { MenuBarContainerComponent } from './menu-bar-container.component'; import { MenuBarContainerModule } from './menu-bar-container.module'; @@ -30,6 +31,10 @@ describe('MenuBarComponent', () => { store = TestBed.get>(Store); })); + beforeEach(() => { + spyOn(store, 'dispatch'); + }); + beforeEach(() => { fixture = TestBed.createComponent(MenuBarContainerComponent); component = fixture.componentInstance; @@ -39,4 +44,10 @@ describe('MenuBarComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should dispatch action', () => { + component.onMenuItemClick(undo()); + + expect(store.dispatch).toHaveBeenCalledWith(undo()); + }); }); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index 85a995e6..d3da561d 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -36,7 +36,6 @@ describe('SceneViewerContainerComponent', () => { }).compileComponents(); mockStore = TestBed.get(Store); - spyOn(mockStore, 'dispatch'); mockSelectedToolIdSelector = mockStore.overrideSelector( fromApp.selectSelectedToolId, @@ -44,6 +43,10 @@ describe('SceneViewerContainerComponent', () => { ); })); + beforeEach(async(() => { + spyOn(mockStore, 'dispatch'); + })); + beforeEach(() => { fixture = TestBed.createComponent(SceneViewerContainerComponent); component = fixture.componentInstance; diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts index c4121d55..7f709fc2 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts @@ -48,7 +48,9 @@ describe('UiMenuBarComponent', () => { // Don't call `detectChanges()`, because of `OnPush` // See: https://github.com/angular/angular/issues/12313#issuecomment-301848232 // fixture.detectChanges(); + }); + beforeEach(() => { spyOn(component.menuItemClick, 'emit'); }); From 8bcc6a2911809adc3d04131b9362779cf43fce75 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 10:29:04 +0100 Subject: [PATCH 55/84] test(frontend): check `scene-viewer-container.reducer` --- .../scene-viewer-container.reducer.spec.ts | 24 +++++++++++++++++++ .../scene-viewer-container.reducer.ts | 8 ++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts new file mode 100644 index 00000000..c276166b --- /dev/null +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts @@ -0,0 +1,24 @@ +import { VoxelChange } from './grid.service'; +import { voxelAdded, voxelRemoved } from './scene-viewer-container.actions'; +import { reducer } from './scene-viewer-container.reducer'; + +describe('SceneViewerContainerReducer', () => { + const voxelChange: VoxelChange = { + position: [0, 0, 0], + affectedNodeOrigin: [0, 0, 0], + value: 42, + }; + + it('should increment counter', () => { + const stateWithOneVoxel = reducer(undefined, voxelAdded(voxelChange)); + + expect(stateWithOneVoxel.voxelCount).toEqual(1); + }); + + it('should decrement counter', () => { + const stateWithOneVoxel = reducer(undefined, voxelAdded(voxelChange)); + const stateWithNoVoxel = reducer(stateWithOneVoxel, voxelRemoved(voxelChange)); + + expect(stateWithNoVoxel.voxelCount).toEqual(0); + }); +}); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts index f89ac931..1b8ea98b 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts @@ -1,5 +1,5 @@ import { createReducer, on } from '@ngrx/store'; -import { voxelAdded } from './scene-viewer-container.actions'; +import { voxelAdded, voxelRemoved } from './scene-viewer-container.actions'; export const featureKey = 'sceneViewerContainer'; @@ -19,6 +19,12 @@ export const reducer = createReducer( voxelCount: state.voxelCount + 1, }; }), + on(voxelRemoved, state => { + return { + ...state, + voxelCount: state.voxelCount - 1, + }; + }), ); export const selectVoxelCount = (state: State) => state.voxelCount; From d81644ec263ce3a9c56509a673d851112808a735 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 10:36:16 +0100 Subject: [PATCH 56/84] test(frontend): check `scene-viewer-container.reducer` selector --- .../scene-viewer-container.reducer.spec.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts index c276166b..b8f51290 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts @@ -1,6 +1,6 @@ import { VoxelChange } from './grid.service'; import { voxelAdded, voxelRemoved } from './scene-viewer-container.actions'; -import { reducer } from './scene-viewer-container.reducer'; +import { reducer, selectVoxelCount } from './scene-viewer-container.reducer'; describe('SceneViewerContainerReducer', () => { const voxelChange: VoxelChange = { @@ -21,4 +21,10 @@ describe('SceneViewerContainerReducer', () => { expect(stateWithNoVoxel.voxelCount).toEqual(0); }); + + it('should select voxel count', () => { + const stateWithOneVoxel = reducer(undefined, voxelAdded(voxelChange)); + + expect(selectVoxelCount(stateWithOneVoxel)).toEqual(1); + }); }); From c2dadc9cc8a1835e4e77b7baf233ba060ed84046 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 10:38:03 +0100 Subject: [PATCH 57/84] refactor(ui): import `hammerjs` to remove warning in test run --- libs/ui/src/test-setup.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/ui/src/test-setup.ts b/libs/ui/src/test-setup.ts index 8d88704e..26ec1bb0 100644 --- a/libs/ui/src/test-setup.ts +++ b/libs/ui/src/test-setup.ts @@ -1 +1,2 @@ +import 'hammerjs'; import 'jest-preset-angular'; From 2677de4722f78617c72f3c355f7f9a0e476bc650 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 10:45:19 +0100 Subject: [PATCH 58/84] test(frontend): check `tools-panel.reducer` --- .../src/app/tools-panel/tools-panel.reducer.spec.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts diff --git a/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts b/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts new file mode 100644 index 00000000..48409661 --- /dev/null +++ b/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts @@ -0,0 +1,11 @@ +import { Tool } from './tool.model'; +import { selectTool } from './tools-panel.actions'; +import { reducer } from './tools-panel.reducer'; + +describe('ToolsPanelReducer', () => { + it('should set selected tool', () => { + const newState = reducer(undefined, selectTool({ id: Tool.AddVoxel })); + + expect(newState.selectedToolId).toEqual(Tool.AddVoxel); + }); +}); From 4ea47f5b516901ea951340cbf5e48172870bda88 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 11:12:06 +0100 Subject: [PATCH 59/84] test(frontend): check `undo-redo.reducer` --- .../src/app/undo-redo/undo-redo.effects.ts | 23 +--- .../app/undo-redo/undo-redo.reducer.spec.ts | 104 ++++++++++++++++++ 2 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts diff --git a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts index 82ce29c0..4bafbe85 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; -import { Action, select, Store } from '@ngrx/store'; +import { select, Store } from '@ngrx/store'; import { filter, map, switchMap, withLatestFrom } from 'rxjs/operators'; import * as fromApp from '../app.reducer'; import * as menuBarContainerActions from '../menu-bar-container/menu-bar-container.actions'; @@ -75,13 +75,11 @@ export class UndoRedoEffects { ofType(voxelAdded), map(voxelChange => ({ redoStartAction: addVoxel(voxelChange), - redoEndAction: voxelAdded.type, + redoEndActionType: voxelAdded.type, undoStartAction: removeVoxel({ position: voxelChange.position }), undoEndActionType: voxelRemoved.type, })), - map(({ redoStartAction, redoEndAction, undoStartAction, undoEndActionType }) => - this.createAddUndo(redoStartAction, redoEndAction, undoStartAction, undoEndActionType), - ), + map(addUndo), ), ); @@ -90,22 +88,11 @@ export class UndoRedoEffects { ofType(voxelRemoved), map(voxelChange => ({ redoStartAction: removeVoxel({ position: voxelChange.position }), - redoEndAction: voxelRemoved.type, + redoEndActionType: voxelRemoved.type, undoStartAction: addVoxel(voxelChange), undoEndActionType: voxelAdded.type, })), - map(({ redoStartAction, redoEndAction, undoStartAction, undoEndActionType }) => - this.createAddUndo(redoStartAction, redoEndAction, undoStartAction, undoEndActionType), - ), + map(addUndo), ), ); - - createAddUndo( - redoStartAction: Action, - redoEndActionType: string, - undoStartAction: Action, - undoEndActionType: string, - ): Action { - return addUndo({ redoStartAction, redoEndActionType, undoStartAction, undoEndActionType }); - } } diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts new file mode 100644 index 00000000..6e1a0c5a --- /dev/null +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts @@ -0,0 +1,104 @@ +import { VoxelChange } from '../scene-viewer-container/grid.service'; +import { addVoxel, removeVoxel, voxelAdded, voxelRemoved } from '../scene-viewer-container/scene-viewer-container.actions'; +import { addUndo, redo, undo, undone } from './undo-redo.actions'; +import { + reducer, + selectCurrentRedoEndAction, + selectCurrentRedoStartAction, + selectCurrentUndoEndAction, + selectCurrentUndoStartAction, +} from './undo-redo.reducer'; + +describe('UndoRedoReducer', () => { + const voxelChange: VoxelChange = { + position: [0, 0, 0], + affectedNodeOrigin: [0, 0, 0], + value: 42, + }; + const lastVoxelChange: VoxelChange = { + position: [1, 1, 1], + affectedNodeOrigin: [1, 1, 1], + value: 24, + }; + const undoStep = { + redoStartAction: addVoxel(voxelChange), + redoEndActionType: voxelAdded.type, + undoStartAction: removeVoxel({ position: voxelChange.position }), + undoEndActionType: voxelRemoved.type, + }; + const lastUndoStep = { + redoStartAction: addVoxel(lastVoxelChange), + redoEndActionType: voxelAdded.type, + undoStartAction: removeVoxel({ position: lastVoxelChange.position }), + undoEndActionType: voxelRemoved.type, + }; + + it('should be undoing', () => { + const newState = reducer(undefined, undo()); + + expect(newState.isUndoing).toEqual(true); + }); + + it('should be redoing', () => { + const newState = reducer(undefined, redo()); + + expect(newState.isRedoing).toEqual(true); + }); + + it('should add undo step', () => { + let newState = reducer(undefined, addUndo(undoStep)); + newState = reducer(newState, addUndo(undoStep)); + newState = reducer(newState, addUndo(undoStep)); + + expect(newState.redoStartActions.length).toEqual(3); + expect(newState.redoEndActionTypes.length).toEqual(3); + expect(newState.undoStartActions.length).toEqual(3); + expect(newState.undoEndActionTypes.length).toEqual(3); + }); + + it('should update current index', () => { + let newState = reducer(undefined, addUndo(undoStep)); + newState = reducer(newState, addUndo(undoStep)); + newState = reducer(newState, addUndo(lastUndoStep)); + + expect(newState.currentIndex).toEqual(2); + expect(newState.redoEndActionTypes.length).toEqual(3); + expect(newState.undoStartActions.length).toEqual(3); + expect(newState.undoEndActionTypes.length).toEqual(3); + + expect(selectCurrentUndoStartAction(newState)).toEqual(lastUndoStep.undoStartAction); + expect(selectCurrentUndoEndAction(newState)).toEqual(lastUndoStep.undoEndActionType); + expect(selectCurrentRedoStartAction(newState)).toBeUndefined(); + expect(selectCurrentRedoEndAction(newState)).toBeUndefined(); + }); + + it('should select current undo/redo', () => { + let newState = reducer(undefined, addUndo(undoStep)); + newState = reducer(newState, addUndo(undoStep)); + newState = reducer(newState, addUndo(lastUndoStep)); + + expect(selectCurrentUndoStartAction(newState)).toEqual(lastUndoStep.undoStartAction); + expect(selectCurrentUndoEndAction(newState)).toEqual(lastUndoStep.undoEndActionType); + expect(selectCurrentRedoStartAction(newState)).toBeUndefined(); + expect(selectCurrentRedoEndAction(newState)).toBeUndefined(); + }); + + it('should select current undo/redo after one undone', () => { + let newState = reducer(undefined, addUndo(undoStep)); + newState = reducer(newState, addUndo(undoStep)); + newState = reducer(newState, addUndo(lastUndoStep)); + newState = reducer(newState, undone()); + + expect(newState.currentIndex).toEqual(1); + + expect(newState.redoStartActions.length).toEqual(3); + expect(newState.redoEndActionTypes.length).toEqual(3); + expect(newState.undoStartActions.length).toEqual(3); + expect(newState.undoEndActionTypes.length).toEqual(3); + + expect(selectCurrentUndoStartAction(newState)).toEqual(undoStep.undoStartAction); + expect(selectCurrentUndoEndAction(newState)).toEqual(undoStep.undoEndActionType); + expect(selectCurrentRedoStartAction(newState)).toEqual(lastUndoStep.redoStartAction); + expect(selectCurrentRedoEndAction(newState)).toEqual(lastUndoStep.redoEndActionType); + }); +}); From dffd51f3d64cb0eb11dd66cb61dc08e2834e48f6 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 11:29:43 +0100 Subject: [PATCH 60/84] test(frontend): check `undo-redo.reducer` with `stepX` --- .../app/undo-redo/undo-redo.reducer.spec.ts | 145 +++++++++++------- 1 file changed, 86 insertions(+), 59 deletions(-) diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts index 6e1a0c5a..e8328892 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts @@ -1,37 +1,29 @@ +import { Action } from '@ngrx/store'; +import { Coord } from '@talus/vdb'; import { VoxelChange } from '../scene-viewer-container/grid.service'; -import { addVoxel, removeVoxel, voxelAdded, voxelRemoved } from '../scene-viewer-container/scene-viewer-container.actions'; -import { addUndo, redo, undo, undone } from './undo-redo.actions'; +import { + addVoxel, + removeVoxel, + voxelAdded, + voxelRemoved, +} from '../scene-viewer-container/scene-viewer-container.actions'; +import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; import { reducer, selectCurrentRedoEndAction, selectCurrentRedoStartAction, selectCurrentUndoEndAction, selectCurrentUndoStartAction, + State, } from './undo-redo.reducer'; describe('UndoRedoReducer', () => { - const voxelChange: VoxelChange = { - position: [0, 0, 0], - affectedNodeOrigin: [0, 0, 0], - value: 42, - }; - const lastVoxelChange: VoxelChange = { - position: [1, 1, 1], - affectedNodeOrigin: [1, 1, 1], - value: 24, - }; - const undoStep = { - redoStartAction: addVoxel(voxelChange), - redoEndActionType: voxelAdded.type, - undoStartAction: removeVoxel({ position: voxelChange.position }), - undoEndActionType: voxelRemoved.type, - }; - const lastUndoStep = { - redoStartAction: addVoxel(lastVoxelChange), - redoEndActionType: voxelAdded.type, - undoStartAction: removeVoxel({ position: lastVoxelChange.position }), - undoEndActionType: voxelRemoved.type, - }; + const voxelChange0 = createVoxelChange([0, 0, 0]); + const step0 = createStep(voxelChange0); + const voxelChange1 = createVoxelChange([1, 1, 1]); + const step1 = createStep(voxelChange1); + const voxelChange2 = createVoxelChange([2, 2, 2]); + const step2 = createStep(voxelChange2); it('should be undoing', () => { const newState = reducer(undefined, undo()); @@ -46,59 +38,94 @@ describe('UndoRedoReducer', () => { }); it('should add undo step', () => { - let newState = reducer(undefined, addUndo(undoStep)); - newState = reducer(newState, addUndo(undoStep)); - newState = reducer(newState, addUndo(undoStep)); - - expect(newState.redoStartActions.length).toEqual(3); - expect(newState.redoEndActionTypes.length).toEqual(3); - expect(newState.undoStartActions.length).toEqual(3); - expect(newState.undoEndActionTypes.length).toEqual(3); + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); + + expectActionLengthToEqual(newState, 3); }); it('should update current index', () => { - let newState = reducer(undefined, addUndo(undoStep)); - newState = reducer(newState, addUndo(undoStep)); - newState = reducer(newState, addUndo(lastUndoStep)); + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); expect(newState.currentIndex).toEqual(2); - expect(newState.redoEndActionTypes.length).toEqual(3); - expect(newState.undoStartActions.length).toEqual(3); - expect(newState.undoEndActionTypes.length).toEqual(3); - - expect(selectCurrentUndoStartAction(newState)).toEqual(lastUndoStep.undoStartAction); - expect(selectCurrentUndoEndAction(newState)).toEqual(lastUndoStep.undoEndActionType); - expect(selectCurrentRedoStartAction(newState)).toBeUndefined(); - expect(selectCurrentRedoEndAction(newState)).toBeUndefined(); + expectActionLengthToEqual(newState, 3); }); it('should select current undo/redo', () => { - let newState = reducer(undefined, addUndo(undoStep)); - newState = reducer(newState, addUndo(undoStep)); - newState = reducer(newState, addUndo(lastUndoStep)); + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); - expect(selectCurrentUndoStartAction(newState)).toEqual(lastUndoStep.undoStartAction); - expect(selectCurrentUndoEndAction(newState)).toEqual(lastUndoStep.undoEndActionType); + expect(selectCurrentUndoStartAction(newState)).toEqual(step2.undoStartAction); + expect(selectCurrentUndoEndAction(newState)).toEqual(step2.undoEndActionType); expect(selectCurrentRedoStartAction(newState)).toBeUndefined(); expect(selectCurrentRedoEndAction(newState)).toBeUndefined(); }); it('should select current undo/redo after one undone', () => { - let newState = reducer(undefined, addUndo(undoStep)); - newState = reducer(newState, addUndo(undoStep)); - newState = reducer(newState, addUndo(lastUndoStep)); + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); newState = reducer(newState, undone()); expect(newState.currentIndex).toEqual(1); + expectActionLengthToEqual(newState, 3); + + expect(selectCurrentUndoStartAction(newState)).toEqual(step1.undoStartAction); + expect(selectCurrentUndoEndAction(newState)).toEqual(step1.undoEndActionType); + expect(selectCurrentRedoStartAction(newState)).toEqual(step2.redoStartAction); + expect(selectCurrentRedoEndAction(newState)).toEqual(step2.redoEndActionType); + }); + + it('should select current undo/redo after three undone & one redo', () => { + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, redone()); - expect(newState.redoStartActions.length).toEqual(3); - expect(newState.redoEndActionTypes.length).toEqual(3); - expect(newState.undoStartActions.length).toEqual(3); - expect(newState.undoEndActionTypes.length).toEqual(3); + expect(newState.currentIndex).toEqual(0); + expectActionLengthToEqual(newState, 3); - expect(selectCurrentUndoStartAction(newState)).toEqual(undoStep.undoStartAction); - expect(selectCurrentUndoEndAction(newState)).toEqual(undoStep.undoEndActionType); - expect(selectCurrentRedoStartAction(newState)).toEqual(lastUndoStep.redoStartAction); - expect(selectCurrentRedoEndAction(newState)).toEqual(lastUndoStep.redoEndActionType); + expect(selectCurrentUndoStartAction(newState)).toEqual(step0.undoStartAction); + expect(selectCurrentUndoEndAction(newState)).toEqual(step0.undoEndActionType); + expect(selectCurrentRedoStartAction(newState)).toEqual(step1.redoStartAction); + expect(selectCurrentRedoEndAction(newState)).toEqual(step1.redoEndActionType); }); }); + +function createVoxelChange(xyz: Coord): VoxelChange { + return { + position: xyz, + affectedNodeOrigin: xyz, + value: 42, + }; +} + +function createStep( + voxelChange: VoxelChange, +): { + redoEndActionType: string; + redoStartAction: Action; + undoEndActionType: string; + undoStartAction: Action; +} { + return { + redoStartAction: addVoxel(voxelChange), + redoEndActionType: voxelAdded.type, + undoStartAction: removeVoxel({ position: voxelChange.position }), + undoEndActionType: voxelRemoved.type, + }; +} + +function expectActionLengthToEqual(state: State, length: number): void { + expect(state.redoStartActions.length).toEqual(length); + expect(state.redoEndActionTypes.length).toEqual(length); + expect(state.undoStartActions.length).toEqual(length); + expect(state.undoEndActionTypes.length).toEqual(length); +} From 43a35520059ff07ffc5c52df18e4612460c4998a Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 11:42:17 +0100 Subject: [PATCH 61/84] test(frontend): check `undo-redo.reducer` too many undo/redo's --- .../app/undo-redo/undo-redo.reducer.spec.ts | 75 +++++++++++++++++-- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts index e8328892..39a2d7d7 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts @@ -1,12 +1,7 @@ import { Action } from '@ngrx/store'; import { Coord } from '@talus/vdb'; import { VoxelChange } from '../scene-viewer-container/grid.service'; -import { - addVoxel, - removeVoxel, - voxelAdded, - voxelRemoved, -} from '../scene-viewer-container/scene-viewer-container.actions'; +import { addVoxel, removeVoxel, voxelAdded, voxelRemoved } from '../scene-viewer-container/scene-viewer-container.actions'; import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; import { reducer, @@ -97,6 +92,74 @@ describe('UndoRedoReducer', () => { expect(selectCurrentRedoStartAction(newState)).toEqual(step1.redoStartAction); expect(selectCurrentRedoEndAction(newState)).toEqual(step1.redoEndActionType); }); + + it('should consider max buffer size of 10', () => { + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); + newState = reducer(newState, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); + newState = reducer(newState, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); + newState = reducer(newState, addUndo(step0)); + + newState = reducer(newState, addUndo(step1)); + + expect(newState.currentIndex).toEqual(9); + expectActionLengthToEqual(newState, 10); + }); + + it('should remove history', () => { + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step0)); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, addUndo(step2)); + + expect(newState.currentIndex).toEqual(4); + expectActionLengthToEqual(newState, 5); + }); + + it('should stop decrement index after too many undo', () => { + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + + newState = reducer(newState, undone()); + + expect(newState.currentIndex).toEqual(-1); + expectActionLengthToEqual(newState, 3); + }); + + it('should stop increment index after too many redo', () => { + let newState = reducer(undefined, addUndo(step0)); + newState = reducer(newState, addUndo(step1)); + newState = reducer(newState, addUndo(step2)); + newState = reducer(newState, undone()); + newState = reducer(newState, undone()); + newState = reducer(newState, redone()); + newState = reducer(newState, redone()); + + newState = reducer(newState, redone()); + + expect(newState.currentIndex).toEqual(2); + expectActionLengthToEqual(newState, 3); + }); }); function createVoxelChange(xyz: Coord): VoxelChange { From 7d44795027e8a766c201f720d4129af5d5fc2041 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 11:56:54 +0100 Subject: [PATCH 62/84] style(prettier): fix imports --- apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts index 39a2d7d7..61afc316 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts @@ -1,7 +1,12 @@ import { Action } from '@ngrx/store'; import { Coord } from '@talus/vdb'; import { VoxelChange } from '../scene-viewer-container/grid.service'; -import { addVoxel, removeVoxel, voxelAdded, voxelRemoved } from '../scene-viewer-container/scene-viewer-container.actions'; +import { + addVoxel, + removeVoxel, + voxelAdded, + voxelRemoved, +} from '../scene-viewer-container/scene-viewer-container.actions'; import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; import { reducer, From bf1a295335440bfbf11a3d3f53671e703ef5a4e1 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 13:17:16 +0100 Subject: [PATCH 63/84] test(vdb): add tests for `tree` --- libs/vdb/src/lib/tree/tree.spec.ts | 51 ++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 libs/vdb/src/lib/tree/tree.spec.ts diff --git a/libs/vdb/src/lib/tree/tree.spec.ts b/libs/vdb/src/lib/tree/tree.spec.ts new file mode 100644 index 00000000..6e86aa4f --- /dev/null +++ b/libs/vdb/src/lib/tree/tree.spec.ts @@ -0,0 +1,51 @@ +import { Tree } from './tree'; + +describe('Tree', () => { + it('should get background', () => { + const tree = new Tree(-1); + + expect(tree.background).toEqual(-1); + }); + + it('should get/set value', () => { + const tree = new Tree(-1); + + tree.setValueOn([0, 1, 2], 42); + + expect(tree.getValue([0, 1, 2])).toEqual(42); + }); + + it('should activated value', () => { + const tree = new Tree(-1); + + tree.setValueOn([0, 1, 2], 42); + + expect(tree.isValueOn([0, 1, 2])).toBeTruthy(); + }); + + it('should count voxel', () => { + const tree = new Tree(-1); + + tree.setValueOn([0, 1, 2], 42); + tree.setValueOn([845, 242, 64], 42); + tree.setValueOn([1000, 4000, 200000], 42); + + expect(tree.onVoxelCount()).toEqual(3); + }); + + it('should iterate over each activated voxel', () => { + const tree = new Tree(-1); + + tree.setValueOn([0, 1, 2], 42); + tree.setValueOn([845, 242, 64], 42); + tree.setValueOn([1000, 4000, 200000], 42); + + let counter = 0; + for (const voxel of tree.beginVoxelOn()) { + counter++; + expect(voxel.value).toEqual(42); + } + + expect(counter).toEqual(3); + }); +}); From e7e93c84b4d1f23bd83d3881736cb2070bb18873 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 14:02:24 +0100 Subject: [PATCH 64/84] test(vdb): improve coverage --- apps/benchmark/src/app/vdb/grid.benchmark.ts | 2 +- .../scene-viewer-container/grid.service.ts | 2 +- libs/vdb/src/lib/tools/node-to-mesh.spec.ts | 4 +- libs/vdb/src/lib/tree/root-node.spec.ts | 138 +++++++++--------- libs/vdb/src/lib/tree/value-accessor.spec.ts | 52 ++++++- libs/vdb/src/lib/tree/value-accessor.ts | 5 +- 6 files changed, 122 insertions(+), 81 deletions(-) diff --git a/apps/benchmark/src/app/vdb/grid.benchmark.ts b/apps/benchmark/src/app/vdb/grid.benchmark.ts index 94e46c7c..6cde5004 100644 --- a/apps/benchmark/src/app/vdb/grid.benchmark.ts +++ b/apps/benchmark/src/app/vdb/grid.benchmark.ts @@ -46,7 +46,7 @@ suite('[Grid] setValue()', () => { for (let x = 0; x < i; x++) { for (let y = 0; y < i; y++) { for (let z = 0; z < i; z++) { - accessor.setValue([x, y, z], i); + accessor.setValueOn([x, y, z], i); } } } diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index 0007160c..4fda072e 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -28,7 +28,7 @@ export class GridService { * @returns origin of `InternalNode1` of affected node (node containing added voxel). */ addVoxel(xyz: Coord, value: number): VoxelChange { - this.accessor.setValue(xyz, value); + this.accessor.setValueOn(xyz, value); return { affectedNodeOrigin: this.accessor.internalNode1Origin, diff --git a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts index 4ac01600..0b0ae6e2 100644 --- a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts +++ b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts @@ -6,8 +6,8 @@ describe('nodeToMesh()', () => { const grid = new Grid(0); const accessor = grid.getAccessor(); - accessor.setValue([0, 0, 0], 1); - accessor.setValue([0, 0, 1], 1); + accessor.setValueOn([0, 0, 0], 1); + accessor.setValueOn([0, 0, 1], 1); const meshData = nodeToMesh(grid.tree.root, () => [0, 0, 0, 1]); diff --git a/libs/vdb/src/lib/tree/root-node.spec.ts b/libs/vdb/src/lib/tree/root-node.spec.ts index 6ee42d90..47b1d179 100644 --- a/libs/vdb/src/lib/tree/root-node.spec.ts +++ b/libs/vdb/src/lib/tree/root-node.spec.ts @@ -2,95 +2,93 @@ import { InternalNode2 } from './internal-node'; import { RootNode } from './root-node'; describe('RootNode', () => { - describe('setValueOn()', () => { - it('should set given value and activate it', () => { - const root = new RootNode(-1); + it('should set given value and activate it', () => { + const root = new RootNode(-1); - root.setValueOn([0, 0, 0], 24); - root.setValueOn([102, 15, 127], 42); + root.setValueOn([0, 0, 0], 24); + root.setValueOn([102, 15, 127], 42); - expect(root.getValue([0, 0, 0])).toEqual(24); - expect(root.getValue([102, 15, 127])).toEqual(42); + expect(root.getValue([0, 0, 0])).toEqual(24); + expect(root.getValue([102, 15, 127])).toEqual(42); - expect(root.isValueOn([0, 0, 0])).toEqual(true); - expect(root.isValueOn([102, 15, 127])).toEqual(true); + expect(root.isValueOn([0, 0, 0])).toEqual(true); + expect(root.isValueOn([102, 15, 127])).toEqual(true); - expect(root.getValue([1, 1, 1])).toEqual(-1); - }); + expect(root.getValue([1, 1, 1])).toEqual(-1); + }); + + it('should return background', () => { + const root = new RootNode(-1); + + expect(root.getValue([111, 222, 333])).toEqual(-1); + }); - it('should set value when given float coordinates', () => { - const root = new RootNode(-1); + it('should set value when given float coordinates', () => { + const root = new RootNode(-1); - root.setValueOn([0, 0, 0.1], 1); - root.setValueOn([0, 1.5, 0], 5); - root.setValueOn([2.9, 0, 0], 9); + root.setValueOn([0, 0, 0.1], 1); + root.setValueOn([0, 1.5, 0], 5); + root.setValueOn([2.9, 0, 0], 9); - expect(root.getValue([0, 0, 0])).toEqual(1); - expect(root.getValue([0, 0, 1])).toEqual(-1); - expect(root.getValue([0, 1, 0])).toEqual(5); - expect(root.getValue([0, 2, 0])).toEqual(-1); - expect(root.getValue([2, 0, 0])).toEqual(9); - expect(root.getValue([3, 0, 0])).toEqual(-1); + expect(root.getValue([0, 0, 0])).toEqual(1); + expect(root.getValue([0, 0, 1])).toEqual(-1); + expect(root.getValue([0, 1, 0])).toEqual(5); + expect(root.getValue([0, 2, 0])).toEqual(-1); + expect(root.getValue([2, 0, 0])).toEqual(9); + expect(root.getValue([3, 0, 0])).toEqual(-1); - root.setValueOn([0, 0, -1.2], -2); - root.setValueOn([0, -2.5, 0], -5); - root.setValueOn([-3.9, 0, 0], -9); + root.setValueOn([0, 0, -1.2], -2); + root.setValueOn([0, -2.5, 0], -5); + root.setValueOn([-3.9, 0, 0], -9); - expect(root.getValue([0, 0, -1])).toEqual(-2); - expect(root.getValue([0, -2, 0])).toEqual(-5); - expect(root.getValue([-3, 0, 0])).toEqual(-9); - }); + expect(root.getValue([0, 0, -1])).toEqual(-2); + expect(root.getValue([0, -2, 0])).toEqual(-5); + expect(root.getValue([-3, 0, 0])).toEqual(-9); }); - describe('onVoxelCount()', () => { - it('should count all activated voxels', () => { - const root = new RootNode(-1); + it('should count all activated voxels', () => { + const root = new RootNode(-1); - root.setValueOn([0, 0, 0], 24); - root.setValueOn([102, 15, 127], 42); + root.setValueOn([0, 0, 0], 24); + root.setValueOn([102, 15, 127], 42); - expect(root.onVoxelCount()).toEqual(2); - }); + expect(root.onVoxelCount()).toEqual(2); }); - describe('getTableSize()', () => { - it('should create new entries when inserting values', () => { - const root = new RootNode(-1); - - root.setValueOn([0, 0, 0], 24); - root.setValueOn([0, 0, 1], 24); - root.setValueOn([102, 15, 127], 42); - expect(root.getTableSize()).toEqual(1); - - root.setValueOn([0, 0, InternalNode2.DIM], 42); - root.setValueOn([0, 1, InternalNode2.DIM], 42); - root.setValueOn([1, 0, InternalNode2.DIM], 42); - expect(root.getTableSize()).toEqual(2); - - root.setValueOn([InternalNode2.DIM, 0, 0], 42); - root.setValueOn([InternalNode2.DIM, 0, 1], 42); - root.setValueOn([InternalNode2.DIM, 1, 0], 42); - expect(root.getTableSize()).toEqual(3); - }); + it('should create new entries when inserting values', () => { + const root = new RootNode(-1); + + root.setValueOn([0, 0, 0], 24); + root.setValueOn([0, 0, 1], 24); + root.setValueOn([102, 15, 127], 42); + expect(root.getTableSize()).toEqual(1); + + root.setValueOn([0, 0, InternalNode2.DIM], 42); + root.setValueOn([0, 1, InternalNode2.DIM], 42); + root.setValueOn([1, 0, InternalNode2.DIM], 42); + expect(root.getTableSize()).toEqual(2); + + root.setValueOn([InternalNode2.DIM, 0, 0], 42); + root.setValueOn([InternalNode2.DIM, 0, 1], 42); + root.setValueOn([InternalNode2.DIM, 1, 0], 42); + expect(root.getTableSize()).toEqual(3); }); - describe('beginVoxelOn()', () => { - it('should iterate over all activated voxels', () => { - const root = new RootNode(-1); - const expectedValues = [0, 1, 2, 3]; + it('should iterate over all activated voxels', () => { + const root = new RootNode(-1); + const expectedValues = [0, 1, 2, 3]; - root.setValueOn([0, 0, 0], expectedValues[0]); - root.setValueOn([0, 0, InternalNode2.DIM], expectedValues[1]); - root.setValueOn([0, InternalNode2.DIM, 0], expectedValues[2]); - root.setValueOn([InternalNode2.DIM, 0, 0], expectedValues[3]); + root.setValueOn([0, 0, 0], expectedValues[0]); + root.setValueOn([0, 0, InternalNode2.DIM], expectedValues[1]); + root.setValueOn([0, InternalNode2.DIM, 0], expectedValues[2]); + root.setValueOn([InternalNode2.DIM, 0, 0], expectedValues[3]); - let counter = 0; - for (const voxel of root.beginVoxelOn()) { - expect(voxel.value).toEqual(expectedValues[counter]); - counter++; - } + let counter = 0; + for (const voxel of root.beginVoxelOn()) { + expect(voxel.value).toEqual(expectedValues[counter]); + counter++; + } - expect(counter).toEqual(expectedValues.length); - }); + expect(counter).toEqual(expectedValues.length); }); }); diff --git a/libs/vdb/src/lib/tree/value-accessor.spec.ts b/libs/vdb/src/lib/tree/value-accessor.spec.ts index d110c44e..8398e31b 100644 --- a/libs/vdb/src/lib/tree/value-accessor.spec.ts +++ b/libs/vdb/src/lib/tree/value-accessor.spec.ts @@ -1,8 +1,16 @@ -import { InternalNode2 } from './internal-node'; +import { LeafNode } from '@talus/vdb'; +import { InternalNode1, InternalNode2 } from './internal-node'; import { Tree } from './tree'; import { ValueAccessor3 } from './value-accessor'; describe('ValueAccessor', () => { + it('should return background', () => { + const tree = new Tree(-1); + const accessor = new ValueAccessor3(tree); + + expect(accessor.getValue([111, 222, 333])).toEqual(-1); + }); + describe('getValue()', () => { it('should cache coordinate', () => { const tree = new Tree(0); @@ -22,12 +30,12 @@ describe('ValueAccessor', () => { }); }); - describe('setValue()', () => { + describe('setValueOn()', () => { it('should cache coordinate', () => { const tree = new Tree(0); const accessor = new ValueAccessor3(tree); - accessor.setValue([0, 0, 0], 1496); + accessor.setValueOn([0, 0, 0], 1496); const value = accessor.getValue([0, 0, 0]); expect(value).toEqual(1496); @@ -103,4 +111,42 @@ describe('ValueAccessor', () => { expect(accessor.isValueOn([0, 0, 1])).toBeFalsy(); }); }); + + describe('probeInternalNode1()', () => { + const tree = new Tree(-1); + + it('should return undefined if no internal node 1', () => { + const accessor = new ValueAccessor3(tree); + + expect(accessor.probeInternalNode1([111, 222, 333])).toBeUndefined(); + }); + + it('should hit no cache and return internal node 1', () => { + const accessor = new ValueAccessor3(tree); + + accessor.setValueOn([0, 0, 0], 42); + // Produce a cache miss (go over root) + accessor.setValueOn([InternalNode2.DIM, 0, 0], 42); + + expect(accessor.probeInternalNode1([32, 0, 0])).toBeInstanceOf(InternalNode1); + }); + + it('should hit cache L2 and return internal node 1', () => { + const accessor = new ValueAccessor3(tree); + + accessor.setValueOn([0, 0, 0], 42); + // Produce a cache miss (go over InternalNode2) + accessor.setValueOn([InternalNode1.DIM, 0, 0], 42); + + expect(accessor.probeInternalNode1([32, 0, 0])).toBeInstanceOf(InternalNode1); + }); + + it('should hit cache L1 and return internal node 1', () => { + const accessor = new ValueAccessor3(tree); + + accessor.setValueOn([0, 0, 0], 42); + + expect(accessor.probeInternalNode1([LeafNode.DIM, 0, 0])).toBeInstanceOf(InternalNode1); + }); + }); }); diff --git a/libs/vdb/src/lib/tree/value-accessor.ts b/libs/vdb/src/lib/tree/value-accessor.ts index d2d54fa0..484a1ba6 100644 --- a/libs/vdb/src/lib/tree/value-accessor.ts +++ b/libs/vdb/src/lib/tree/value-accessor.ts @@ -82,7 +82,7 @@ export class ValueAccessor3 { /** * Set the value of the voxel at the given coordinates and mark the voxel as active. */ - setValue(xyz: Coord, value: T): void { + setValueOn(xyz: Coord, value: T): void { if (this.isHashed0(xyz)) { this.leafNode.setValueAndCache(xyz, value, this); } else if (this.isHashed1(xyz)) { @@ -93,9 +93,6 @@ export class ValueAccessor3 { this.tree.root.setValueAndCache(xyz, value, this); } } - setValueOn(xyz: Coord, value: T): void { - this.setValue(xyz, value); - } /** * Set the value of the voxel at the given coordinates and mark the voxel as inactive. From e391604b517dff0a9132caf21466516d4dd8375c Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 14:14:05 +0100 Subject: [PATCH 65/84] test(vdb): check coord --- libs/vdb/src/lib/math/coord.spec.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 libs/vdb/src/lib/math/coord.spec.ts diff --git a/libs/vdb/src/lib/math/coord.spec.ts b/libs/vdb/src/lib/math/coord.spec.ts new file mode 100644 index 00000000..a1b365d2 --- /dev/null +++ b/libs/vdb/src/lib/math/coord.spec.ts @@ -0,0 +1,28 @@ +import { add, areEqual, clone, Coord, createMinCoord } from './coord'; + +describe('Coord', () => { + it('should add coordinates', () => { + const c1: Coord = [1, 2, 3]; + const c2: Coord = [3, 2, 1]; + + expect(add(c1, c2)).toEqual([4, 4, 4]); + }); + + it('should create minimal coordinate', () => { + expect(createMinCoord()).toEqual([5e-324, 5e-324, 5e-324]); + }); + + it('should consider coordinates equal', () => { + const c1: Coord = [1, 2, 3]; + const c2: Coord = [1, 2, 3]; + + expect(areEqual(c1, c2)).toBeTruthy(); + }); + + it('should create clone', () => { + const c1: Coord = [1, 2, 3]; + + expect(clone(c1)).toEqual(c1); + expect(clone(c1)).not.toBe(c1); + }); +}); From a387799df0ae23d63615a3d0c3d62b840830e7e4 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 14:17:15 +0100 Subject: [PATCH 66/84] test(vdb): check grid --- libs/vdb/src/lib/grid.spec.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 libs/vdb/src/lib/grid.spec.ts diff --git a/libs/vdb/src/lib/grid.spec.ts b/libs/vdb/src/lib/grid.spec.ts new file mode 100644 index 00000000..262a0804 --- /dev/null +++ b/libs/vdb/src/lib/grid.spec.ts @@ -0,0 +1,26 @@ +import { Grid } from '@talus/vdb'; + +describe('Grid', () => { + it('should get background', () => { + const grid = new Grid(-1); + + expect(grid.background).toEqual(-1); + }); + + it('should iterate over each activated voxel', () => { + const grid = new Grid(-1); + const accessor = grid.getAccessor(); + + accessor.setValueOn([2, 1, 0], 42); + accessor.setValueOn([845, 64, 242], 42); + accessor.setValueOn([1000, 200000, 4000], 42); + + let counter = 0; + for (const voxel of grid.beginVoxelOn()) { + counter++; + expect(voxel.value).toEqual(42); + } + + expect(counter).toEqual(3); + }); +}); From 64a9c08a6acdb66f96dfd405971f29e6b742a0f4 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 16 Jan 2020 14:21:43 +0100 Subject: [PATCH 67/84] test(vdb): check `nodeToMesh` --- libs/vdb/src/lib/tools/node-to-mesh.spec.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts index 0b0ae6e2..00337913 100644 --- a/libs/vdb/src/lib/tools/node-to-mesh.spec.ts +++ b/libs/vdb/src/lib/tools/node-to-mesh.spec.ts @@ -26,4 +26,12 @@ describe('nodeToMesh()', () => { expect(meshData.normals.length).toEqual(meshData.positions.length); } }); + + it('should return undefined if there are no data', () => { + const grid = new Grid(0); + + const meshData = nodeToMesh(grid.tree.root, () => [0, 0, 0, 1]); + + expect(meshData).toBeUndefined(); + }); }); From a328f098b1006a6b990ff216daaf554a6a758707 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Fri, 17 Jan 2020 12:25:47 +0100 Subject: [PATCH 68/84] feat(ui): add `Storybook` (#16) * feat(ui): add `Storybook` * feat(ui): add `Storybook` e2e test * doc(ui): how to watch e2e * build(dep): update storybook to `v5.3.6` * build(dep): back to storybook `v5.3.2` due to: - info => Using angular project 'frontend' for configuring Storybook. * build(dep): back to storybook `v5.3.6` since it works * test(ui-e2e): open/close `menu-bar` --- .storybook/addons.js | 1 + .storybook/tsconfig.json | 5 + .storybook/webpack.config.js | 11 + angular.json | 57 + apps/ui-e2e/cypress.json | 13 + apps/ui-e2e/src/fixtures/example.json | 4 + .../menu-bar/menu-bar.component.spec.ts | 40 + apps/ui-e2e/src/plugins/index.js | 22 + apps/ui-e2e/src/support/commands.ts | 31 + apps/ui-e2e/src/support/index.ts | 17 + apps/ui-e2e/tsconfig.e2e.json | 8 + apps/ui-e2e/tsconfig.json | 7 + apps/ui-e2e/tslint.json | 1 + libs/ui/.storybook/addons.js | 1 + libs/ui/.storybook/config.js | 5 + libs/ui/.storybook/preview-head.html | 1 + libs/ui/.storybook/tsconfig.json | 8 + libs/ui/.storybook/webpack.config.js | 7 + libs/ui/README.md | 11 + libs/ui/src/index.ts | 1 - .../lib/menu-bar/menu-bar.component.spec.ts | 3 +- .../menu-bar/menu-bar.component.stories.ts | 35 + libs/ui/src/lib/menu-bar/menu-bar.module.ts | 10 +- libs/ui/src/lib/ui.module.spec.ts | 14 - libs/ui/src/lib/ui.module.ts | 7 - libs/ui/tsconfig.lib.json | 2 +- nx.json | 4 + package.json | 5 + yarn.lock | 3704 ++++++++++++++++- 29 files changed, 3914 insertions(+), 121 deletions(-) create mode 100644 .storybook/addons.js create mode 100644 .storybook/tsconfig.json create mode 100644 .storybook/webpack.config.js create mode 100644 apps/ui-e2e/cypress.json create mode 100644 apps/ui-e2e/src/fixtures/example.json create mode 100644 apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts create mode 100644 apps/ui-e2e/src/plugins/index.js create mode 100644 apps/ui-e2e/src/support/commands.ts create mode 100644 apps/ui-e2e/src/support/index.ts create mode 100644 apps/ui-e2e/tsconfig.e2e.json create mode 100644 apps/ui-e2e/tsconfig.json create mode 100644 apps/ui-e2e/tslint.json create mode 100644 libs/ui/.storybook/addons.js create mode 100644 libs/ui/.storybook/config.js create mode 100644 libs/ui/.storybook/preview-head.html create mode 100644 libs/ui/.storybook/tsconfig.json create mode 100644 libs/ui/.storybook/webpack.config.js create mode 100644 libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts delete mode 100644 libs/ui/src/lib/ui.module.spec.ts delete mode 100644 libs/ui/src/lib/ui.module.ts diff --git a/.storybook/addons.js b/.storybook/addons.js new file mode 100644 index 00000000..6622fe47 --- /dev/null +++ b/.storybook/addons.js @@ -0,0 +1 @@ +import '@storybook/addon-knobs/register'; diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json new file mode 100644 index 00000000..c76ab8e2 --- /dev/null +++ b/.storybook/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../tsconfig.json", + "exclude": ["../**/test.ts", "../**/*.spec.ts"], + "include": ["../**/*"] +} diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js new file mode 100644 index 00000000..c718e76b --- /dev/null +++ b/.storybook/webpack.config.js @@ -0,0 +1,11 @@ +// Export a function. Accept the base config as the only param. +module.exports = async ({ config, mode }) => { + // `mode` has a value of 'DEVELOPMENT' or 'PRODUCTION' + // You can change the configuration based on that. + // 'PRODUCTION' is used when building the static version of storybook. + + // Make whatever fine-grained changes you need + + // Return the altered config + return config; +}; diff --git a/angular.json b/angular.json index fd3d68fd..fd538bf0 100644 --- a/angular.json +++ b/angular.json @@ -135,6 +135,36 @@ "tsConfig": "libs/ui/tsconfig.spec.json", "setupFile": "libs/ui/src/test-setup.ts" } + }, + "storybook": { + "builder": "@nrwl/storybook:storybook", + "options": { + "uiFramework": "@storybook/angular", + "port": 4400, + "config": { + "configFolder": "libs/ui/.storybook" + } + }, + "configurations": { + "ci": { + "quiet": true + } + } + }, + "build-storybook": { + "builder": "@nrwl/storybook:build", + "options": { + "uiFramework": "@storybook/angular", + "outputPath": "dist/storybook/ui", + "config": { + "configFolder": "libs/ui/.storybook" + } + }, + "configurations": { + "ci": { + "quiet": true + } + } } }, "schematics": { @@ -208,6 +238,33 @@ } } } + }, + "ui-e2e": { + "root": "apps/ui-e2e", + "sourceRoot": "apps/ui-e2e/src", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@nrwl/cypress:cypress", + "options": { + "cypressConfig": "apps/ui-e2e/cypress.json", + "tsConfig": "apps/ui-e2e/tsconfig.e2e.json", + "devServerTarget": "ui:storybook" + }, + "configurations": { + "production": { + "devServerTarget": "ui:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["apps/ui-e2e/tsconfig.e2e.json"], + "exclude": ["**/node_modules/**", "!apps/ui-e2e/**"] + } + } + } } }, "cli": { diff --git a/apps/ui-e2e/cypress.json b/apps/ui-e2e/cypress.json new file mode 100644 index 00000000..356a6fe2 --- /dev/null +++ b/apps/ui-e2e/cypress.json @@ -0,0 +1,13 @@ +{ + "baseUrl": "http://localhost:4400", + "chromeWebSecurity": false, + "fileServerFolder": ".", + "fixturesFolder": "./src/fixtures", + "integrationFolder": "./src/integration", + "modifyObstructiveCode": false, + "pluginsFile": "./src/plugins/index", + "screenshotsFolder": "../../dist/cypress/apps/ui-e2e/screenshots", + "supportFile": "./src/support/index.ts", + "video": true, + "videosFolder": "../../dist/cypress/apps/ui-e2e/videos" +} diff --git a/apps/ui-e2e/src/fixtures/example.json b/apps/ui-e2e/src/fixtures/example.json new file mode 100644 index 00000000..294cbed6 --- /dev/null +++ b/apps/ui-e2e/src/fixtures/example.json @@ -0,0 +1,4 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io" +} diff --git a/apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts b/apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts new file mode 100644 index 00000000..7ccab926 --- /dev/null +++ b/apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts @@ -0,0 +1,40 @@ +import { UiMenuBarConfig } from '@talus/ui'; + +const menuConfig: UiMenuBarConfig = { + menus: [ + { + label: 'Edit', + menuItems: [ + { + icon: 'undo', + label: 'Undo', + value: 'undo()', + }, + { + icon: 'redo', + label: 'Redo', + value: 'redo()', + }, + ], + }, + ], +}; + +describe('ui', () => { + beforeEach(() => + cy.visit( + `/iframe.html?id=uimenubarcomponent--primary&knob-menuConfig=${JSON.stringify(menuConfig)}`, + ), + ); + + it('should render all menus/menu-items & and open/close menu', () => { + cy.get('ui-menu-bar').should('exist'); + + cy.get('.mat-menu-trigger').click(); + cy.get('.mat-menu-content').should('have.length', menuConfig.menus.length); + cy.get('.mat-menu-item').should('have.length', menuConfig.menus[0].menuItems.length); + + cy.get('.cdk-overlay-backdrop').click(); + cy.get('.mat-menu-content').should('not.exist'); + }); +}); diff --git a/apps/ui-e2e/src/plugins/index.js b/apps/ui-e2e/src/plugins/index.js new file mode 100644 index 00000000..bc34d630 --- /dev/null +++ b/apps/ui-e2e/src/plugins/index.js @@ -0,0 +1,22 @@ +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +const { preprocessTypescript } = require('@nrwl/cypress/plugins/preprocessor'); + +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config + + // Preprocess Typescript + on('file:preprocessor', preprocessTypescript(config)); +}; diff --git a/apps/ui-e2e/src/support/commands.ts b/apps/ui-e2e/src/support/commands.ts new file mode 100644 index 00000000..61b3a3e3 --- /dev/null +++ b/apps/ui-e2e/src/support/commands.ts @@ -0,0 +1,31 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// eslint-disable-next-line @typescript-eslint/no-namespace +declare namespace Cypress { + interface Chainable { + login(email: string, password: string): void; + } +} +// +// -- This is a parent command -- +Cypress.Commands.add('login', (email, password) => { + console.log('Custom command example: Login', email, password); +}); +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/apps/ui-e2e/src/support/index.ts b/apps/ui-e2e/src/support/index.ts new file mode 100644 index 00000000..3d469a6b --- /dev/null +++ b/apps/ui-e2e/src/support/index.ts @@ -0,0 +1,17 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; diff --git a/apps/ui-e2e/tsconfig.e2e.json b/apps/ui-e2e/tsconfig.e2e.json new file mode 100644 index 00000000..824748ba --- /dev/null +++ b/apps/ui-e2e/tsconfig.e2e.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "sourceMap": false, + "outDir": "../../dist/out-tsc" + }, + "include": ["src/**/*.ts", "src/**/*.js"] +} diff --git a/apps/ui-e2e/tsconfig.json b/apps/ui-e2e/tsconfig.json new file mode 100644 index 00000000..d8d4ea3e --- /dev/null +++ b/apps/ui-e2e/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["cypress", "node"] + }, + "include": ["**/*.ts", "**/*.js"] +} diff --git a/apps/ui-e2e/tslint.json b/apps/ui-e2e/tslint.json new file mode 100644 index 00000000..8acd9a36 --- /dev/null +++ b/apps/ui-e2e/tslint.json @@ -0,0 +1 @@ +{ "extends": "../../tslint.json", "rules": {} } diff --git a/libs/ui/.storybook/addons.js b/libs/ui/.storybook/addons.js new file mode 100644 index 00000000..cc833736 --- /dev/null +++ b/libs/ui/.storybook/addons.js @@ -0,0 +1 @@ +import '../../../.storybook/addons'; diff --git a/libs/ui/.storybook/config.js b/libs/ui/.storybook/config.js new file mode 100644 index 00000000..9af1d93b --- /dev/null +++ b/libs/ui/.storybook/config.js @@ -0,0 +1,5 @@ +import { addDecorator, configure } from '@storybook/angular'; +import { withKnobs } from '@storybook/addon-knobs'; + +addDecorator(withKnobs); +configure(require.context('../src/lib', true, /\.stories\.tsx?$/), module); diff --git a/libs/ui/.storybook/preview-head.html b/libs/ui/.storybook/preview-head.html new file mode 100644 index 00000000..00d17055 --- /dev/null +++ b/libs/ui/.storybook/preview-head.html @@ -0,0 +1 @@ + diff --git a/libs/ui/.storybook/tsconfig.json b/libs/ui/.storybook/tsconfig.json new file mode 100644 index 00000000..78db4cb7 --- /dev/null +++ b/libs/ui/.storybook/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "emitDecoratorMetadata": true + }, + "exclude": ["../src/test.ts", "../**/*.spec.ts"], + "include": ["../src/**/*"] +} diff --git a/libs/ui/.storybook/webpack.config.js b/libs/ui/.storybook/webpack.config.js new file mode 100644 index 00000000..2af7749c --- /dev/null +++ b/libs/ui/.storybook/webpack.config.js @@ -0,0 +1,7 @@ +const rootWebpackConfig = require('../../../.storybook/webpack.config'); +// Export a function. Accept the base config as the only param. +module.exports = async ({ config, mode }) => { + config = await rootWebpackConfig({ config, mode }); + + return config; +}; diff --git a/libs/ui/README.md b/libs/ui/README.md index 22d83b7d..ffc54e1d 100644 --- a/libs/ui/README.md +++ b/libs/ui/README.md @@ -5,3 +5,14 @@ This library was generated with [Nx](https://nx.dev). ## Running unit tests Run `ng test ui` to execute the unit tests. + +## Storybook + +- The [Storybook](https://storybook.js.org/) was generated with + `nx g @nrwl/angular:storybook-configuration ui`. + +- Run it with `nx run ui:storybook` + +- Run E2E it with `nx run ui-e2e:e2e` + +- Watch E2E it with `nx run ui-e2e:e2e --watch` diff --git a/libs/ui/src/index.ts b/libs/ui/src/index.ts index 5793e9fa..a93155a9 100644 --- a/libs/ui/src/index.ts +++ b/libs/ui/src/index.ts @@ -2,4 +2,3 @@ export * from './lib/menu-bar'; export * from './lib/scene-viewer'; export * from './lib/sidenav-shell'; export * from './lib/toolbar'; -export * from './lib/ui.module'; diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts index 7f709fc2..6a971351 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts @@ -1,6 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { UiMenuBarModule } from '@talus/ui'; import { UiMenuBarComponent } from './menu-bar.component'; @@ -38,7 +37,7 @@ describe('UiMenuBarComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [UiMenuBarModule, BrowserAnimationsModule], + imports: [UiMenuBarModule], }).compileComponents(); })); diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts new file mode 100644 index 00000000..3f22ab02 --- /dev/null +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts @@ -0,0 +1,35 @@ +import { object } from '@storybook/addon-knobs'; +import { UiMenuBarComponent, UiMenuBarConfig } from './menu-bar.component'; +import { UiMenuBarModule } from './menu-bar.module'; + +export default { + title: 'UiMenuBarComponent', +}; + +export const primary = () => ({ + moduleMetadata: { + imports: [UiMenuBarModule], + }, + component: UiMenuBarComponent, + props: { + menuConfig: object>('menuConfig', { + menus: [ + { + label: 'Edit', + menuItems: [ + { + icon: 'undo', + label: 'Undo', + value: 'Test undo value', + }, + { + icon: 'redo', + label: 'Redo', + value: 'Test redo value', + }, + ], + }, + ], + }), + }, +}); diff --git a/libs/ui/src/lib/menu-bar/menu-bar.module.ts b/libs/ui/src/lib/menu-bar/menu-bar.module.ts index cff9cb92..79beef7a 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.module.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.module.ts @@ -1,11 +1,19 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule } from '@angular/material'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { UiMenuBarComponent } from './menu-bar.component'; @NgModule({ declarations: [UiMenuBarComponent], - imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule], + imports: [ + BrowserAnimationsModule, + CommonModule, + MatButtonModule, + MatIconModule, + MatMenuModule, + MatToolbarModule, + ], exports: [UiMenuBarComponent], }) export class UiMenuBarModule {} diff --git a/libs/ui/src/lib/ui.module.spec.ts b/libs/ui/src/lib/ui.module.spec.ts deleted file mode 100644 index a4254a82..00000000 --- a/libs/ui/src/lib/ui.module.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { async, TestBed } from '@angular/core/testing'; -import { UiModule } from './ui.module'; - -describe('UiModule', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [UiModule], - }).compileComponents(); - })); - - it('should create', () => { - expect(UiModule).toBeDefined(); - }); -}); diff --git a/libs/ui/src/lib/ui.module.ts b/libs/ui/src/lib/ui.module.ts deleted file mode 100644 index 88c95e76..00000000 --- a/libs/ui/src/lib/ui.module.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; - -@NgModule({ - imports: [CommonModule], -}) -export class UiModule {} diff --git a/libs/ui/tsconfig.lib.json b/libs/ui/tsconfig.lib.json index b5b1cccd..e4a516dd 100644 --- a/libs/ui/tsconfig.lib.json +++ b/libs/ui/tsconfig.lib.json @@ -16,5 +16,5 @@ "strictInjectionParameters": true, "enableResourceInlining": true }, - "exclude": ["src/test-setup.ts", "**/*.spec.ts"] + "exclude": ["src/test-setup.ts", "**/*.spec.ts", "**/*.stories.ts"] } diff --git a/nx.json b/nx.json index a51770ef..ac46e599 100644 --- a/nx.json +++ b/nx.json @@ -24,6 +24,10 @@ "tags": ["scope:libs"], "implicitDependencies": [] }, + "ui-e2e": { + "tags": ["scope:frontend"], + "implicitDependencies": [] + }, "vdb": { "tags": ["scope:libs"], "implicitDependencies": [] diff --git a/package.json b/package.json index 512b2fa6..20de450d 100644 --- a/package.json +++ b/package.json @@ -59,14 +59,19 @@ "@angular/cli": "8.3.22", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", + "@babel/core": "7.5.4", "@babylonjs/inspector": "4.1.0-beta.20", "@nrwl/cypress": "8.11.0", "@nrwl/jest": "8.11.0", "@nrwl/node": "8.11.0", + "@nrwl/storybook": "8.11.1", "@nrwl/workspace": "8.11.0", + "@storybook/addon-knobs": "5.3.6", + "@storybook/angular": "5.3.6", "@types/benchmark": "1.0.31", "@types/jest": "24.9.0", "@types/node": "13.1.7", + "babel-loader": "8.0.6", "babylonjs": "4.1.0-beta.20", "benchmark": "2.1.4", "codelyzer": "5.2.1", diff --git a/yarn.lock b/yarn.lock index b8e310aa..d98c7800 100644 --- a/yarn.lock +++ b/yarn.lock @@ -271,13 +271,49 @@ dependencies: tslib "^1.9.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": +"@babel/code-frame@7.5.5", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/compat-data@^7.8.0", "@babel/compat-data@^7.8.1": + version "7.8.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.1.tgz#fc0bbbb7991e4fb2b47e168e60f2cc2c41680be9" + integrity sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw== + dependencies: + browserslist "^4.8.2" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@7.5.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.4.tgz#4c32df7ad5a58e9ea27ad025c11276324e0b4ddd" + integrity sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/helpers" "^7.5.4" + "@babel/parser" "^7.5.0" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.0" + "@babel/types" "^7.5.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.5.tgz#ae1323cd035b5160293307f50647e83f8ba62f7e" @@ -329,6 +365,16 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.5.0", "@babel/generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" + integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug== + dependencies: + "@babel/types" "^7.8.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/generator@^7.7.4": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" @@ -353,6 +399,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" @@ -369,6 +422,14 @@ "@babel/helper-explode-assignable-expression" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-call-delegate@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" @@ -387,6 +448,38 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-call-delegate@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" + integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-compilation-targets@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz#2deedc816fd41dca7355ef39fd40c9ea69f0719a" + integrity sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw== + dependencies: + "@babel/compat-data" "^7.8.1" + browserslist "^4.8.2" + invariant "^2.2.4" + levenary "^1.1.0" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397" + integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/helper-create-regexp-features-plugin@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" @@ -395,6 +488,14 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.6.0" +"@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" + integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== + dependencies: + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.6.0" + "@babel/helper-define-map@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" @@ -413,6 +514,15 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" @@ -429,6 +539,14 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -447,6 +565,15 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -461,6 +588,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-hoist-variables@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" @@ -475,6 +609,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-member-expression-to-functions@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" @@ -489,6 +630,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" @@ -503,6 +651,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" @@ -527,6 +682,18 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-module-transforms@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" + integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" @@ -541,11 +708,23 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -553,6 +732,13 @@ dependencies: lodash "^4.17.13" +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" @@ -575,6 +761,17 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@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@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" @@ -595,6 +792,16 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-replace-supers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" + integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -611,6 +818,14 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" @@ -625,6 +840,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -645,6 +867,25 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.5.4": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85" + integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helpers@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" @@ -672,11 +913,25 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.5.0", "@babel/parser@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" + integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== + "@babel/parser@^7.7.4", "@babel/parser@^7.7.5": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" @@ -700,6 +955,23 @@ "@babel/helper-remap-async-to-generator" "^7.7.4" "@babel/plugin-syntax-async-generators" "^7.7.4" +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@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-class-properties@^7.7.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-dynamic-import@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" @@ -716,6 +988,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import" "^7.7.4" +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -732,6 +1012,22 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.7.4" +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" @@ -740,6 +1036,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" +"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" + integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-proposal-object-rest-spread@^7.7.4": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370" @@ -764,6 +1068,22 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" + integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" @@ -781,6 +1101,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" + integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" @@ -795,6 +1123,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" @@ -809,6 +1144,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" @@ -823,6 +1165,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" @@ -837,6 +1193,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" @@ -851,6 +1214,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-top-level-await@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" @@ -858,6 +1235,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -872,6 +1256,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-async-to-generator@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" @@ -890,6 +1281,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.7.4" +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@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@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" @@ -904,6 +1304,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-block-scoping@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" @@ -920,6 +1327,14 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + "@babel/plugin-transform-classes@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" @@ -948,6 +1363,20 @@ "@babel/helper-split-export-declaration" "^7.7.4" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" + integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== + dependencies: + "@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.3" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" @@ -962,6 +1391,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-destructuring@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" @@ -976,6 +1412,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" + integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" @@ -993,6 +1436,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-duplicate-keys@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" @@ -1007,6 +1458,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" @@ -1023,6 +1481,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-for-of@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" @@ -1037,6 +1503,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-for-of@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz#15f17bce2fc95c7d59a24b299e83e81cedc22e18" + integrity sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-function-name@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" @@ -1053,6 +1526,14 @@ "@babel/helper-function-name" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" @@ -1067,6 +1548,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-member-expression-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" @@ -1081,6 +1569,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-modules-amd@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" @@ -1099,6 +1594,15 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-amd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" + integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== + dependencies: + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-commonjs@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" @@ -1119,6 +1623,16 @@ "@babel/helper-simple-access" "^7.7.4" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-commonjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" + integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== + dependencies: + "@babel/helper-module-transforms" "^7.8.3" + "@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@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" @@ -1137,6 +1651,16 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-systemjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" + integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-umd@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" @@ -1153,6 +1677,14 @@ "@babel/helper-module-transforms" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-modules-umd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" + integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== + dependencies: + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" @@ -1167,6 +1699,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.7.4" +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" @@ -1181,6 +1720,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-object-super@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" @@ -1197,6 +1743,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.7.4" +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/plugin-transform-parameters@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" @@ -1215,6 +1769,15 @@ "@babel/helper-get-function-arity" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-parameters@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz#7890576a13b17325d8b7d44cb37f21dc3bbdda59" + integrity sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q== + dependencies: + "@babel/helper-call-delegate" "^7.8.3" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-property-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" @@ -1229,6 +1792,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-constant-elements@^7.2.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz#784c25294bddaad2323eb4ff0c9f4a3f6c87d6bc" + integrity sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" @@ -1243,6 +1821,13 @@ dependencies: regenerator-transform "^0.14.0" +"@babel/plugin-transform-regenerator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" + integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== + dependencies: + regenerator-transform "^0.14.0" + "@babel/plugin-transform-reserved-words@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" @@ -1257,6 +1842,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-shorthand-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" @@ -1271,6 +1863,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-spread@^7.2.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" @@ -1285,6 +1884,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-sticky-regex@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" @@ -1301,6 +1907,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + "@babel/plugin-transform-template-literals@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" @@ -1317,6 +1931,14 @@ "@babel/helper-annotate-as-pure" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typeof-symbol@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" @@ -1331,6 +1953,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-typeof-symbol@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz#5cffb216fb25c8c64ba6bf5f76ce49d3ab079f4d" + integrity sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-unicode-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" @@ -1348,6 +1977,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/preset-env@7.7.6": version "7.7.6" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.6.tgz#39ac600427bbb94eec6b27953f1dfa1d64d457b2" @@ -1461,6 +2098,76 @@ js-levenshtein "^1.1.3" semver "^5.5.0" +"@babel/preset-env@^7.4.5": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.3.tgz#dc0fb2938f52bbddd79b3c861a4b3427dd3a6c54" + integrity sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg== + dependencies: + "@babel/compat-data" "^7.8.0" + "@babel/helper-compilation-targets" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.8.3" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.8.3" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.8.3" + "@babel/plugin-transform-modules-commonjs" "^7.8.3" + "@babel/plugin-transform-modules-systemjs" "^7.8.3" + "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.3" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.3" + "@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.3" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/types" "^7.8.3" + browserslist "^4.8.2" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.0" + semver "^5.5.0" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/runtime@^7.6.3": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.4.tgz#b23a856751e4bf099262f867767889c0e3fe175b" @@ -1486,6 +2193,15 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/template@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" + integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" @@ -1501,6 +2217,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.5.0", "@babel/traverse@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" + integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" @@ -1525,6 +2256,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.5.0", "@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" @@ -1626,6 +2366,113 @@ debug "^3.1.0" lodash.once "^4.1.1" +"@emotion/cache@^10.0.27", "@emotion/cache@^10.0.9": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.27.tgz#7895db204e2c1a991ae33d51262a3a44f6737303" + integrity sha512-Zp8BEpbMunFsTcqAK4D7YTm3MvCp1SekflSLJH8lze2fCcSZ/yMkXHo8kb3t1/1Tdd3hAqf3Fb7z9VZ+FMiC9w== + dependencies: + "@emotion/sheet" "0.9.4" + "@emotion/stylis" "0.8.5" + "@emotion/utils" "0.11.3" + "@emotion/weak-memoize" "0.2.5" + +"@emotion/core@^10.0.20", "@emotion/core@^10.0.9": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.27.tgz#7c3f78be681ab2273f3bf11ca3e2edc4a9dd1fdc" + integrity sha512-XbD5R36pVbohQMnKfajHv43g8EbN4NHdF6Zh9zg/C0nr0jqwOw3gYnC07Xj3yG43OYSRyrGsoQ5qPwc8ycvLZw== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/cache" "^10.0.27" + "@emotion/css" "^10.0.27" + "@emotion/serialize" "^0.11.15" + "@emotion/sheet" "0.9.4" + "@emotion/utils" "0.11.3" + +"@emotion/css@^10.0.27", "@emotion/css@^10.0.9": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c" + integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== + dependencies: + "@emotion/serialize" "^0.11.15" + "@emotion/utils" "0.11.3" + babel-plugin-emotion "^10.0.27" + +"@emotion/hash@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831" + integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A== + +"@emotion/is-prop-valid@0.8.6": + version "0.8.6" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.6.tgz#4757646f0a58e9dec614c47c838e7147d88c263c" + integrity sha512-mnZMho3Sq8BfzkYYRVc8ilQTnc8U02Ytp6J1AwM6taQStZ3AhsEJBX2LzhA/LJirNCwM2VtHL3VFIZ+sNJUgUQ== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/serialize@^0.11.15": + version "0.11.15" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.15.tgz#9a0f5873fb458d87d4f23e034413c12ed60a705a" + integrity sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg== + dependencies: + "@emotion/hash" "0.7.4" + "@emotion/memoize" "0.7.4" + "@emotion/unitless" "0.7.5" + "@emotion/utils" "0.11.3" + csstype "^2.5.7" + +"@emotion/sheet@0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" + integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== + +"@emotion/styled-base@^10.0.27": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.27.tgz#d9efa307ae4e938fcc4d0596b40b7e8bc10f7c7c" + integrity sha512-ufHM/HhE3nr309hJG9jxuFt71r6aHn7p+bwXduFxcwPFEfBIqvmZUMtZ9YxIsY61PVwK3bp4G1XhaCzy9smVvw== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/is-prop-valid" "0.8.6" + "@emotion/serialize" "^0.11.15" + "@emotion/utils" "0.11.3" + +"@emotion/styled@^10.0.17": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.27.tgz#12cb67e91f7ad7431e1875b1d83a94b814133eaf" + integrity sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q== + dependencies: + "@emotion/styled-base" "^10.0.27" + babel-plugin-emotion "^10.0.27" + +"@emotion/stylis@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@emotion/utils@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" + integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== + +"@emotion/weak-memoize@0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== + +"@icons/material@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" + integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== + "@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" @@ -1774,6 +2621,14 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + "@ngrx/effects@8.6.0": version "8.6.0" resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-8.6.0.tgz#a0d7339597a5128c5cf896ddcf93f73406a45860" @@ -1808,6 +2663,11 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + "@nodelib/fs.walk@^1.2.3": version "1.2.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" @@ -1851,6 +2711,19 @@ tsconfig-paths-webpack-plugin "3.2.0" webpack-node-externals "1.7.2" +"@nrwl/cypress@8.11.1": + version "8.11.1" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-8.11.1.tgz#c9583fb35bbf718ff405a1fa3b2acbbefbd0ff4a" + integrity sha512-9zBVtTMltHfRYI3VWeEpZgHNTV587KZAVZSJIqX3R5PYbnteMIPbLBpJS44PIfp7wpKh+1ng1NSHWooGRk8hdw== + dependencies: + "@angular-devkit/architect" "0.803.14" + "@angular-devkit/core" "8.3.14" + "@cypress/webpack-preprocessor" "~4.1.0" + tree-kill "1.2.1" + ts-loader "5.3.1" + tsconfig-paths-webpack-plugin "3.2.0" + webpack-node-externals "1.7.2" + "@nrwl/jest@8.11.0": version "8.11.0" resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-8.11.0.tgz#ed02e7facc90c91bff0f6974a3d329d1e83ca9f4" @@ -1892,6 +2765,18 @@ webpack-merge "4.2.1" webpack-node-externals "1.7.2" +"@nrwl/storybook@8.11.1": + version "8.11.1" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-8.11.1.tgz#62d0c13aa7ef333ae248ea5162067459545c625f" + integrity sha512-Ebhj5mygyaZ/4g0rKRjBMnJCzX9Htwba5cvBZW9Vc7hoXPu+gVucmr+U+gbOl4KSP2oRfY5mdvt+1uQHEUGrOw== + dependencies: + "@nrwl/cypress" "8.11.1" + core-js "^3.2.1" + tree-kill "1.2.1" + ts-loader "5.3.1" + tsconfig-paths-webpack-plugin "3.2.0" + webpack-node-externals "1.7.2" + "@nrwl/tao@8.11.0": version "8.11.0" resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-8.11.0.tgz#bf03d8825cccb06a7fd7d7c498b278deda882f78" @@ -1927,6 +2812,17 @@ yargs "^11.0.0" yargs-parser "10.0.0" +"@reach/router@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.2.1.tgz#34ae3541a5ac44fa7796e5506a5d7274a162be4e" + integrity sha512-kTaX08X4g27tzIFQGRukaHmNbtMYDS3LEWIS8+l6OayGIw6Oyo1HIF/JzeuR2FoF9z6oV+x/wJSVSq4v8tcUGQ== + dependencies: + create-react-context "^0.2.1" + invariant "^2.2.3" + prop-types "^15.6.1" + react-lifecycles-compat "^3.0.4" + warning "^3.0.0" + "@schematics/angular@8.3.14": version "8.3.14" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.14.tgz#de47af1bb38cdc25d1bb9d36c5f1caf19e4e2882" @@ -1957,6 +2853,337 @@ semver "6.3.0" semver-intersect "1.4.0" +"@storybook/addon-knobs@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.6.tgz#7d989ec0305c378c73dc5ccd57b80b9caf678016" + integrity sha512-tf6W3Q94ie+HNZ9ISnM1vL6BAR8wFWEn/Ctn7yT+P8LgL28t8C7aOgkVq1Pp8QrDicWgQpmrjwKbkblSfBacBQ== + dependencies: + "@storybook/addons" "5.3.6" + "@storybook/api" "5.3.6" + "@storybook/client-api" "5.3.6" + "@storybook/components" "5.3.6" + "@storybook/core-events" "5.3.6" + "@storybook/theming" "5.3.6" + "@types/react-color" "^3.0.1" + copy-to-clipboard "^3.0.8" + core-js "^3.0.1" + escape-html "^1.0.3" + fast-deep-equal "^2.0.1" + global "^4.3.2" + lodash "^4.17.15" + prop-types "^15.7.2" + qs "^6.6.0" + react-color "^2.17.0" + react-lifecycles-compat "^3.0.4" + react-select "^3.0.8" + +"@storybook/addons@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.6.tgz#93c5492f09b54cee4885192a0fa79465aa91751f" + integrity sha512-WXsIWOO9/0ydl0C2cGwGd6qrd4L49SoXLNiErDxmjIgLXOVicylCC3JRsExcBOlvmcfPpQniBDNFTXnl6NUldw== + dependencies: + "@storybook/api" "5.3.6" + "@storybook/channels" "5.3.6" + "@storybook/client-logger" "5.3.6" + "@storybook/core-events" "5.3.6" + core-js "^3.0.1" + global "^4.3.2" + util-deprecate "^1.0.2" + +"@storybook/angular@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-5.3.6.tgz#6100ac400043781e4d51fa91393605da6cddc2c4" + integrity sha512-kKuT7eEpwg0BFcOArIGs2vz45vwCkYApGx/pdJGu7LtiP+tvaZW2IShagb8uyhL5KrEZ6CoQL6gmZrSYljLN0A== + dependencies: + "@storybook/addons" "5.3.6" + "@storybook/core" "5.3.6" + "@storybook/node-logger" "5.3.6" + core-js "^3.0.1" + fork-ts-checker-webpack-plugin "^3.0.1" + global "^4.3.2" + regenerator-runtime "^0.13.3" + sass-loader "^8.0.0" + strip-json-comments "^3.0.1" + ts-loader "^6.0.1" + tsconfig-paths-webpack-plugin "^3.2.0" + +"@storybook/api@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.6.tgz#687b58cf31994304d0262f873e611b283b6603a4" + integrity sha512-ka05nIo+KGR1kaZZUqQ0Mmn9wVgXGi7yYzfAdtdqrK2WB2xBt78pEHU00U84Qav4rk85g/U68b7tek+oE1wmUw== + dependencies: + "@reach/router" "^1.2.1" + "@storybook/channels" "5.3.6" + "@storybook/client-logger" "5.3.6" + "@storybook/core-events" "5.3.6" + "@storybook/csf" "0.0.1" + "@storybook/router" "5.3.6" + "@storybook/theming" "5.3.6" + "@types/reach__router" "^1.2.3" + core-js "^3.0.1" + fast-deep-equal "^2.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + prop-types "^15.6.2" + react "^16.8.3" + semver "^6.0.0" + shallow-equal "^1.1.0" + store2 "^2.7.1" + telejson "^3.2.0" + util-deprecate "^1.0.2" + +"@storybook/channel-postmessage@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.6.tgz#fca25bd26ad3365901e2e7941e9d39d9fa92a816" + integrity sha512-mCRc4vkIKIylu0V2T6fmTDnpIT9Gp2nEFKgG0Q7QnUlITAYdM0mhrm/5jDH1BmpbFhAvaX2EBI1GYnuS/bEa0Q== + dependencies: + "@storybook/channels" "5.3.6" + "@storybook/client-logger" "5.3.6" + core-js "^3.0.1" + global "^4.3.2" + telejson "^3.2.0" + +"@storybook/channels@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.6.tgz#ed4a504fb64829d6d1bdb2ee3d48b70a33847b73" + integrity sha512-di3BcoM/O1MR749TW7NDI5q3IXAF4Tqt73CVWOLqc/ZE4c/a70rGJ8rHbWKRfXBdJlgvEU7e82SmJz0MiW0A5Q== + dependencies: + core-js "^3.0.1" + +"@storybook/client-api@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.6.tgz#458141e85f8e564a2819b51b062bac2618821b6a" + integrity sha512-bp6MMsjprb7R1lrX4491WDaKKUItvzkh/GXU19GEOPdf490w8+dqZHisoNvVoMr6fACdiMwagxdN/+ZPHxd+Rg== + dependencies: + "@storybook/addons" "5.3.6" + "@storybook/channel-postmessage" "5.3.6" + "@storybook/channels" "5.3.6" + "@storybook/client-logger" "5.3.6" + "@storybook/core-events" "5.3.6" + "@storybook/csf" "0.0.1" + core-js "^3.0.1" + eventemitter3 "^4.0.0" + global "^4.3.2" + is-plain-object "^3.0.0" + lodash "^4.17.15" + memoizerific "^1.11.3" + qs "^6.6.0" + stable "^0.1.8" + ts-dedent "^1.1.0" + util-deprecate "^1.0.2" + +"@storybook/client-logger@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.6.tgz#d37ac813701e8a3cc1e25b6ec017808142a421a0" + integrity sha512-B9FOMLJOmqgibxfPY9yEKXZjNWoSZ9uW7tzdwTFydvcXVf3hSGdJa102w0jEGmgautRRRQOnJ1MXkVJlMnI3MQ== + dependencies: + core-js "^3.0.1" + +"@storybook/components@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.6.tgz#6fe38ac9ba62c982842bfcb06690c3f4fef8be06" + integrity sha512-9XhQyTF884XFdCdsJT2/xRTmMW2a1CBpZCHHC/Xvs85AZ9YeLcp7eDfeu72KMa7FApKH5wuh4JiY5nBgmkQShg== + dependencies: + "@storybook/client-logger" "5.3.6" + "@storybook/theming" "5.3.6" + "@types/react-syntax-highlighter" "11.0.2" + "@types/react-textarea-autosize" "^4.3.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + markdown-to-jsx "^6.9.1" + memoizerific "^1.11.3" + polished "^3.3.1" + popper.js "^1.14.7" + prop-types "^15.7.2" + react "^16.8.3" + react-dom "^16.8.3" + react-focus-lock "^2.1.0" + react-helmet-async "^1.0.2" + react-popper-tooltip "^2.8.3" + react-syntax-highlighter "^11.0.2" + react-textarea-autosize "^7.1.0" + simplebar-react "^1.0.0-alpha.6" + ts-dedent "^1.1.0" + +"@storybook/core-events@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.6.tgz#41760f8a61958cfa2a468084460da08339c74d9b" + integrity sha512-EO9fyMY9O+jjPb9tKIjh+laMy33UPcejnkKq03uv82+VymwU4O9G/FW/JHzjDM0h0ycGy07/5JLfbMtXyCXT3w== + dependencies: + core-js "^3.0.1" + +"@storybook/core@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.3.6.tgz#689073a6d92a4dbeaa23013356e1f411edcde84f" + integrity sha512-0ROrZi4VlX48/bBMywy94Er5kzktiyYttiL0A7V90PB8U6cRQE73ec8lWKlgz7uSLqBt9jHc00AWIQbNeHNRxw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.7.0" + "@babel/plugin-proposal-object-rest-spread" "^7.6.2" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-transform-react-constant-elements" "^7.2.0" + "@babel/preset-env" "^7.4.5" + "@storybook/addons" "5.3.6" + "@storybook/channel-postmessage" "5.3.6" + "@storybook/client-api" "5.3.6" + "@storybook/client-logger" "5.3.6" + "@storybook/core-events" "5.3.6" + "@storybook/csf" "0.0.1" + "@storybook/node-logger" "5.3.6" + "@storybook/router" "5.3.6" + "@storybook/theming" "5.3.6" + "@storybook/ui" "5.3.6" + airbnb-js-shims "^2.2.1" + ansi-to-html "^0.6.11" + autoprefixer "^9.7.2" + babel-plugin-add-react-displayname "^0.0.5" + babel-plugin-emotion "^10.0.20" + babel-plugin-macros "^2.7.0" + babel-preset-minify "^0.5.0 || 0.6.0-alpha.5" + boxen "^4.1.0" + case-sensitive-paths-webpack-plugin "^2.2.0" + chalk "^3.0.0" + cli-table3 "0.5.1" + commander "^4.0.1" + core-js "^3.0.1" + corejs-upgrade-webpack-plugin "^2.2.0" + css-loader "^3.0.0" + detect-port "^1.3.0" + dotenv-webpack "^1.7.0" + ejs "^2.7.4" + express "^4.17.0" + file-loader "^4.2.0" + file-system-cache "^1.0.5" + find-cache-dir "^3.0.0" + find-up "^4.1.0" + fs-extra "^8.0.1" + glob-base "^0.3.0" + global "^4.3.2" + html-webpack-plugin "^4.0.0-beta.2" + inquirer "^7.0.0" + interpret "^2.0.0" + ip "^1.1.5" + json5 "^2.1.1" + lazy-universal-dotenv "^3.0.1" + micromatch "^4.0.2" + node-fetch "^2.6.0" + open "^7.0.0" + pnp-webpack-plugin "1.5.0" + postcss-flexbugs-fixes "^4.1.0" + postcss-loader "^3.0.0" + pretty-hrtime "^1.0.3" + qs "^6.6.0" + raw-loader "^3.1.0" + react-dev-utils "^9.0.0" + regenerator-runtime "^0.13.3" + resolve "^1.11.0" + resolve-from "^5.0.0" + semver "^6.0.0" + serve-favicon "^2.5.0" + shelljs "^0.8.3" + style-loader "^1.0.0" + terser-webpack-plugin "^2.1.2" + ts-dedent "^1.1.0" + unfetch "^4.1.0" + url-loader "^2.0.1" + util-deprecate "^1.0.2" + webpack "^4.33.0" + webpack-dev-middleware "^3.7.0" + webpack-hot-middleware "^2.25.0" + webpack-virtual-modules "^0.2.0" + +"@storybook/csf@0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" + integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== + dependencies: + lodash "^4.17.15" + +"@storybook/node-logger@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.6.tgz#6fd62d46ba6972e332bf5da290f87fae971645e2" + integrity sha512-NqymsJCArX1TIAe6Hs5hS5PGI57Yrz7UqyRtPMiOoNhWVkAyFip+hGbHbA3Qe4dQCirBK0F9tSZ96Xy5wvVRNg== + dependencies: + chalk "^3.0.0" + core-js "^3.0.1" + npmlog "^4.1.2" + pretty-hrtime "^1.0.3" + regenerator-runtime "^0.13.3" + +"@storybook/router@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.6.tgz#0e2dc80070b88d550303e43c333ffdf52d1cae1b" + integrity sha512-g3gri0j2VYM0YFyERL8KGMwYbkASneOm6MZdasS6EWXdE6+piONNC5lTPk03v5Js8LJA8LPTjyNlUwfK3plJWw== + dependencies: + "@reach/router" "^1.2.1" + "@storybook/csf" "0.0.1" + "@types/reach__router" "^1.2.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + qs "^6.6.0" + util-deprecate "^1.0.2" + +"@storybook/theming@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.6.tgz#e37f5cbfbadb888e462d60c6db7cd6bc976a4767" + integrity sha512-Z7T+qyrjN2ag5/djmM5adZ6CbBKdPLHGwTgyZiKi3YWbWF1KcRTk3RgK7gtgeqqEFHA6KJsD0ubZ7kqHO2e9Sg== + dependencies: + "@emotion/core" "^10.0.20" + "@emotion/styled" "^10.0.17" + "@storybook/client-logger" "5.3.6" + core-js "^3.0.1" + deep-object-diff "^1.1.0" + emotion-theming "^10.0.19" + global "^4.3.2" + memoizerific "^1.11.3" + polished "^3.3.1" + prop-types "^15.7.2" + resolve-from "^5.0.0" + ts-dedent "^1.1.0" + +"@storybook/ui@5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.3.6.tgz#43f72ad1adf95e9b50b83f812373d5853706f72a" + integrity sha512-yYzS4zZPa3Uoc4O/IYO7GdKrkJWAuEpcrRy1FNxpSxboXm1HMomgK1Iv1+Sptoy85lRJ79d9qGzi1r/Pt1FjcQ== + dependencies: + "@emotion/core" "^10.0.20" + "@storybook/addons" "5.3.6" + "@storybook/api" "5.3.6" + "@storybook/channels" "5.3.6" + "@storybook/client-logger" "5.3.6" + "@storybook/components" "5.3.6" + "@storybook/core-events" "5.3.6" + "@storybook/router" "5.3.6" + "@storybook/theming" "5.3.6" + copy-to-clipboard "^3.0.8" + core-js "^3.0.1" + core-js-pure "^3.0.1" + emotion-theming "^10.0.19" + fast-deep-equal "^2.0.1" + fuse.js "^3.4.6" + global "^4.3.2" + lodash "^4.17.15" + markdown-to-jsx "^6.9.3" + memoizerific "^1.11.3" + polished "^3.3.1" + prop-types "^15.7.2" + qs "^6.6.0" + react "^16.8.3" + react-dom "^16.8.3" + react-draggable "^4.0.3" + react-helmet-async "^1.0.2" + react-hotkeys "2.0.0" + react-sizeme "^2.6.7" + regenerator-runtime "^0.13.2" + resolve-from "^5.0.0" + semver "^6.0.0" + store2 "^2.7.1" + telejson "^3.2.0" + util-deprecate "^1.0.2" + "@types/babel__core@^7.1.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" @@ -2014,6 +3241,16 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/history@*": + version "4.7.4" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.4.tgz#06cbceb0ace6a342a9aafcb655a688cf38f6150d" + integrity sha512-+o2igcuZA3xtOoFH56s+MCZVidwlJNcJID57DSCyawS2i910yG9vkwehCjJNZ6ImhCR5S9DbvIJKyYHcMyOfMw== + +"@types/is-function@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83" + integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -2076,6 +3313,48 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/reach__router@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.2.6.tgz#b14cf1adbd1a365d204bbf6605cd9dd7b8816c87" + integrity sha512-Oh5DAVr/L2svBvubw6QEFpXGu295Y406BPs4i9t1n2pp7M+q3pmCmhzb9oZV5wncR41KCD3NHl1Yhi7uKnTPsA== + dependencies: + "@types/history" "*" + "@types/react" "*" + +"@types/react-color@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/react-color/-/react-color-3.0.1.tgz#5433e2f503ea0e0831cbc6fd0c20f8157d93add0" + integrity sha512-J6mYm43Sid9y+OjZ7NDfJ2VVkeeuTPNVImNFITgQNXodHteKfl/t/5pAR5Z9buodZ2tCctsZjgiMlQOpfntakw== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@11.0.2": + version "11.0.2" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz#a2e3ff657d7c47813f80ca930f3d959c31ec51e3" + integrity sha512-iMNcixH8330f2dq0RY+VOXCP8JFehgmOhLOtnO85Ty+qu0fHXJNEqWx5VuFv8v0aEq0U/N9d/k1yvA+c6PEmPw== + dependencies: + "@types/react" "*" + +"@types/react-textarea-autosize@^4.3.3": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/react-textarea-autosize/-/react-textarea-autosize-4.3.5.tgz#6c4d2753fa1864c98c0b2b517f67bb1f6e4c46de" + integrity sha512-PiDL83kPMTolyZAWW3lyzO6ktooTb9tFTntVy7CA83/qFLWKLJ5bLeRboy6J6j3b1e8h2Eec6gBTEOOJRjV14A== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "16.9.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.17.tgz#58f0cc0e9ec2425d1441dd7b623421a867aa253e" + integrity sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/sizzle@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" @@ -2357,6 +3636,11 @@ acorn@^6.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -2378,6 +3662,37 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +airbnb-js-shims@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040" + integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + array.prototype.flatmap "^1.2.1" + es5-shim "^4.5.13" + es6-shim "^0.35.5" + function.prototype.name "^1.1.0" + globalthis "^1.0.0" + object.entries "^1.1.0" + object.fromentries "^2.0.0 || ^1.0.0" + object.getownpropertydescriptors "^2.0.3" + object.values "^1.1.0" + promise.allsettled "^1.0.0" + promise.prototype.finally "^3.1.0" + string.prototype.matchall "^4.0.0 || ^3.0.1" + string.prototype.padend "^3.0.0" + string.prototype.padstart "^3.0.0" + symbol.prototype.description "^1.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -2413,6 +3728,13 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -2428,7 +3750,7 @@ ansi-escapes@^1.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= -ansi-escapes@^3.0.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -2485,6 +3807,13 @@ ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +ansi-to-html@^0.6.11: + version "0.6.13" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.13.tgz#c72eae8b63e5ca0643aab11bfc6e6f2217425833" + integrity sha512-Ys2/umuaTlQvP9DLkaa7UzRKF2FLrfod/hNHXS9QhXCrw7seObG6ksOGmNz3UoK+adwM8L9vQfG7mvaxfJ3Jvw== + dependencies: + entities "^1.1.2" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2509,6 +3838,11 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +app-root-dir@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" + integrity sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg= + app-root-path@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" @@ -2582,6 +3916,15 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2604,6 +3947,33 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +array.prototype.flatmap@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" + integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + +array.prototype.map@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" + integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.4" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -2705,7 +4075,7 @@ autoprefixer@9.6.1: postcss "^7.0.17" postcss-value-parser "^4.0.0" -autoprefixer@^9.7.3: +autoprefixer@^9.7.2, autoprefixer@^9.7.3: version "9.7.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== @@ -2758,6 +4128,41 @@ babel-generator@^6.18.0: source-map "^0.5.7" trim-right "^1.0.1" +babel-helper-evaluate-path@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz#a62fa9c4e64ff7ea5cea9353174ef023a900a67c" + integrity sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA== + +babel-helper-flip-expressions@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz#3696736a128ac18bc25254b5f40a22ceb3c1d3fd" + integrity sha1-NpZzahKKwYvCUlS19AoizrPB0/0= + +babel-helper-is-nodes-equiv@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + integrity sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ= + +babel-helper-is-void-0@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz#7d9c01b4561e7b95dbda0f6eee48f5b60e67313e" + integrity sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4= + +babel-helper-mark-eval-scopes@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz#d244a3bef9844872603ffb46e22ce8acdf551562" + integrity sha1-0kSjvvmESHJgP/tG4izorN9VFWI= + +babel-helper-remove-or-void@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz#a4f03b40077a0ffe88e45d07010dee241ff5ae60" + integrity sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA= + +babel-helper-to-multiple-sequence-expressions@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz#a3f924e3561882d42fcf48907aa98f7979a4588d" + integrity sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA== + babel-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" @@ -2771,7 +4176,7 @@ babel-jest@^24.9.0: chalk "^2.4.2" slash "^2.0.0" -babel-loader@^8.0.2: +babel-loader@8.0.6, babel-loader@^8.0.2: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== @@ -2788,6 +4193,11 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-add-react-displayname@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" + integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= + babel-plugin-dynamic-import-node@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" @@ -2795,6 +4205,22 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" +babel-plugin-emotion@^10.0.20, babel-plugin-emotion@^10.0.27: + version "10.0.27" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz#59001cf5de847c1d61f2079cd906a90a00d3184f" + integrity sha512-SUNYcT4FqhOqvwv0z1oeYhqgheU8qrceLojuHyX17ngo7WtWqN5I9l3IGHzf21Xraj465CVzF4IvOlAF+3ed0A== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@emotion/hash" "0.7.4" + "@emotion/memoize" "0.7.4" + "@emotion/serialize" "^0.11.15" + babel-plugin-macros "^2.0.0" + babel-plugin-syntax-jsx "^6.18.0" + convert-source-map "^1.5.0" + escape-string-regexp "^1.0.5" + find-root "^1.1.0" + source-map "^0.5.7" + babel-plugin-istanbul@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" @@ -2812,6 +4238,155 @@ babel-plugin-jest-hoist@^24.9.0: dependencies: "@types/babel__traverse" "^7.0.6" +babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-minify-builtins@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz#31eb82ed1a0d0efdc31312f93b6e4741ce82c36b" + integrity sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag== + +babel-plugin-minify-constant-folding@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz#f84bc8dbf6a561e5e350ff95ae216b0ad5515b6e" + integrity sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ== + dependencies: + babel-helper-evaluate-path "^0.5.0" + +babel-plugin-minify-dead-code-elimination@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz#1a0c68e44be30de4976ca69ffc535e08be13683f" + integrity sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg== + dependencies: + babel-helper-evaluate-path "^0.5.0" + babel-helper-mark-eval-scopes "^0.4.3" + babel-helper-remove-or-void "^0.4.3" + lodash "^4.17.11" + +babel-plugin-minify-flip-comparisons@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz#00ca870cb8f13b45c038b3c1ebc0f227293c965a" + integrity sha1-AMqHDLjxO0XAOLPB68DyJyk8llo= + dependencies: + babel-helper-is-void-0 "^0.4.3" + +babel-plugin-minify-guarded-expressions@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz#818960f64cc08aee9d6c75bec6da974c4d621135" + integrity sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA== + dependencies: + babel-helper-evaluate-path "^0.5.0" + babel-helper-flip-expressions "^0.4.3" + +babel-plugin-minify-infinity@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz#dfb876a1b08a06576384ef3f92e653ba607b39ca" + integrity sha1-37h2obCKBldjhO8/kuZTumB7Oco= + +babel-plugin-minify-mangle-names@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz#bcddb507c91d2c99e138bd6b17a19c3c271e3fd3" + integrity sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw== + dependencies: + babel-helper-mark-eval-scopes "^0.4.3" + +babel-plugin-minify-numeric-literals@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz#8e4fd561c79f7801286ff60e8c5fd9deee93c0bc" + integrity sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw= + +babel-plugin-minify-replace@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz#d3e2c9946c9096c070efc96761ce288ec5c3f71c" + integrity sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q== + +babel-plugin-minify-simplify@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz#f21613c8b95af3450a2ca71502fdbd91793c8d6a" + integrity sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A== + dependencies: + babel-helper-evaluate-path "^0.5.0" + babel-helper-flip-expressions "^0.4.3" + babel-helper-is-nodes-equiv "^0.0.1" + babel-helper-to-multiple-sequence-expressions "^0.5.0" + +babel-plugin-minify-type-constructors@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz#1bc6f15b87f7ab1085d42b330b717657a2156500" + integrity sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA= + dependencies: + babel-helper-is-void-0 "^0.4.3" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-transform-inline-consecutive-adds@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz#323d47a3ea63a83a7ac3c811ae8e6941faf2b0d1" + integrity sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE= + +babel-plugin-transform-member-expression-literals@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" + integrity sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8= + +babel-plugin-transform-merge-sibling-variables@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" + integrity sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4= + +babel-plugin-transform-minify-booleans@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" + integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg= + +babel-plugin-transform-property-literals@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" + integrity sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk= + dependencies: + esutils "^2.0.2" + +babel-plugin-transform-regexp-constructors@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz#58b7775b63afcf33328fae9a5f88fbd4fb0b4965" + integrity sha1-WLd3W2OvzzMyj66aX4j71PsLSWU= + +babel-plugin-transform-remove-console@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" + integrity sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A= + +babel-plugin-transform-remove-debugger@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" + integrity sha1-QrcnYxyXl44estGZp67IShgznvI= + +babel-plugin-transform-remove-undefined@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz#80208b31225766c630c97fa2d288952056ea22dd" + integrity sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ== + dependencies: + babel-helper-evaluate-path "^0.5.0" + +babel-plugin-transform-simplify-comparison-operators@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" + integrity sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk= + +babel-plugin-transform-undefined-to-void@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" + integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA= + babel-preset-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" @@ -2820,6 +4395,35 @@ babel-preset-jest@^24.9.0: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^24.9.0" +"babel-preset-minify@^0.5.0 || 0.6.0-alpha.5": + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz#25f5d0bce36ec818be80338d0e594106e21eaa9f" + integrity sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg== + dependencies: + babel-plugin-minify-builtins "^0.5.0" + babel-plugin-minify-constant-folding "^0.5.0" + babel-plugin-minify-dead-code-elimination "^0.5.1" + babel-plugin-minify-flip-comparisons "^0.4.3" + babel-plugin-minify-guarded-expressions "^0.4.4" + babel-plugin-minify-infinity "^0.4.3" + babel-plugin-minify-mangle-names "^0.5.0" + babel-plugin-minify-numeric-literals "^0.4.3" + babel-plugin-minify-replace "^0.5.0" + babel-plugin-minify-simplify "^0.5.1" + babel-plugin-minify-type-constructors "^0.4.3" + babel-plugin-transform-inline-consecutive-adds "^0.4.3" + babel-plugin-transform-member-expression-literals "^6.9.4" + babel-plugin-transform-merge-sibling-variables "^6.9.4" + babel-plugin-transform-minify-booleans "^6.9.4" + babel-plugin-transform-property-literals "^6.9.4" + babel-plugin-transform-regexp-constructors "^0.4.3" + babel-plugin-transform-remove-console "^6.9.4" + babel-plugin-transform-remove-debugger "^6.9.4" + babel-plugin-transform-remove-undefined "^0.5.0" + babel-plugin-transform-simplify-comparison-operators "^6.9.4" + babel-plugin-transform-undefined-to-void "^6.9.4" + lodash "^4.17.11" + babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -2907,6 +4511,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +batch-processor@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" + integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -2947,6 +4556,11 @@ bluebird@3.5.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= +bluebird@^3.3.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: version "3.5.5" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" @@ -2985,6 +4599,25 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3092,6 +4725,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +browserslist@4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" + integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== + dependencies: + caniuse-lite "^1.0.30000989" + electron-to-chromium "^1.3.247" + node-releases "^1.1.29" + browserslist@4.8.3, browserslist@^4.8.3: version "4.8.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" @@ -3229,6 +4871,30 @@ cacache@^12.0.0, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + 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" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -3251,6 +4917,11 @@ cachedir@1.3.0: dependencies: os-homedir "^1.0.1" +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -3275,6 +4946,14 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camelcase-keys@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.1.1.tgz#0d24dde78cea4c7d2da7f4ea40b7995083328c8d" @@ -3294,6 +4973,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +can-use-dom@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" + integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= + caniuse-lite@1.0.30001019: version "1.0.30001019" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz#857e3fccaad2b2feb3f1f6d8a8f62d747ea648e1" @@ -3304,6 +4988,11 @@ caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000984: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== +caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001020: + version "1.0.30001021" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz#e75ed1ef6dbadd580ac7e7720bb16f07b083f254" + integrity sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g== + caniuse-lite@^1.0.30001015: version "1.0.30001016" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66" @@ -3314,11 +5003,6 @@ caniuse-lite@^1.0.30001017: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz#3f04c1737500ffda78be9beb0b5c1e2070e15926" integrity sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA== -caniuse-lite@^1.0.30001020: - version "1.0.30001021" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz#e75ed1ef6dbadd580ac7e7720bb16f07b083f254" - integrity sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g== - canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -3331,6 +5015,11 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" +case-sensitive-paths-webpack-plugin@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -3433,7 +5122,7 @@ chokidar@^2.0.2, chokidar@^2.1.1: optionalDependencies: fsevents "^1.2.7" -chokidar@^2.1.8: +chokidar@^2.0.4, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -3472,6 +5161,11 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== +chownr@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -3512,13 +5206,28 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@4.2.1: +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@4.2.1, clean-css@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" + integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -3526,6 +5235,13 @@ cli-cursor@^1.0.2: dependencies: restore-cursor "^1.0.1" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -3538,6 +5254,16 @@ cli-spinners@^0.1.2: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw= +cli-table3@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" @@ -3551,6 +5277,15 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +clipboard@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" + integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -3652,6 +5387,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3659,6 +5399,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz#419cd7fb3258b1ed838dc0953167a25e152f5b59" + integrity sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ== + commander@2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -3669,6 +5414,11 @@ commander@^2.11.0, commander@^2.12.1, commander@^2.18.0, commander@^2.20.0, comm resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^4.0.0, commander@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" + integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== + common-tags@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -3794,6 +5544,13 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-to-clipboard@^3.0.8: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.2.0.tgz#d2724a3ccbfed89706fac8a894872c979ac74467" + integrity sha512-eOZERzvCmxS8HWzugj4Uxl8OJxa7T2k1Gi0X5qavwydHIfuSHq2dTD09LOg/XyGq4Zpb5IsR/2OJ5lbOegz78w== + dependencies: + toggle-selection "^1.0.6" + copy-webpack-plugin@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" @@ -3828,21 +5585,52 @@ core-js-compat@^3.4.7: browserslist "^4.8.2" semver "7.0.0" +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js-pure@^3.0.1: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" + integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + core-js@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + core-js@^2.4.0: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== +core-js@^3.0.1, core-js@^3.0.4, core-js@^3.2.1: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +corejs-upgrade-webpack-plugin@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/corejs-upgrade-webpack-plugin/-/corejs-upgrade-webpack-plugin-2.2.0.tgz#503293bf1fdcb104918eb40d0294e4776ad6923a" + integrity sha512-J0QMp9GNoiw91Kj/dkIQFZeiCXgXoja/Wlht1SPybxerBWh4NCmb0pOgCv61lrlQZETwvVVfAFAA3IqoEO9aqQ== + dependencies: + resolve-from "^5.0.0" + webpack "^4.38.0" + cosmiconfig@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" @@ -3905,16 +5693,23 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= +create-react-context@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3" + integrity sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag== dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" + fbjs "^0.8.0" + gud "^1.0.0" + +create-react-context@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c" + integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw== + dependencies: + gud "^1.0.0" + warning "^4.0.3" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3925,6 +5720,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -3942,11 +5746,39 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +css-loader@^3.0.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + css-parse@1.7.x: version "1.7.0" resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs= +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + css-selector-tokenizer@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" @@ -3956,6 +5788,11 @@ css-selector-tokenizer@^0.7.1: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + cssauron@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" @@ -3985,6 +5822,11 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: dependencies: cssom "0.3.x" +csstype@^2.2.0, csstype@^2.5.7: + version "2.6.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" + integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -4067,7 +5909,7 @@ debug@*, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4116,6 +5958,18 @@ deep-equal@^1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +deep-equal@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + 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@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -4126,6 +5980,11 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-object-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a" + integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw== + deepmerge@^2.0.1: version "2.2.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" @@ -4139,7 +5998,7 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" -define-properties@^1.1.2: +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -4186,6 +6045,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -4236,6 +6100,22 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -4263,6 +6143,14 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + dir-glob@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -4297,6 +6185,20 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + dom-serializer@0: version "0.2.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" @@ -4305,6 +6207,11 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -4334,6 +6241,14 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + domutils@^1.5.1: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -4349,11 +6264,40 @@ dot-prop@^4.1.1: dependencies: is-obj "^1.0.0" -dotenv@8.2.0: +dotenv-defaults@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.0.3.tgz#434a78209f2cab07f9ec9b86b79ae7e9ca5d818b" + integrity sha512-EHeXF8VZA/XhkGJCtRpJCTHC8GkoisPXjdvJMzxgFrlN6lTEW/eksRNsVKnW0BxR1pGZH8IEBO/D0mDkIrC6fA== + dependencies: + dotenv "^6.2.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv-webpack@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz#4384d8c57ee6f405c296278c14a9f9167856d3a1" + integrity sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw== + dependencies: + dotenv-defaults "^1.0.2" + +dotenv@8.2.0, dotenv@^8.0.0: version "8.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -4377,11 +6321,21 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + electron-to-chromium@^1.3.191: version "1.3.230" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.230.tgz#2d0618cb6f724391d5fd0926dde84d6c67cbcda9" integrity sha512-r0RljY5DZi9RX4v8mjHxJkDWnQe+nsrkGlHtrDF2uvZcvAkw+iglvlQi1794gZhwRtJoDOomMJlDHL2LfXSCZA== +electron-to-chromium@^1.3.247: + version "1.3.335" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.335.tgz#5fb6084a25cb1e2542df91e62b62e1931a602303" + integrity sha512-ngKsDGd/xr2lAZvilxTfdvfEiQKmavyXd6irlswaHnewmXoz6JgbM9FUNwgp3NFIUHHegh1F87H8f5BJ8zABxw== + electron-to-chromium@^1.3.322: version "1.3.322" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" @@ -4392,6 +6346,13 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= +element-resize-detector@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.1.tgz#b0305194447a4863155e58f13323a0aef30851d1" + integrity sha512-BdFsPepnQr9fznNPF9nF4vQ457U/ZJXQDSNF1zBe7yaga8v9AdZf3/NElYxFdUh7SitSGt040QygiTo6dtatIw== + dependencies: + batch-processor "1.0.0" + elliptic@^6.0.0: version "6.5.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca" @@ -4425,6 +6386,15 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emotion-theming@^10.0.19: + version "10.0.27" + resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.27.tgz#1887baaec15199862c89b1b984b79806f2b9ab10" + integrity sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/weak-memoize" "0.2.5" + hoist-non-react-statics "^3.3.0" + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -4453,7 +6423,7 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" -entities@^1.1.1: +entities@^1.1.1, entities@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -4482,6 +6452,23 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1: + version "1.17.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.2.tgz#965b10af56597b631da15872c17a405e86c1fd46" + integrity sha512-YoKuru3Lyoy7yVTBSH2j7UxTqe/je3dWAruC0sHvZX1GNd5zX8SSLvQqEgO9b3Ex8IW+goFI9arEEsFIbulhOw== + dependencies: + 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-abstract@^1.4.3, es-abstract@^1.5.1: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" @@ -4494,6 +6481,24 @@ es-abstract@^1.4.3, es-abstract@^1.5.1: is-regex "^1.0.4" object-keys "^1.0.12" +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.0.2.tgz#bc99065aa8c98ce52bc86ab282dedbba4120e0b3" + integrity sha512-ZHb4fuNK3HKHEOvDGyHPKf5cSWh/OvAMskeM/+21NMnTuvqFvz8uHatolu+7Kf6b6oK9C+3Uo1T37pSGPWv0MA== + dependencies: + es-abstract "^1.17.0-next.1" + has-symbols "^1.0.1" + is-arguments "^1.0.4" + is-map "^2.0.0" + is-set "^2.0.0" + is-string "^1.0.4" + isarray "^2.0.5" + es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" @@ -4503,6 +6508,20 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-shim@^4.5.13: + version "4.5.13" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.13.tgz#5d88062de049f8969f83783f4a4884395f21d28b" + integrity sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw== + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -4515,12 +6534,17 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -escape-html@~1.0.3: +es6-shim@^0.35.5: + version "0.35.5" + resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" + integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== + +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -4599,6 +6623,11 @@ eventemitter3@^3.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + events@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" @@ -4712,7 +6741,7 @@ expect@^24.9.0: jest-message-util "^24.9.0" jest-regex-util "^24.9.0" -express@^4.17.1: +express@^4.17.0, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -4821,6 +6850,18 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-glob@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" @@ -4854,6 +6895,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.0" +fault@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.3.tgz#4da88cf979b6b792b4e13c7ec836767725170b7e" + integrity sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA== + dependencies: + format "^0.2.2" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -4875,6 +6923,19 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fbjs@^0.8.0: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -4902,6 +6963,13 @@ figures@^1.7.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + figures@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" @@ -4924,6 +6992,23 @@ file-loader@4.2.0: loader-utils "^1.2.3" schema-utils "^2.0.0" +file-loader@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-system-cache@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" + integrity sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08= + dependencies: + bluebird "^3.3.5" + fs-extra "^0.30.0" + ramda "^0.21.0" + filename-reserved-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" @@ -4946,6 +7031,11 @@ filenamify@^1.0.0: strip-outer "^1.0.0" trim-repeated "^1.0.0" +filesize@3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4994,20 +7084,34 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= +find-cache-dir@^3.0.0, find-cache-dir@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" + integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== dependencies: - locate-path "^2.0.0" + commondir "^1.0.1" + make-dir "^3.0.0" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^3.0.0: +find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -5038,6 +7142,11 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +focus-lock@^0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.6.tgz#98119a755a38cfdbeda0280eaa77e307eee850c7" + integrity sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw== + follow-redirects@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" @@ -5055,7 +7164,21 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-webpack-plugin@^3.1.1: +fork-ts-checker-webpack-plugin@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz#ce1d77190b44d81a761b10b6284a373795e41f0c" + integrity sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^2.0.4" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +fork-ts-checker-webpack-plugin@^3.0.1, fork-ts-checker-webpack-plugin@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== @@ -5078,6 +7201,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +format@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -5121,7 +7249,18 @@ fs-extra@6.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.1.0: +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -5137,6 +7276,13 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" +fs-minipass@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1" + integrity sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A== + dependencies: + minipass "^3.0.0" + fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -5175,6 +7321,25 @@ function-bind@^1.0.2, function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" + integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + functions-have-names "^1.2.0" + +functions-have-names@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" + integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== + +fuse.js@^3.4.6: + version "3.4.6" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.6.tgz#545c3411fed88bf2e27c457cab6e73e7af697a45" + integrity sha512-H6aJY4UpLFwxj1+5nAvufom5b2BT2v45P1MkPvdGIK8fWjQx/7o6tTT1+ALV0yawQvbmvCF0ufl2et8eJ7v7Cg== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -5252,6 +7417,21 @@ gh-pages@2.2.0: fs-extra "^8.1.0" globby "^6.1.0" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -5274,6 +7454,11 @@ glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + glob@7.0.x: version "7.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" @@ -5298,6 +7483,18 @@ glob@7.1.4, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.0: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5305,7 +7502,7 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" -global-modules@^2.0.0: +global-modules@2.0.0, global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== @@ -5321,6 +7518,14 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" +global@^4.3.2, global@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -5331,6 +7536,26 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalthis@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" + integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + dependencies: + define-properties "^1.1.3" + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + globby@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" @@ -5378,12 +7603,19 @@ gonzales-pe@^4.2.4: dependencies: minimist "1.1.x" +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.2" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== -graceful-fs@^4.2.0: +graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -5393,6 +7625,19 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + hammerjs@2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" @@ -5465,6 +7710,11 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5532,6 +7782,31 @@ hasha@5.1.0: is-stream "^2.0.0" type-fest "^0.8.0" +hast-util-parse-selector@^2.0.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.3.tgz#57edd449103900c7f63fd9e6f694ffd7e4634719" + integrity sha512-nxbeqjQNxsvo/uYYAw9kij6td05YVUlf1qti09rVfbWSLT5H6wo3c+USIwX6nzXWk5kFZzXnEqO82856r0aM2Q== + +hastscript@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.1.tgz#71726ee1e97220575d1f29a8e937387d99d48275" + integrity sha512-xHo1Hkcqd0LlWNuDL3/BxwhgAGp3d7uEvCMgCTrBY+zsOooPPH+8KAvW8PCgl+GB8H3H44nfSaF0A4BQ+4xlYg== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +highlight.js@~9.13.0: + version "9.13.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" + integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A== + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5541,6 +7816,13 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#101685d3aff3b23ea213163f6e8e12f4f111e19f" + integrity sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw== + dependencies: + react-is "^16.7.0" + hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.8.4" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546" @@ -5563,17 +7845,42 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" -html-entities@^1.2.1: +html-entities@^1.2.0, html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-minifier-terser@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz#0e67a0b062ae1dd0719fc73199479298f807ae16" + integrity sha512-VAaitmbBuHaPKv9bj47XKypRhgDxT/cDLvsPiiF7w+omrN3K0eQhpigV9Z1ilrmHa9e0rOYcD6R/+LCDADGcnQ== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^4.0.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + terser "^4.3.9" + html-tags@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -htmlparser2@^3.10.0: +html-webpack-plugin@^4.0.0-beta.2: + version "4.0.0-beta.11" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== + dependencies: + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.10.0, htmlparser2@^3.3.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -5703,6 +8010,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -5740,6 +8054,11 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -5843,6 +8162,25 @@ ini@1.3.5, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +inquirer@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" + integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + inquirer@6.5.1, inquirer@^6.3.1: version "6.5.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.1.tgz#8bfb7a5ac02dac6ff641ac4c5ff17da112fcdb42" @@ -5857,7 +8195,26 @@ inquirer@6.5.1, inquirer@^6.3.1: lodash "^4.17.15" mute-stream "0.0.8" run-async "^2.2.0" - rxjs "^6.4.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.3.tgz#f9b4cd2dff58b9f73e8d43759436ace15bed4567" + integrity sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" string-width "^4.1.0" strip-ansi "^5.1.0" through "^2.3.6" @@ -5870,7 +8227,26 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -invariant@^2.2.2, invariant@^2.2.4: +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +interpret@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.0.0.tgz#b783ffac0b8371503e9ab39561df223286aa5433" + integrity sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA== + +invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -5944,6 +8320,11 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5978,6 +8359,11 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + is-ci@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" @@ -6051,6 +8437,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6080,11 +8471,23 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-glob@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6112,6 +8515,11 @@ is-installed-globally@0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" + integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6167,6 +8575,13 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" + integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== + dependencies: + isobject "^4.0.0" + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -6179,12 +8594,29 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + is-regexp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== -is-stream@^1.1.0: +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-set@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" + integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== + +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -6194,6 +8626,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.4, is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -6201,6 +8638,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -6236,6 +8680,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6253,6 +8702,19 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6331,6 +8793,13 @@ istanbul-reports@^2.2.6: dependencies: handlebars "^4.1.2" +iterate-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.1.tgz#d2003239b4a06c91a3f8092e379f6062b03c268c" + integrity sha512-xc6jTbwPOWEdD26y41BpJBqh/w3kuEcsQxTypXD+xYQA2+OZIfemmkm725cnRbm1cHj4SMLUO1+7oIA97e88gg== + dependencies: + es-get-iterator "^1.0.1" + jasmine-marbles@0.6.0, jasmine-marbles@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.6.0.tgz#f78dc1a3bc452976de10ee8b47c73d616532a954" @@ -6872,6 +9341,20 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -6937,6 +9420,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -6952,6 +9442,17 @@ lazy-ass@1.6.0: resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= +lazy-universal-dotenv@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz#a6c8938414bca426ab8c9463940da451a911db38" + integrity sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ== + dependencies: + "@babel/runtime" "^7.5.0" + app-root-dir "^1.0.2" + core-js "^3.0.4" + dotenv "^8.0.0" + dotenv-expand "^5.1.0" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -7001,6 +9502,13 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levenary@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.0.tgz#fc146fe75f32dc483a0a2c64aef720f602cd6210" + integrity sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ== + dependencies: + leven "^3.1.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -7125,6 +9633,11 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" @@ -7140,7 +9653,7 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.memoize@4.x: +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -7155,7 +9668,12 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@4.17.15, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0: +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + +lodash@4.17.15, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -7199,13 +9717,26 @@ longest-streak@^2.0.1: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.3.tgz#3de7a3f47ee18e9074ded8575b5c091f5d0a4105" integrity sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw== -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lowlight@~1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc" + integrity sha512-xrGGN6XLL7MbTMdPD6NfWPwY43SNkjf/d0mecSx/CW36fUZTjRHEq0/Cdug3TWKtRXLWi7iMl1eP0olYxj/a4A== + dependencies: + fault "^1.0.2" + highlight.js "~9.13.0" + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -7299,6 +9830,11 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== +map-or-similar@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" + integrity sha1-beJlMXSt+12e3DPGnT6Sobdvrwg= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -7316,6 +9852,19 @@ markdown-table@^1.1.0: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== +markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.10.3.tgz#7f0946684acd321125ff2de7fd258a9b9c7c40b7" + integrity sha512-PSoUyLnW/xoW6RsxZrquSSz5eGEOTwa15H5eqp3enmrp8esmgDJmhzd6zmQ9tgAA9TxJzx1Hmf3incYU/IamoQ== + dependencies: + prop-types "^15.6.2" + unquote "^1.1.0" + +material-colors@^1.2.1: + version "1.2.6" + resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" + integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== + mathml-tag-names@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" @@ -7358,6 +9907,18 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" +memoize-one@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" + integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== + +memoizerific@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" + integrity sha1-fIekZGREwy11Q4VwkF8tvRsagFo= + dependencies: + map-or-similar "^1.5.0" + memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -7398,7 +9959,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== @@ -7432,7 +9993,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: +micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -7480,6 +10041,13 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + min-indent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" @@ -7540,6 +10108,27 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" + integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + dependencies: + minipass "^3.0.0" + minipass@^2.2.1, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -7548,6 +10137,13 @@ minipass@^2.2.1, minipass@^2.3.5: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + dependencies: + yallist "^4.0.0" + minizlib@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" @@ -7638,6 +10234,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -7694,6 +10295,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -7703,6 +10311,19 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + node-forge@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" @@ -7781,6 +10402,13 @@ node-releases@^1.1.25: dependencies: semver "^5.3.0" +node-releases@^1.1.29, node-releases@^1.1.44: + version "1.1.45" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2" + integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg== + dependencies: + semver "^6.3.0" + node-releases@^1.1.42: version "1.1.43" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.43.tgz#2c6ca237f88ce11d49631f11190bb01f8d0549f2" @@ -7788,13 +10416,6 @@ node-releases@^1.1.42: dependencies: semver "^6.3.0" -node-releases@^1.1.44: - version "1.1.45" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2" - integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg== - dependencies: - semver "^6.3.0" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -7920,7 +10541,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: +npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7930,6 +10551,13 @@ npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -7969,7 +10597,17 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.11, object-keys@^1.0.12: +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -7991,6 +10629,26 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.entries@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +"object.fromentries@^2.0.0 || ^1.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -8006,6 +10664,16 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + obliterator@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.5.0.tgz#f3535e5be192473ef59efb2d30396738f7c645c6" @@ -8040,6 +10708,13 @@ onetime@^1.0.0: resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + onetime@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" @@ -8047,13 +10722,20 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@6.4.0: +open@6.4.0, open@^6.3.0: version "6.4.0" resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== dependencies: is-wsl "^1.1.0" +open@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.0.tgz#7e52999b14eb73f90f0f0807fe93897c4ae73ec9" + integrity sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ== + dependencies: + is-wsl "^2.1.0" + opn@^5.3.0, opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -8213,6 +10895,13 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -8283,6 +10972,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +param-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8302,7 +10998,7 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-entities@^1.0.2, parse-entities@^1.1.0: +parse-entities@^1.0.2, parse-entities@^1.1.0, parse-entities@^1.1.2: version "1.2.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== @@ -8493,6 +11189,13 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" +pkg-up@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + platform@^1.3.3: version "1.3.5" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" @@ -8503,6 +11206,25 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +pnp-webpack-plugin@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz#62a1cd3068f46d564bb33c56eb250e4d586676eb" + integrity sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg== + dependencies: + ts-pnp "^1.1.2" + +polished@^3.3.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/polished/-/polished-3.4.2.tgz#b4780dad81d64df55615fbfc77acb52fd17d88cd" + integrity sha512-9Rch6iMZckABr6EFCLPZsxodeBpXMo9H4fRlfR/9VjMEyy5xpo1/WgXlJGgSjPyVhEZNycbW7UmYMNyWS5MI0g== + dependencies: + "@babel/runtime" "^7.6.3" + +popper.js@^1.14.4, popper.js@^1.14.7: + version "1.16.0" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.0.tgz#2e1816bcbbaa518ea6c2e15a466f4cb9c6e2fbb3" + integrity sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw== + portfinder@^1.0.25: version "1.0.25" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" @@ -8517,6 +11239,13 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-flexbugs-fixes@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" + integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA== + dependencies: + postcss "^7.0.0" + postcss-html@^0.36.0: version "0.36.0" resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" @@ -8556,7 +11285,7 @@ postcss-load-config@^2.0.0: cosmiconfig "^5.0.0" import-cwd "^2.0.0" -postcss-loader@3.0.0: +postcss-loader@3.0.0, postcss-loader@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== @@ -8579,6 +11308,39 @@ postcss-media-query-parser@^0.2.3: resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" + integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + postcss-reporter@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f" @@ -8625,7 +11387,7 @@ postcss-selector-parser@^3.1.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.2: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== @@ -8658,19 +11420,19 @@ postcss@7.0.17, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17 source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.21: - version "7.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1" - integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== +postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.26: - version "7.0.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" - integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== +postcss@^7.0.21: + version "7.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1" + integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -8691,6 +11453,14 @@ prettier@1.19.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +pretty-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + pretty-format@^24.0.0, pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" @@ -8701,6 +11471,25 @@ pretty-format@^24.0.0, pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +prismjs@^1.8.4: + version "1.19.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.19.0.tgz#713afbd45c3baca4b321569f2df39e17e729d4dc" + integrity sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw== + optionalDependencies: + clipboard "^2.0.0" + +prismjs@~1.17.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be" + integrity sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q== + optionalDependencies: + clipboard "^2.0.0" + private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -8729,6 +11518,26 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" +promise.allsettled@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" + integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== + dependencies: + array.prototype.map "^1.0.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + iterate-value "^1.0.0" + +promise.prototype.finally@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.2.tgz#b8af89160c9c673cefe3b4c4435b53cfd0287067" + integrity sha512-A2HuJWl2opDH0EafgdjwEw7HysI8ff/n4lW4QEVBCUXFk9QeGecBWv0Deph0UmLe3tTNYegz8MOjsVuE6SMoJA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.0" + function-bind "^1.1.1" + promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -8744,6 +11553,22 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.3" +prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-information@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.3.0.tgz#bc87ac82dc4e72a31bb62040544b1bf9653da039" + integrity sha512-IslotQn1hBCZDY7SaJ3zmCjVea219VTwmOk6Pu3z9haU9m4+T8GwaDubur+6NMHEU+Fjs/6/p66z6QULPkcL1w== + dependencies: + xtend "^4.0.1" + protoduck@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" @@ -8831,6 +11656,11 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@^6.6.0: + version "6.9.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" + integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== + qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -8849,7 +11679,7 @@ querystring-es3@^0.2.0: resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= -querystring@0.2.0: +querystring@0.2.0, querystring@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= @@ -8869,6 +11699,11 @@ ramda@0.24.1: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" integrity sha1-w7d1UZfzW43DUCIoJixMkd22uFc= +ramda@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" + integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -8899,7 +11734,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -raw-loader@3.1.0: +raw-loader@3.1.0, raw-loader@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-3.1.0.tgz#5e9d399a5a222cc0de18f42c3bc5e49677532b3f" integrity sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA== @@ -8917,11 +11752,226 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-clientside-effect@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz#6212fb0e07b204e714581dd51992603d1accc837" + integrity sha512-nRmoyxeok5PBO6ytPvSjKp9xwXg9xagoTK1mMjwnQxqM9Hd7MNPl+LS1bOSOe+CV2+4fnEquc7H/S8QD3q697A== + dependencies: + "@babel/runtime" "^7.0.0" + +react-color@^2.17.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.18.0.tgz#34956f0bac394f6c3bc01692fd695644cc775ffd" + integrity sha512-FyVeU1kQiSokWc8NPz22azl1ezLpJdUyTbWL0LPUpcuuYDrZ/Y1veOk9rRK5B3pMlyDGvTk4f4KJhlkIQNRjEA== + dependencies: + "@icons/material" "^0.2.4" + lodash "^4.17.11" + material-colors "^1.2.1" + prop-types "^15.5.10" + reactcss "^1.2.0" + tinycolor2 "^1.4.1" + +react-dev-utils@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-9.1.0.tgz#3ad2bb8848a32319d760d0a84c56c14bdaae5e81" + integrity sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg== + dependencies: + "@babel/code-frame" "7.5.5" + address "1.1.2" + browserslist "4.7.0" + chalk "2.4.2" + cross-spawn "6.0.5" + detect-port-alt "1.1.6" + escape-string-regexp "1.0.5" + filesize "3.6.1" + find-up "3.0.0" + fork-ts-checker-webpack-plugin "1.5.0" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "6.5.0" + is-root "2.1.0" + loader-utils "1.2.3" + open "^6.3.0" + pkg-up "2.0.0" + react-error-overlay "^6.0.3" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + sockjs-client "1.4.0" + strip-ansi "5.2.0" + text-table "0.2.0" + +react-dom@^16.8.3: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" + integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.18.0" + +react-draggable@^4.0.3: + version "4.2.0" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.2.0.tgz#40cc5209082ca7d613104bf6daf31372cc0e1114" + integrity sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-error-overlay@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.4.tgz#0d165d6d27488e660bc08e57bdabaad741366f7a" + integrity sha512-ueZzLmHltszTshDMwyfELDq8zOA803wQ1ZuzCccXa1m57k1PxSHfflPD5W9YIiTXLs0JTLzoj6o1LuM5N6zzNA== + +react-fast-compare@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + +react-focus-lock@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.2.1.tgz#1d12887416925dc53481914b7cedd39494a3b24a" + integrity sha512-47g0xYcCTZccdzKRGufepY8oZ3W1Qg+2hn6u9SHZ0zUB6uz/4K4xJe7yYFNZ1qT6m+2JDm82F6QgKeBTbjW4PQ== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^0.6.6" + prop-types "^15.6.2" + react-clientside-effect "^1.2.2" + use-callback-ref "^1.2.1" + use-sidecar "^1.0.1" + +react-helmet-async@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.4.tgz#079ef10b7fefcaee6240fefd150711e62463cc97" + integrity sha512-KTGHE9sz8N7+fCkZ2a3vzXH9eIkiTNhL2NhKR7XzzQl3WsGlCHh76arauJUIiGdfhjeMp7DY7PkASAmYFXeJYg== + dependencies: + "@babel/runtime" "^7.3.4" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^2.0.4" + shallowequal "^1.1.0" + +react-hotkeys@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-hotkeys/-/react-hotkeys-2.0.0.tgz#a7719c7340cbba888b0e9184f806a9ec0ac2c53f" + integrity sha512-3n3OU8vLX/pfcJrR3xJ1zlww6KS1kEJt0Whxc4FiGV+MJrQ1mYSYI3qS/11d2MJDFm8IhOXMTFQirfu6AVOF6Q== + dependencies: + prop-types "^15.6.1" + +react-input-autosize@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" + integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== + dependencies: + prop-types "^15.5.8" + +react-is@^16.7.0, react-is@^16.8.1: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + react-is@^16.8.4: version "16.9.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-popper-tooltip@^2.8.3: + version "2.10.1" + resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.10.1.tgz#e10875f31916297c694d64a677d6f8fa0a48b4d1" + integrity sha512-cib8bKiyYcrIlHo9zXx81G0XvARfL8Jt+xum709MFCgQa3HTqTi4au3iJ9tm7vi7WU7ngnqbpWkMinBOtwo+IQ== + dependencies: + "@babel/runtime" "^7.7.4" + react-popper "^1.3.6" + +react-popper@^1.3.6: + version "1.3.7" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324" + integrity sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww== + dependencies: + "@babel/runtime" "^7.1.2" + create-react-context "^0.3.0" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + +react-select@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.0.8.tgz#06ff764e29db843bcec439ef13e196865242e0c1" + integrity sha512-v9LpOhckLlRmXN5A6/mGGEft4FMrfaBFTGAnuPHcUgVId7Je42kTq9y0Z+Ye5z8/j0XDT3zUqza8gaRaI1PZIg== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/cache" "^10.0.9" + "@emotion/core" "^10.0.9" + "@emotion/css" "^10.0.9" + memoize-one "^5.0.0" + prop-types "^15.6.0" + react-input-autosize "^2.2.2" + react-transition-group "^2.2.1" + +react-sizeme@^2.6.7: + version "2.6.12" + resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.12.tgz#ed207be5476f4a85bf364e92042520499455453e" + integrity sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw== + dependencies: + element-resize-detector "^1.2.1" + invariant "^2.2.4" + shallowequal "^1.1.0" + throttle-debounce "^2.1.0" + +react-syntax-highlighter@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz#4e3f376e752b20d2f54e4c55652fd663149e4029" + integrity sha512-kqmpM2OH5OodInbEADKARwccwSQWBfZi0970l5Jhp4h39q9Q65C4frNcnd6uHE5pR00W8pOWj9HDRntj2G4Rww== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "~9.13.0" + lowlight "~1.11.0" + prismjs "^1.8.4" + refractor "^2.4.1" + +react-textarea-autosize@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.2.tgz#70fdb333ef86bcca72717e25e623e90c336e2cda" + integrity sha512-uH3ORCsCa3C6LHxExExhF4jHoXYCQwE5oECmrRsunlspaDAbS4mGKNlWZqjLfInWtFQcf0o1n1jC/NGXFdUBCg== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.6.0" + +react-transition-group@^2.2.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== + dependencies: + dom-helpers "^3.4.0" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" + +react@^16.8.3: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" + integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +reactcss@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd" + integrity sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A== + dependencies: + lodash "^4.0.1" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -9048,6 +12098,20 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -9061,6 +12125,15 @@ reflect-metadata@^0.1.2: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +refractor@^2.4.1: + version "2.10.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.0.tgz#4cc7efc0028a87924a9b31d82d129dec831a287b" + integrity sha512-maW2ClIkm9IYruuFYGTqKzj+m31heq92wlheW4h7bOstP+gf8bocmMec+j7ljLcaB1CAID85LMB3moye31jH1g== + dependencies: + hastscript "^5.0.0" + parse-entities "^1.1.2" + prismjs "~1.17.0" + regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -9073,7 +12146,7 @@ regenerate@^1.2.1, regenerate@^1.4.0: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@0.13.3, regenerator-runtime@^0.13.2: +regenerator-runtime@0.13.3, regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== @@ -9103,6 +12176,14 @@ regexp-tree@^0.1.6: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.11.tgz#c9c7f00fcf722e0a56c7390983a7a63dd6c272f3" integrity sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -9160,6 +12241,11 @@ regjsparser@^0.6.0: dependencies: jsesc "~0.5.0" +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + remark-parse@^6.0.0: version "6.0.3" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-6.0.3.tgz#c99131052809da482108413f87b0ee7f52180a3a" @@ -9215,6 +12301,17 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" @@ -9311,6 +12408,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -9350,6 +12452,13 @@ resolve@1.x, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2: dependencies: path-parse "^1.0.6" +resolve@^1.1.6, resolve@^1.11.0, resolve@^1.12.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2" + integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ== + dependencies: + path-parse "^1.0.6" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -9358,6 +12467,14 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -9400,7 +12517,7 @@ rimraf@3.0.0: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9446,7 +12563,7 @@ rxjs@6.4.0: dependencies: tslib "^1.9.0" -rxjs@6.5.4: +rxjs@6.5.4, rxjs@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== @@ -9467,6 +12584,11 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9515,6 +12637,17 @@ sass-loader@7.2.0: pify "^4.0.1" semver "^5.5.0" +sass-loader@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + sass@1.22.9: version "1.22.9" resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.9.tgz#41a2ed6038027f58be2bd5041293452a29c2cb84" @@ -9539,6 +12672,14 @@ saxes@^3.1.5: dependencies: xmlchars "^2.1.1" +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" @@ -9563,11 +12704,24 @@ schema-utils@^2.0.0, schema-utils@^2.0.1: ajv "^6.1.0" ajv-keywords "^3.1.0" +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.2.tgz#9205ec5978709b0d9edbccb9a316faf11617a017" + integrity sha512-sazKNMBX/jwrXRkOI7N6dtiTVYqzSckzol8SGuHt0lE/v3xSW6cUkOqzu6Bq2tW+dlUzq3CWIqHU3ZKauliqdg== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + selfsigned@^1.10.7: version "1.10.7" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" @@ -9638,6 +12792,17 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serve-favicon@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" + integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= + dependencies: + etag "~1.8.1" + fresh "0.5.2" + ms "2.1.1" + parseurl "~1.3.2" + safe-buffer "5.1.1" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -9676,7 +12841,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -9706,6 +12871,16 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shallow-equal@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -9718,21 +12893,63 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + shell-quote@^1.6.1: version "1.7.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.1.tgz#3161d969886fb14f9140c65245a5dd19b6f0b06b" integrity sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg== +shelljs@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +simplebar-react@^1.0.0-alpha.6: + version "1.2.3" + resolved "https://registry.yarnpkg.com/simplebar-react/-/simplebar-react-1.2.3.tgz#bd81fa9827628470e9470d06caef6ece15e1c882" + integrity sha512-1EOWJzFC7eqHUp1igD1/tb8GBv5aPQA5ZMvpeDnVkpNJ3jAuvmrL2kir3HuijlxhG7njvw9ssxjjBa89E5DrJg== + dependencies: + prop-types "^15.6.1" + simplebar "^4.2.3" + +simplebar@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/simplebar/-/simplebar-4.2.3.tgz#dac40aced299c17928329eab3d5e6e795fafc10c" + integrity sha512-9no0pK7/1y+8/oTF3sy/+kx0PjQ3uk4cYwld5F1CJGk2gx+prRyUq8GRfvcVLq5niYWSozZdX73a2wIr1o9l/g== + dependencies: + can-use-dom "^0.1.0" + core-js "^3.0.1" + lodash.debounce "^4.0.8" + lodash.memoize "^4.1.2" + lodash.throttle "^4.1.1" + resize-observer-polyfill "^1.5.1" + sisteransi@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" @@ -9929,6 +13146,11 @@ sourcemap-codec@^1.4.4: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== +space-separated-tokens@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz#27910835ae00d0adfcdbd0ad7e611fb9544351fa" + integrity sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA== + spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -10029,6 +13251,19 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" @@ -10057,6 +13292,11 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +store2@^2.7.1: + version "2.10.0" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.10.0.tgz#46b82bb91878daf1b0d56dec2f1d41e54d5103cf" + integrity sha512-tWEpK0snS2RPUq1i3R6OahfJNjWCQYNxq0+by1amCSuw0mXtymJpzmZIeYpA1UAa+7B0grCpNYIbDcd7AgTbFg== + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -10116,7 +13356,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10133,6 +13373,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.0.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string-width@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" @@ -10142,14 +13391,17 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" -string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +"string.prototype.matchall@^4.0.0 || ^3.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" string.prototype.padend@^3.0.0: version "3.0.0" @@ -10160,6 +13412,30 @@ string.prototype.padend@^3.0.0: es-abstract "^1.4.3" function-bind "^1.0.2" +string.prototype.padstart@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.0.tgz#b47c087540d0710be5a49375751a0a627bd4ff90" + integrity sha512-envqZvUp2JItI+OeQ5UAh1ihbAV5G/2bixTojvlIa090GGqF+NQRxbWb2nv9fTGrZABv6+pE6jXoAZhhS2k4Hw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -10184,6 +13460,13 @@ stringify-entities@^1.0.1: is-alphanumerical "^1.0.0" is-hexadecimal "^1.0.0" +strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -10198,13 +13481,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -10234,6 +13510,11 @@ strip-json-comments@2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + strip-outer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -10254,6 +13535,14 @@ style-loader@1.0.0: loader-utils "^1.2.3" schema-utils "^2.0.1" +style-loader@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.2.tgz#1b519c19faf548df6182b93e72ea1a4156022c2f" + integrity sha512-0Mpq1ZHFDCNq1F+6avNBgv+7q8V+mWRuzehxyJT+aKgzyN/yfKTwjYqaYwBgx+11UpQxL21zNQfzzlz+JcGURw== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.0.1" + style-search@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" @@ -10419,6 +13708,14 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +symbol.prototype.description@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.2.tgz#f325e1e6ad534b3b29c9c3ca73c136c9ce03c5e2" + integrity sha512-2CW5SU4/Ki1cYOOHcL2cXK4rxSg5hCU1TwZ7X4euKhV9VnfqKslh7T6/UyKkubA8cq2tOmsOv7m3ZUmQslBRuw== + dependencies: + es-abstract "^1.17.0-next.1" + has-symbols "^1.0.1" + table@^5.4.6: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -10447,7 +13744,26 @@ tar@^4, tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.3" -terser-webpack-plugin@1.4.3: +telejson@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-3.3.0.tgz#6d814f3c0d254d5c4770085aad063e266b56ad03" + integrity sha512-er08AylQ+LEbDLp1GRezORZu5wKOHaBczF6oYJtgC3Idv10qZ8A3p6ffT+J5BzDKkV9MqBvu8HAKiIIOp6KJ2w== + dependencies: + "@types/is-function" "^1.0.0" + global "^4.4.0" + is-function "^1.0.1" + is-regex "^1.0.4" + is-symbol "^1.0.3" + isobject "^4.0.0" + lodash "^4.17.15" + memoizerific "^1.11.3" + +term-size@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.1.tgz#f81ec25854af91a480d2f9d0c77ffcb26594ed1a" + integrity sha512-UqvQSch04R+69g4RDhrslmGvGL3ucDRX/U+snYW0Mab4uCAyKSndUksaoqlJ81QKSpRnIsuOYQCbC2ZWx2896A== + +terser-webpack-plugin@1.4.3, terser-webpack-plugin@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== @@ -10477,6 +13793,20 @@ terser-webpack-plugin@^1.4.1: webpack-sources "^1.4.0" worker-farm "^1.7.0" +terser-webpack-plugin@^2.1.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz#6d3d1b0590c8f729bfbaeb7fb2528b8b62db4c74" + integrity sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^24.9.0" + schema-utils "^2.6.1" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.4.3" + webpack-sources "^1.4.3" + terser@4.3.9: version "4.3.9" resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.9.tgz#e4be37f80553d02645668727777687dad26bbca8" @@ -10495,6 +13825,15 @@ terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" +terser@^4.3.9, terser@^4.4.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" + integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" @@ -10505,11 +13844,21 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +text-table@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= +throttle-debounce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" + integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg== + throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" @@ -10540,6 +13889,16 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tinycolor2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= + tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10606,6 +13965,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -10671,6 +14035,11 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q== +ts-dedent@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-1.1.0.tgz#67983940793183dc7c7f820acb66ba02cdc33c6e" + integrity sha512-CVCvDwMBWZKjDxpN3mU/Dx1v3k+sJgE8nrhXcC9vRopRfoa7vVzilNvHEAUi5jQnmFHpnxDx5jZdI1TpG8ny2g== + ts-jest@24.3.0: version "24.3.0" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.3.0.tgz#b97814e3eab359ea840a1ac112deae68aa440869" @@ -10724,6 +14093,17 @@ ts-loader@5.4.5: micromatch "^3.1.4" semver "^5.0.1" +ts-loader@^6.0.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" + integrity sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + ts-node@8.6.2: version "8.6.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.6.2.tgz#7419a01391a818fbafa6f826a33c1a13e9464e35" @@ -10735,7 +14115,12 @@ ts-node@8.6.2: source-map-support "^0.5.6" yn "3.1.1" -tsconfig-paths-webpack-plugin@3.2.0: +ts-pnp@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec" + integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA== + +tsconfig-paths-webpack-plugin@3.2.0, tsconfig-paths-webpack-plugin@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.2.0.tgz#6e70bd42915ad0efb64d3385163f0c1270f3e04d" integrity sha512-S/gOOPOkV8rIL4LurZ1vUdYCVgo15iX9ZMJ6wx6w2OgcpT/G4wMyHB6WM+xheSqGMrWKuxFul+aXpCju3wmj/g== @@ -10755,7 +14140,7 @@ tsconfig-paths@^3.4.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@1.10.0, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@1.10.0, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== @@ -10833,6 +14218,11 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -10850,6 +14240,11 @@ typescript@3.5.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== +ua-parser-js@^0.7.18: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + uglify-js@^3.1.4: version "3.6.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" @@ -10858,6 +14253,11 @@ uglify-js@^3.1.4: commander "~2.20.0" source-map "~0.6.1" +unfetch@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db" + integrity sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg== + unherit@^1.0.4: version "1.1.2" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.2.tgz#14f1f397253ee4ec95cec167762e77df83678449" @@ -10989,6 +14389,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -11007,6 +14412,11 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -11019,6 +14429,15 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-loader@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + url-parse@^1.4.3: version "1.4.7" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" @@ -11035,12 +14454,25 @@ url@0.11.0, url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-callback-ref@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.1.tgz#898759ccb9e14be6c7a860abafa3ffbd826c89bb" + integrity sha512-C3nvxh0ZpaOxs9RCnWwAJ+7bJPwQI8LHF71LzbQ3BvzH5XkdtlkMadqElGevg5bYBDFip4sAnD4m06zAKebg1w== + +use-sidecar@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.2.tgz#e72f582a75842f7de4ef8becd6235a4720ad8af6" + integrity sha512-287RZny6m5KNMTb/Kq9gmjafi7lQL0YHO1lYolU6+tY1h9+Z3uCtkJJ3OSOq3INwYf2hBryCcDh4520AhJibMA== + dependencies: + detect-node "^2.0.4" + tslib "^1.9.3" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -11052,7 +14484,7 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" -util.promisify@^1.0.0: +util.promisify@1.0.0, util.promisify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -11074,6 +14506,11 @@ util@^0.11.0: dependencies: inherits "2.0.3" +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -11173,6 +14610,20 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -11202,7 +14653,7 @@ webpack-core@^0.6.8: source-list-map "~0.1.7" source-map "~0.4.1" -webpack-dev-middleware@3.7.2, webpack-dev-middleware@^3.7.2: +webpack-dev-middleware@3.7.2, webpack-dev-middleware@^3.7.0, webpack-dev-middleware@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== @@ -11252,6 +14703,16 @@ webpack-dev-server@3.9.0: ws "^6.2.1" yargs "12.0.5" +webpack-hot-middleware@^2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz#4528a0a63ec37f8f8ef565cf9e534d57d09fe706" + integrity sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA== + dependencies: + ansi-html "0.0.7" + html-entities "^1.2.0" + querystring "^0.2.0" + strip-ansi "^3.0.0" + webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -11272,7 +14733,7 @@ webpack-node-externals@1.7.2: resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz#6e1ee79ac67c070402ba700ef033a9b8d52ac4e3" integrity sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg== -webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: +webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -11287,6 +14748,13 @@ webpack-subresource-integrity@1.1.0-rc.6: dependencies: webpack-core "^0.6.8" +webpack-virtual-modules@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.1.tgz#8ab73d4df0fd37ed27bb8d823bc60ea7266c8bf7" + integrity sha512-0PWBlxyt4uGDofooIEanWhhyBOHdd+lr7QpYNDLC7/yc5lqJT8zlc04MTIBnKj+c2BlQNNuwE5er/Tg4wowHzA== + dependencies: + debug "^3.0.0" + webpack@4.39.2: version "4.39.2" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.39.2.tgz#c9aa5c1776d7c309d1b3911764f0288c8c2816aa" @@ -11345,6 +14813,35 @@ webpack@4.41.2: watchpack "^1.6.0" webpack-sources "^1.4.1" +webpack@^4.33.0, webpack@^4.38.0: + version "4.41.5" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" + integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + 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.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + websocket-driver@>=0.5.1: version "0.7.3" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" @@ -11366,6 +14863,11 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" +whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" @@ -11413,6 +14915,13 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -11551,6 +15060,11 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" From de8f7f784c0e8a73eb73684b093f117fe476f225 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Fri, 17 Jan 2020 18:25:28 +0100 Subject: [PATCH 69/84] ci(storybook): run, build & deploy storybook for `ui-e2e` (#17) * ci(storybook): build storybook * ci(storybook): move `frontend e2e` step down * ci(storybook): store storybook & deploy to gh-pages * ci(storybook): extract git(hub) configs * ci(storybook): extract deploy to gh-pages * ci(storybook): change to `test-results` folder & use `junit` reporter * ci(storybook): run `ui-e2e` and store test-results & artifacts * ci(storybook): run `ui-e2e` only on `master` & `develop` --- .circleci/config.yml | 213 +++++++++++++++++++++++++++++---------- apps/ui-e2e/cypress.json | 11 +- libs/ui/README.md | 2 + 3 files changed, 172 insertions(+), 54 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d271bbd8..8e553d40 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,9 +28,54 @@ aliases: attach_workspace: at: *workspace + - &configure_git_user + run: + name: Configure Git user + command: | + git config user.email 'morier.dev@outlook.com' + git config user.name 'Circle CI' + + - &add_github_ssh_key + add_ssh_keys: + fingerprints: + - '6b:2b:a3:64:1d:a3:5c:b6:03:7a:b7:b9:39:10:8f:43' + + - &add_github_to_known_hosts + run: + name: Add github.com to known hosts + command: + echo 'github.com ssh-rsa + AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==' + >> ~/.ssh/known_hosts + + - &prepare_github_pages_variables + run: + name: Prepare github pages variables + command: | + echo 'export LAST_COMMIT_HASH_SHORT=$(echo $CIRCLE_SHA1 | cut -c1-7)' >> $BASH_ENV + + echo 'export COMMIT_MESSAGE="[skip ci] Deploy: $DEPLOY_CONTEXT (#$LAST_COMMIT_HASH_SHORT)"' >> $BASH_ENV + echo 'export DIST_PATH="dist/$DEPLOY_CONTEXT"' >> $BASH_ENV + echo 'export DEST_PATH="$CIRCLE_BRANCH/$LAST_COMMIT_HASH_SHORT"' >> $BASH_ENV + + - &deploy_to_github_pages + run: + name: Deploy to Github pages + command: | + yarn gh-pages \ + --dotfiles \ + --message "$COMMIT_MESSAGE" \ + --dist "$DIST_PATH" \ + --dest "$DEST_PATH" + + - &log_deploy_url + run: + name: Log deploy URL + command: echo 'https://philippemorier.github.io/talus/'$DEST_PATH'/'$PROJECT_NAME'/' + - &store_test_results store_test_results: - path: ./projects/editor/reports/test-results + path: ./test-results version: 2 @@ -88,8 +133,7 @@ jobs: - run: name: Run prettier - command: | - yarn prettier:check + command: yarn prettier:check 'unit': <<: *use_docker_node_browsers @@ -103,14 +147,31 @@ jobs: name: Run unit tests command: yarn test:code-coverage - - store_test_results: - path: ./test-results + - *store_test_results - store_artifacts: path: ./coverage destination: coverage - 'frontend-e2e': + 'benchmark': + <<: *use_docker_node_browsers + + <<: *set_working_directory + + steps: + - *attach_workspace + + - run: + name: Build benchmarks + command: yarn build benchmark + + - run: + name: Run benchmarks + command: node ./dist/apps/benchmark/main.js + + - *store_test_results + + 'frontend e2e': <<: *use_docker_cypress_included <<: *set_working_directory @@ -122,15 +183,14 @@ jobs: name: Run frontend-e2e command: yarn e2e:ci frontend-e2e - - store_test_results: - path: ./test-results + - *store_test_results - store_artifacts: path: ./test-results/cypress destination: cypress - 'benchmark': - <<: *use_docker_node_browsers + 'ui e2e': + <<: *use_docker_cypress_included <<: *set_working_directory @@ -138,17 +198,16 @@ jobs: - *attach_workspace - run: - name: Build benchmarks - command: yarn build benchmark + name: Run ui-e2e + command: yarn ng run ui-e2e:e2e --headless - - run: - name: Run benchmarks - command: node ./dist/apps/benchmark/main.js + - *store_test_results - - store_test_results: - path: ./test-results + - store_artifacts: + path: ./test-results/cypress + destination: cypress - 'build': + 'frontend build': <<: *use_docker_node <<: *set_working_directory @@ -193,29 +252,38 @@ jobs: root: . paths: dist/apps/frontend - # https://circleci.com/blog/deploying-documentation-to-github-pages-with-continuous-integration/ - 'deploy': + 'ui build': <<: *use_docker_node + <<: *set_working_directory + steps: - *attach_workspace - run: - name: Configure Git user - command: | - git config user.email 'morier.dev@outlook.com' - git config user.name 'Circle CI' + name: Build storybook + command: yarn ng run ui:build-storybook - - add_ssh_keys: - fingerprints: - - '6b:2b:a3:64:1d:a3:5c:b6:03:7a:b7:b9:39:10:8f:43' + - store_artifacts: + path: ./dist/storybook/ui + destination: dist/storybook/ui - - run: - name: Add github.com to known hosts - command: - echo 'github.com ssh-rsa - AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==' - >> ~/.ssh/known_hosts + - persist_to_workspace: + root: . + paths: dist/storybook/ui + + # https://circleci.com/blog/deploying-documentation-to-github-pages-with-continuous-integration/ + 'frontend deploy': + <<: *use_docker_node + <<: *set_working_directory + steps: + - *attach_workspace + + - *configure_git_user + + - *add_github_ssh_key + + - *add_github_to_known_hosts - run: name: Delete CircleCI index @@ -226,25 +294,40 @@ jobs: command: mv dist/apps/frontend/index-github.html dist/apps/frontend/index.html - run: - name: Prepare deployment variables + name: Set deploy context & project variables command: | - echo 'export LAST_COMMIT_HASH_SHORT=$(echo $CIRCLE_SHA1 | cut -c1-7)' >> $BASH_ENV + echo 'export DEPLOY_CONTEXT="apps"' >> $BASH_ENV + echo 'export PROJECT_NAME="frontend"' >> $BASH_ENV + + - *prepare_github_pages_variables + + - *deploy_to_github_pages + + - *log_deploy_url + + 'ui deploy': + <<: *use_docker_node + <<: *set_working_directory + steps: + - *attach_workspace + + - *configure_git_user + + - *add_github_ssh_key - echo 'export COMMIT_MESSAGE="[skip ci] Deploy: apps (#$LAST_COMMIT_HASH_SHORT)"' >> $BASH_ENV - echo 'export DEST_PATH="$CIRCLE_BRANCH/$LAST_COMMIT_HASH_SHORT"' >> $BASH_ENV + - *add_github_to_known_hosts - run: - name: Deploy to Github pages + name: Set deploy context & project variables command: | - yarn gh-pages \ - --dotfiles \ - --message "$COMMIT_MESSAGE" \ - --dist dist/apps \ - --dest "$DEST_PATH" + echo 'export DEPLOY_CONTEXT="storybook"' >> $BASH_ENV + echo 'export PROJECT_NAME="ui"' >> $BASH_ENV - - run: - name: Log deploy URL - command: echo 'https://philippemorier.github.io/talus/'$DEST_PATH'/frontend/' + - *prepare_github_pages_variables + + - *deploy_to_github_pages + + - *log_deploy_url workflows: version: 2 @@ -268,24 +351,50 @@ workflows: requires: - 'dependencies' - - 'build': + - 'frontend build': + requires: + - 'linting' + - 'prettier' + - 'unit' + - 'benchmark' + + - 'frontend e2e': requires: - 'linting' - 'prettier' - 'unit' - 'benchmark' - - 'frontend-e2e': + - 'ui build': requires: - 'linting' - 'prettier' - 'unit' - 'benchmark' - - 'deploy': + - 'ui e2e': + requires: + - 'linting' + - 'prettier' + - 'unit' + - 'benchmark' + + - 'frontend deploy': + requires: + - 'frontend build' + - 'frontend e2e' + filters: + branches: + only: + - master + - develop + + - 'ui deploy': requires: - - 'build' - - 'frontend-e2e' + - 'ui build' + - 'ui e2e' filters: branches: - only: master + only: + - master + - develop diff --git a/apps/ui-e2e/cypress.json b/apps/ui-e2e/cypress.json index 356a6fe2..4623a992 100644 --- a/apps/ui-e2e/cypress.json +++ b/apps/ui-e2e/cypress.json @@ -6,8 +6,15 @@ "integrationFolder": "./src/integration", "modifyObstructiveCode": false, "pluginsFile": "./src/plugins/index", - "screenshotsFolder": "../../dist/cypress/apps/ui-e2e/screenshots", + "reporter": "junit", + "reporterOptions": { + "jenkinsMode": true, + "mochaFile": "../../test-results/mocha/apps-ui-e2e.[hash].junit.xml", + "testCaseSwitchClassnameAndName": true, + "toConsole": true + }, + "screenshotsFolder": "../../test-results/cypress/apps/ui-e2e/screenshots", "supportFile": "./src/support/index.ts", "video": true, - "videosFolder": "../../dist/cypress/apps/ui-e2e/videos" + "videosFolder": "../../test-results/cypress/apps/ui-e2e/videos" } diff --git a/libs/ui/README.md b/libs/ui/README.md index ffc54e1d..d2094bd6 100644 --- a/libs/ui/README.md +++ b/libs/ui/README.md @@ -13,6 +13,8 @@ Run `ng test ui` to execute the unit tests. - Run it with `nx run ui:storybook` +- Build it with `nx run ui:build-storybook` + - Run E2E it with `nx run ui-e2e:e2e` - Watch E2E it with `nx run ui-e2e:e2e --watch` From 03a4ee24e2f8fa5a1ac8171223837cc287c24d15 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Fri, 17 Jan 2020 18:47:01 +0100 Subject: [PATCH 70/84] fix(ui): to high/large canvas by setting `display: block;` --- libs/ui/src/lib/scene-viewer/scene-viewer.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss b/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss index 5a6bfab9..d132385d 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.component.scss @@ -1,4 +1,5 @@ canvas { + display: block; // otherwise canvas is 4px too high height: 100%; width: 100%; } From d7a15faa506fd60fe9ac4ff70930071016948bbc Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Mon, 20 Jan 2020 11:28:34 +0100 Subject: [PATCH 71/84] feat(frontend): paint voxel (#18) * feat(frontend): dispatch paint-voxel action * feat(frontend): set voxel on paint * feat(frontend): finish renaming `addVoxel` to `setVoxel` * feat(frontend): save old/new values and undo/redo painting * refactor(frontend): s/positions/coord * refactor(frontend): fix prettier issue --- .../scene-viewer-container/grid.service.ts | 37 +++++++++----- .../scene-viewer-container.actions.ts | 35 ++++++++----- .../scene-viewer-container.component.spec.ts | 12 ++--- .../scene-viewer-container.component.ts | 19 ++++--- .../scene-viewer-container.effects.ts | 50 ++++++++++++------- .../scene-viewer-container.reducer.spec.ts | 13 ++--- .../scene-viewer-container.reducer.ts | 4 +- .../src/app/tools-panel/tool.model.ts | 3 +- .../app/tools-panel/tools-panel.component.ts | 9 +++- .../tools-panel/tools-panel.reducer.spec.ts | 4 +- .../app/tools-panel/tools-panel.reducer.ts | 2 +- .../src/app/undo-redo/undo-redo.effects.ts | 35 +++++++++---- .../app/undo-redo/undo-redo.reducer.spec.ts | 15 +++--- 13 files changed, 149 insertions(+), 89 deletions(-) diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index 4fda072e..13fd43dd 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -24,28 +24,31 @@ export class GridService { }; /** - * Adds a new voxel via accessor to share access path. + * Sets a new voxel via accessor to share access path. * @returns origin of `InternalNode1` of affected node (node containing added voxel). */ - addVoxel(xyz: Coord, value: number): VoxelChange { - this.accessor.setValueOn(xyz, value); + setVoxel(xyz: Coord, newValue: number): VoxelChange { + const oldValue = this.accessor.getValue(xyz); + + this.accessor.setValueOn(xyz, newValue); return { affectedNodeOrigin: this.accessor.internalNode1Origin, - value, - position: xyz, + newValue, + oldValue, + xyz, }; } - addVoxels(coords: Coord[], values: number[]): VoxelChange[] { + setVoxels(coords: Coord[], newValues: number[]): VoxelChange[] { const changes = new Map(); - if (coords.length !== values.length) { - throw new Error(`Coordinates and values don't have the same length.`); + if (coords.length !== newValues.length) { + throw new Error(`Coordinates and new values don't have the same length.`); } coords.forEach((xyz, i) => { - const change = this.addVoxel(xyz, values[i]); + const change = this.setVoxel(xyz, newValues[i]); changes.set(change.affectedNodeOrigin.toString(), change); }); @@ -53,15 +56,22 @@ export class GridService { } removeVoxel(xyz: Coord): VoxelChange { + const oldValue = this.accessor.getValue(xyz); + this.accessor.setActiveState(xyz, false); return { affectedNodeOrigin: this.accessor.internalNode1Origin, - value: this.accessor.getValue(xyz), - position: xyz, + oldValue, + newValue: oldValue, + xyz, }; } + paintVoxel(xyz: Coord, newValue: number): VoxelChange { + return this.setVoxel(xyz, newValue); + } + computeInternalNode1Mesh(origin: Coord): MeshData | undefined { const internal1 = this.accessor.probeInternalNode1(origin); @@ -79,6 +89,7 @@ export class GridService { export interface VoxelChange { affectedNodeOrigin: Coord; - value: number; - position: Coord; + newValue: number; + oldValue: number; + xyz: Coord; } diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts index 5154e280..dad12b71 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.actions.ts @@ -4,26 +4,37 @@ import { VoxelChange } from './grid.service'; const actionTypePrefix = `[sceneViewerContainer]`; -export const addVoxel = createAction( - `${actionTypePrefix} Add voxel`, - props<{ position: Coord; value: number }>(), +// Set voxel +export const setVoxel = createAction( + `${actionTypePrefix} Set voxel`, + props<{ xyz: Coord; newValue: number }>(), ); -export const addVoxelFailed = createAction(`${actionTypePrefix} Add voxel failed`); -export const voxelAdded = createAction(`${actionTypePrefix} Voxel added`, props()); +export const setVoxelFailed = createAction(`${actionTypePrefix} Set voxel failed`); +export const voxelSet = createAction(`${actionTypePrefix} Voxel set`, props()); -export const addVoxels = createAction( - `${actionTypePrefix} Add voxels`, - props<{ positions: Coord[]; values: number[] }>(), +// Set voxels +export const setVoxels = createAction( + `${actionTypePrefix} Set voxels`, + props<{ coords: Coord[]; newValues: number[] }>(), ); -export const addVoxelsFailed = createAction(`${actionTypePrefix} Add voxels failed`); -export const voxelsAdded = createAction( - `${actionTypePrefix} Voxels added`, +export const setVoxelsFailed = createAction(`${actionTypePrefix} Set voxels failed`); +export const voxelsSet = createAction( + `${actionTypePrefix} Voxels set`, props<{ voxelChanges: VoxelChange[] }>(), ); +// Remove voxel export const removeVoxel = createAction( `${actionTypePrefix} Remove voxel`, - props<{ position: Coord }>(), + props<{ xyz: Coord }>(), ); export const removeVoxelFailed = createAction(`${actionTypePrefix} Remove voxel failed`); export const voxelRemoved = createAction(`${actionTypePrefix} Voxel removed`, props()); + +// Paint voxel +export const paintVoxel = createAction( + `${actionTypePrefix} Paint voxel`, + props<{ xyz: Coord; newValue: number }>(), +); +export const paintVoxelFailed = createAction(`${actionTypePrefix} Paint voxel failed`); +export const voxelPainted = createAction(`${actionTypePrefix} Voxel painted`, props()); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index d3da561d..ef00469c 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -8,7 +8,7 @@ import { Coord } from '@talus/vdb'; import { Subject } from 'rxjs'; import * as fromApp from '../app.reducer'; import { Tool } from '../tools-panel/tool.model'; -import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; +import { removeVoxel, setVoxel } from './scene-viewer-container.actions'; import { SceneViewerContainerComponent } from './scene-viewer-container.component'; @Component({ @@ -39,7 +39,7 @@ describe('SceneViewerContainerComponent', () => { mockSelectedToolIdSelector = mockStore.overrideSelector( fromApp.selectSelectedToolId, - Tool.AddVoxel, + Tool.SetVoxel, ); })); @@ -115,10 +115,10 @@ describe('SceneViewerContainerComponent', () => { [0, 0, 1], ], ])( - 'should dispatch `addVoxel` action for %j', + 'should dispatch `setVoxel` action for %j', (pickedPoint: Coord, position: Coord, normal: Coord) => { - const initialAction = addVoxel({ position: [0, 0, 0], value: 42 }); - const action = addVoxel({ position, value: 1 }); + const initialAction = setVoxel({ xyz: [0, 0, 0], newValue: 42 }); + const action = setVoxel({ xyz: position, newValue: 1 }); stubComponent.pointerPick.next({ pickedPoint, @@ -174,7 +174,7 @@ describe('SceneViewerContainerComponent', () => { mockStore.refreshState(); fixture.detectChanges(); - const action = removeVoxel({ position }); + const action = removeVoxel({ xyz: position }); stubComponent.pointerPick.next({ pickedPoint, diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index 179cbf63..6a25e96f 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -7,7 +7,7 @@ import { Coord } from '@talus/vdb'; import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; import { Tool } from '../tools-panel/tool.model'; -import { addVoxel, removeVoxel } from './scene-viewer-container.actions'; +import { paintVoxel, removeVoxel, setVoxel } from './scene-viewer-container.actions'; @Component({ selector: 'fe-scene-viewer-container', @@ -29,7 +29,7 @@ export class SceneViewerContainerComponent implements AfterViewInit { constructor(private store: Store) {} ngAfterViewInit(): void { - this.store.dispatch(addVoxel({ position: [0, 0, 0], value: 42 })); + this.store.dispatch(setVoxel({ xyz: [0, 0, 0], newValue: 42 })); } onPointerPick(event: UiPointerPickInfo, selectedToolId: Tool): void { @@ -47,13 +47,16 @@ export class SceneViewerContainerComponent implements AfterViewInit { } switch (selectedToolId) { - case Tool.AddVoxel: - this.store.dispatch( - addVoxel({ position: this.calcVoxelToAddPosition(pickInfo), value: 1 }), - ); + case Tool.SetVoxel: + this.store.dispatch(setVoxel({ xyz: this.calcVoxelToAddPosition(pickInfo), newValue: 1 })); break; case Tool.RemoveVoxel: - this.store.dispatch(removeVoxel({ position: this.calcVoxelToRemovePosition(pickInfo) })); + this.store.dispatch(removeVoxel({ xyz: this.calcClickedVoxelPosition(pickInfo) })); + break; + case Tool.PaintVoxel: + this.store.dispatch( + paintVoxel({ xyz: this.calcClickedVoxelPosition(pickInfo), newValue: 4 }), + ); break; } } @@ -80,7 +83,7 @@ export class SceneViewerContainerComponent implements AfterViewInit { return newPoint; } - private calcVoxelToRemovePosition(pickInfo: UiPointerPickInfo): Coord { + private calcClickedVoxelPosition(pickInfo: UiPointerPickInfo): Coord { const pickedIntegerPoint = this.roundDimensionAlongNormal(pickInfo); const newPoint: Coord = [ diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts index 03c7fe79..4885f4d1 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.effects.ts @@ -6,15 +6,18 @@ import { of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { GridService } from './grid.service'; import { - addVoxel, - addVoxelFailed, - addVoxels, - addVoxelsFailed, + paintVoxel, + paintVoxelFailed, removeVoxel, removeVoxelFailed, - voxelAdded, + setVoxel, + setVoxelFailed, + setVoxels, + setVoxelsFailed, + voxelPainted, voxelRemoved, - voxelsAdded, + voxelSet, + voxelsSet, } from './scene-viewer-container.actions'; @Injectable() @@ -25,37 +28,46 @@ export class SceneViewerContainerEffects { private sceneViewerService: UiSceneViewerService, ) {} - addVoxel$ = createEffect(() => + setVoxel$ = createEffect(() => this.actions$.pipe( - ofType(addVoxel), - map(({ position, value }) => this.gridService.addVoxel(position, value)), - map(voxelAdded), - catchError(() => of(addVoxelFailed())), + ofType(setVoxel), + map(({ xyz, newValue }) => this.gridService.setVoxel(xyz, newValue)), + map(voxelSet), + catchError(() => of(setVoxelFailed())), ), ); - addVoxels$ = createEffect(() => + setVoxels$ = createEffect(() => this.actions$.pipe( - ofType(addVoxels), - map(({ positions, values }) => this.gridService.addVoxels(positions, values)), - map(voxelChanges => voxelsAdded({ voxelChanges })), - catchError(() => of(addVoxelsFailed())), + ofType(setVoxels), + map(({ coords, newValues }) => this.gridService.setVoxels(coords, newValues)), + map(voxelChanges => voxelsSet({ voxelChanges })), + catchError(() => of(setVoxelsFailed())), ), ); removeVoxel$ = createEffect(() => this.actions$.pipe( ofType(removeVoxel), - map(({ position }) => this.gridService.removeVoxel(position)), + map(({ xyz }) => this.gridService.removeVoxel(xyz)), map(voxelRemoved), catchError(() => of(removeVoxelFailed())), ), ); + paintVoxel$ = createEffect(() => + this.actions$.pipe( + ofType(paintVoxel), + map(({ xyz, newValue }) => this.gridService.paintVoxel(xyz, newValue)), + map(voxelPainted), + catchError(() => of(paintVoxelFailed())), + ), + ); + updateGridMesh$ = createEffect( () => this.actions$.pipe( - ofType(voxelAdded, voxelRemoved), + ofType(voxelSet, voxelRemoved, voxelPainted), map(({ affectedNodeOrigin }) => this.computeAndUpdateNodeMesh(affectedNodeOrigin)), ), { dispatch: false }, @@ -64,7 +76,7 @@ export class SceneViewerContainerEffects { updateGridMeshMultiple$ = createEffect( () => this.actions$.pipe( - ofType(voxelsAdded), + ofType(voxelsSet), map(({ voxelChanges }) => voxelChanges.map(change => { this.computeAndUpdateNodeMesh(change.affectedNodeOrigin); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts index b8f51290..f4388056 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.spec.ts @@ -1,29 +1,30 @@ import { VoxelChange } from './grid.service'; -import { voxelAdded, voxelRemoved } from './scene-viewer-container.actions'; +import { voxelRemoved, voxelSet } from './scene-viewer-container.actions'; import { reducer, selectVoxelCount } from './scene-viewer-container.reducer'; describe('SceneViewerContainerReducer', () => { const voxelChange: VoxelChange = { - position: [0, 0, 0], + xyz: [0, 0, 0], affectedNodeOrigin: [0, 0, 0], - value: 42, + oldValue: 24, + newValue: 42, }; it('should increment counter', () => { - const stateWithOneVoxel = reducer(undefined, voxelAdded(voxelChange)); + const stateWithOneVoxel = reducer(undefined, voxelSet(voxelChange)); expect(stateWithOneVoxel.voxelCount).toEqual(1); }); it('should decrement counter', () => { - const stateWithOneVoxel = reducer(undefined, voxelAdded(voxelChange)); + const stateWithOneVoxel = reducer(undefined, voxelSet(voxelChange)); const stateWithNoVoxel = reducer(stateWithOneVoxel, voxelRemoved(voxelChange)); expect(stateWithNoVoxel.voxelCount).toEqual(0); }); it('should select voxel count', () => { - const stateWithOneVoxel = reducer(undefined, voxelAdded(voxelChange)); + const stateWithOneVoxel = reducer(undefined, voxelSet(voxelChange)); expect(selectVoxelCount(stateWithOneVoxel)).toEqual(1); }); diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts index 1b8ea98b..bb3dca08 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts @@ -1,5 +1,5 @@ import { createReducer, on } from '@ngrx/store'; -import { voxelAdded, voxelRemoved } from './scene-viewer-container.actions'; +import { voxelRemoved, voxelSet } from './scene-viewer-container.actions'; export const featureKey = 'sceneViewerContainer'; @@ -13,7 +13,7 @@ export const initialState: State = { export const reducer = createReducer( initialState, - on(voxelAdded, state => { + on(voxelSet, state => { return { ...state, voxelCount: state.voxelCount + 1, diff --git a/apps/frontend/src/app/tools-panel/tool.model.ts b/apps/frontend/src/app/tools-panel/tool.model.ts index 7e0bc704..9d90ce45 100644 --- a/apps/frontend/src/app/tools-panel/tool.model.ts +++ b/apps/frontend/src/app/tools-panel/tool.model.ts @@ -1,4 +1,5 @@ export enum Tool { - AddVoxel = 'AddVoxel', + SetVoxel = 'SetVoxel', RemoveVoxel = 'RemoveVoxel', + PaintVoxel = 'PaintVoxel', } diff --git a/apps/frontend/src/app/tools-panel/tools-panel.component.ts b/apps/frontend/src/app/tools-panel/tools-panel.component.ts index 5def4721..4a1b0424 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.component.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.component.ts @@ -23,14 +23,19 @@ export class ToolsPanelComponent { tools: UiToolbarToolConfig[] = [ { icon: 'add_circle_outline', - tooltip: '@@@ Add voxel', - value: Tool.AddVoxel, + tooltip: '@@@ Set voxel', + value: Tool.SetVoxel, }, { icon: 'remove_circle_outline', tooltip: '@@@ Remove voxel', value: Tool.RemoveVoxel, }, + { + icon: 'brush', + tooltip: '@@@ Paint voxel', + value: Tool.PaintVoxel, + }, ]; constructor(private store: Store) { diff --git a/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts b/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts index 48409661..85bc93e6 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts @@ -4,8 +4,8 @@ import { reducer } from './tools-panel.reducer'; describe('ToolsPanelReducer', () => { it('should set selected tool', () => { - const newState = reducer(undefined, selectTool({ id: Tool.AddVoxel })); + const newState = reducer(undefined, selectTool({ id: Tool.SetVoxel })); - expect(newState.selectedToolId).toEqual(Tool.AddVoxel); + expect(newState.selectedToolId).toEqual(Tool.SetVoxel); }); }); diff --git a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts index 732957f6..5105d003 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts @@ -9,7 +9,7 @@ export interface State { } export const initialState: State = { - selectedToolId: Tool.AddVoxel, + selectedToolId: Tool.SetVoxel, }; /** Provide reducer in AoT-compilation happy way */ diff --git a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts index 4bafbe85..92e45598 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.effects.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.effects.ts @@ -5,10 +5,12 @@ import { filter, map, switchMap, withLatestFrom } from 'rxjs/operators'; import * as fromApp from '../app.reducer'; import * as menuBarContainerActions from '../menu-bar-container/menu-bar-container.actions'; import { - addVoxel, + paintVoxel, removeVoxel, - voxelAdded, + setVoxel, + voxelPainted, voxelRemoved, + voxelSet, } from '../scene-viewer-container/scene-viewer-container.actions'; import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; @@ -70,13 +72,13 @@ export class UndoRedoEffects { map(([action, state]) => action), ); - addUndoActionForAddVoxel$ = createEffect(() => + addUndoActionForSetVoxel$ = createEffect(() => this.userTriggeredActions$.pipe( - ofType(voxelAdded), + ofType(voxelSet), map(voxelChange => ({ - redoStartAction: addVoxel(voxelChange), - redoEndActionType: voxelAdded.type, - undoStartAction: removeVoxel({ position: voxelChange.position }), + redoStartAction: setVoxel(voxelChange), + redoEndActionType: voxelSet.type, + undoStartAction: removeVoxel(voxelChange), undoEndActionType: voxelRemoved.type, })), map(addUndo), @@ -87,10 +89,23 @@ export class UndoRedoEffects { this.userTriggeredActions$.pipe( ofType(voxelRemoved), map(voxelChange => ({ - redoStartAction: removeVoxel({ position: voxelChange.position }), + redoStartAction: removeVoxel(voxelChange), redoEndActionType: voxelRemoved.type, - undoStartAction: addVoxel(voxelChange), - undoEndActionType: voxelAdded.type, + undoStartAction: setVoxel(voxelChange), + undoEndActionType: voxelSet.type, + })), + map(addUndo), + ), + ); + + addUndoActionForPaintVoxel$ = createEffect(() => + this.userTriggeredActions$.pipe( + ofType(voxelPainted), + map(voxelChange => ({ + redoStartAction: paintVoxel(voxelChange), + redoEndActionType: voxelPainted.type, + undoStartAction: paintVoxel({ xyz: voxelChange.xyz, newValue: voxelChange.oldValue }), + undoEndActionType: voxelPainted.type, })), map(addUndo), ), diff --git a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts index 61afc316..96307c37 100644 --- a/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts +++ b/apps/frontend/src/app/undo-redo/undo-redo.reducer.spec.ts @@ -2,10 +2,10 @@ import { Action } from '@ngrx/store'; import { Coord } from '@talus/vdb'; import { VoxelChange } from '../scene-viewer-container/grid.service'; import { - addVoxel, removeVoxel, - voxelAdded, + setVoxel, voxelRemoved, + voxelSet, } from '../scene-viewer-container/scene-viewer-container.actions'; import { addUndo, redo, redone, undo, undone } from './undo-redo.actions'; import { @@ -169,9 +169,10 @@ describe('UndoRedoReducer', () => { function createVoxelChange(xyz: Coord): VoxelChange { return { - position: xyz, + xyz, affectedNodeOrigin: xyz, - value: 42, + oldValue: 24, + newValue: 42, }; } @@ -184,9 +185,9 @@ function createStep( undoStartAction: Action; } { return { - redoStartAction: addVoxel(voxelChange), - redoEndActionType: voxelAdded.type, - undoStartAction: removeVoxel({ position: voxelChange.position }), + redoStartAction: setVoxel(voxelChange), + redoEndActionType: voxelSet.type, + undoStartAction: removeVoxel({ xyz: voxelChange.xyz }), undoEndActionType: voxelRemoved.type, }; } From 2ea06b5a8d205790615685e0af74d66a37f02095 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Mon, 20 Jan 2020 11:31:36 +0100 Subject: [PATCH 72/84] refactor(frontend): s/position/xyz --- .../scene-viewer-container.component.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index ef00469c..db72b855 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -116,9 +116,9 @@ describe('SceneViewerContainerComponent', () => { ], ])( 'should dispatch `setVoxel` action for %j', - (pickedPoint: Coord, position: Coord, normal: Coord) => { + (pickedPoint: Coord, xyz: Coord, normal: Coord) => { const initialAction = setVoxel({ xyz: [0, 0, 0], newValue: 42 }); - const action = setVoxel({ xyz: position, newValue: 1 }); + const action = setVoxel({ xyz, newValue: 1 }); stubComponent.pointerPick.next({ pickedPoint, @@ -169,12 +169,12 @@ describe('SceneViewerContainerComponent', () => { ], ])( 'should dispatch `removeVoxel` action for %j', - (pickedPoint: Coord, position: Coord, normal: Coord) => { + (pickedPoint: Coord, xyz: Coord, normal: Coord) => { mockSelectedToolIdSelector.setResult(Tool.RemoveVoxel); mockStore.refreshState(); fixture.detectChanges(); - const action = removeVoxel({ xyz: position }); + const action = removeVoxel({ xyz }); stubComponent.pointerPick.next({ pickedPoint, From 838d1ac499ecfa19dbfb0e44e9caf6a818e171fa Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Mon, 20 Jan 2020 11:51:16 +0100 Subject: [PATCH 73/84] build(dep): update `@nrwl` to `v8.11.2` --- package.json | 12 ++-- yarn.lock | 193 ++++++++++++++++++++++++++++----------------------- 2 files changed, 112 insertions(+), 93 deletions(-) diff --git a/package.json b/package.json index 20de450d..7c7a398f 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@babylonjs/materials": "4.1.0-beta.20", "@ngrx/effects": "8.6.0", "@ngrx/store": "8.6.0", - "@nrwl/angular": "8.11.0", + "@nrwl/angular": "8.11.2", "hammerjs": "2.0.8", "mnemonist": "0.32.0", "rxjs": "6.5.4", @@ -61,11 +61,11 @@ "@angular/language-service": "8.2.14", "@babel/core": "7.5.4", "@babylonjs/inspector": "4.1.0-beta.20", - "@nrwl/cypress": "8.11.0", - "@nrwl/jest": "8.11.0", - "@nrwl/node": "8.11.0", - "@nrwl/storybook": "8.11.1", - "@nrwl/workspace": "8.11.0", + "@nrwl/cypress": "8.11.2", + "@nrwl/jest": "8.11.2", + "@nrwl/node": "8.11.2", + "@nrwl/storybook": "8.11.2", + "@nrwl/workspace": "8.11.2", "@storybook/addon-knobs": "5.3.6", "@storybook/angular": "5.3.6", "@types/benchmark": "1.0.31", diff --git a/yarn.lock b/yarn.lock index d98c7800..12f53e0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,6 +18,14 @@ "@angular-devkit/core" "8.3.22" rxjs "6.4.0" +"@angular-devkit/architect@0.803.23": + version "0.803.23" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.23.tgz#a73ae2edede539f37fbfb09e4085ac24ec3781c9" + integrity sha512-BRDbnmdULrle2l7WFZHEW/OAwS8RRg08+jiNG3gEP0BxDN6QMNMKmWhxmX67pgq3e/xMvu2DH0z71mAPNtJDAw== + dependencies: + "@angular-devkit/core" "8.3.23" + rxjs "6.4.0" + "@angular-devkit/build-angular@0.803.22": version "0.803.22" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.22.tgz#0fa668e84c237c6b1ab524e50b0ccaedc3a92929" @@ -91,15 +99,6 @@ typescript "3.5.3" webpack-sources "1.4.3" -"@angular-devkit/build-webpack@0.803.14": - version "0.803.14" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.14.tgz#8c9d443260e07ed2ea13bd3ac2c04c2c8cc47be5" - integrity sha512-hvxAyJzDCaIISATHcu0+rAAj7ZcmX7VREX6J3FUMYDxhdjKqe45Q5J6Oy/Df2ZSV3YxwySZVcIhrBstm+0LC7Q== - dependencies: - "@angular-devkit/architect" "0.803.14" - "@angular-devkit/core" "8.3.14" - rxjs "6.4.0" - "@angular-devkit/build-webpack@0.803.22": version "0.803.22" resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.22.tgz#079b2ded794308b2dc93769406bdb0a1e32015c0" @@ -109,6 +108,15 @@ "@angular-devkit/core" "8.3.22" rxjs "6.4.0" +"@angular-devkit/build-webpack@0.803.23": + version "0.803.23" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.23.tgz#43f2449835f9e020894e49420a34ac983190f3c6" + integrity sha512-ttsvUpoMHAr84I3YQmr2Yyu1qPIjw3m+aYgeEh1cAN+Ck8/F/q+Z+nWsmcgIXEC2f8xN7uZWy4PIkCZR8YETOg== + dependencies: + "@angular-devkit/architect" "0.803.23" + "@angular-devkit/core" "8.3.23" + rxjs "6.4.0" + "@angular-devkit/core@8.3.14": version "8.3.14" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.14.tgz#b42716a0de44c8f2785a18ae5562ec2f76543c9b" @@ -131,6 +139,17 @@ rxjs "6.4.0" source-map "0.7.3" +"@angular-devkit/core@8.3.23": + version "8.3.23" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.23.tgz#612bf8a76b1ccde40cd6a5e85a02dc083bb666c6" + integrity sha512-y++LN6R/fu+obPUKEMDSKZ5FzeWN5rV0Z8vrdC+uF02VJLv/5QI/dUx3ROKFzJO3m2LU6EAuo5b/TLAPq4ving== + dependencies: + 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@8.3.14": version "8.3.14" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.14.tgz#844573822805c2f50f513418e4850a4c28bcb91a" @@ -147,10 +166,18 @@ "@angular-devkit/core" "8.3.22" rxjs "6.4.0" -"@angular-eslint/builder@0.0.1-alpha.17": - version "0.0.1-alpha.17" - resolved "https://registry.yarnpkg.com/@angular-eslint/builder/-/builder-0.0.1-alpha.17.tgz#e67cc054c0aa4a0b56c84c82f8196d0ebac72d9b" - integrity sha512-ULmEjyhoozljKbHvIUaVKjb0efAyh8R/vcoo2tCErrTBIEsFcpO0VtiSsVoCPWKhodHKteAimWSfpcyVYcWuOw== +"@angular-devkit/schematics@8.3.23": + version "8.3.23" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.23.tgz#c5232d74ce6595955961aeb0b6b48dda1f047b88" + integrity sha512-O8i/vn6YfqbT0q7o4jsVOTnWE07T1tcvk2zJ4O/1ete2z+Z2aw1YtIddwXEGJNCDpeE0B7f2sUHoLOS4Jc4O9w== + dependencies: + "@angular-devkit/core" "8.3.23" + rxjs "6.4.0" + +"@angular-eslint/builder@0.0.1-alpha.18": + version "0.0.1-alpha.18" + resolved "https://registry.yarnpkg.com/@angular-eslint/builder/-/builder-0.0.1-alpha.18.tgz#3a3ac2d93782ce24a99457df93b4755912cca8a9" + integrity sha512-xDipFDGxtY0Hjy2ua2BwsuxFKdC9eZBdXr+HXXXvbLCGn9DTHT5RbPinZJ4bMPJz4QE6yIrg6EhoB4CWHLZvhw== "@angular/animations@8.2.14": version "8.2.14" @@ -2676,88 +2703,75 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" -"@nrwl/angular@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-8.11.0.tgz#d65f8800acb852544fec4b11b0b49fe12bbb34b3" - integrity sha512-MIFwd2WdY8uvW1oySPzGxs2kYtprXIHYzXkkW3L5BMY0yVWTUqpUpmtMHQBPgA2E2OCIIO7jpccrXMRofMU57Q== +"@nrwl/angular@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-8.11.2.tgz#45a1287cd43ef40ef8b9c453adb42132bf63e1fb" + integrity sha512-Lbhd8AxjZjAqsi8uDtazNVuicSkPswMJzOWx2Wm6pN7H9McUlxLLr81uhXvGeh3JafzHdHusy4V6E7rUwdQxUw== dependencies: "@angular-devkit/schematics" "8.3.14" - "@nrwl/cypress" "8.11.0" - "@nrwl/jest" "8.11.0" + "@nrwl/cypress" "8.11.2" + "@nrwl/jest" "8.11.2" "@schematics/angular" "8.3.14" jasmine-marbles "~0.6.0" -"@nrwl/cli@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-8.11.0.tgz#bb45b31c45409af706b2636798ec695a2c6104aa" - integrity sha512-S8z9wgeWObmRuCXWVrQ9yIeWnyJJ4CEIzmuSbs3k+XBx/MTP2QsoluJSYHv4NYxFM2hTboZPNuicNsz16Ua5/Q== +"@nrwl/cli@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-8.11.2.tgz#0d3b5e579efc91fbe85f68cf661be7cfa67e8a9d" + integrity sha512-1DlGFgv0C/ALcEaEHBIBaxDuzIUN8KGA5GxNiT971Dbea1agFmlUIFjfDNnEFmkh7cK8MeC6Fjf7hcqXueNzWQ== dependencies: - "@nrwl/tao" "8.11.0" + "@nrwl/tao" "8.11.2" chalk "2.4.2" tmp "0.0.33" yargs "^11.0.0" yargs-parser "10.0.0" -"@nrwl/cypress@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-8.11.0.tgz#d0771f9a5f4e1cb25c7230de6372d3da9d9adcf0" - integrity sha512-AB8Df+eX/qTR05EDswhk1hr9/RxNBe41mUzUq3KGvXEj7xMw+6Jt3JmBnoISk2olqDTB1DM3gLV0ytSC1FkktQ== +"@nrwl/cypress@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-8.11.2.tgz#ed380d0a35c20f388bad741e785e2afb4c0d9d76" + integrity sha512-R7EWD/qNF8EElhEDYsaxrbOelxcKxPypb6/T/pP18AhTeXAEd5n8GZyHCjMFbZDf/f3dBptdpAq/H2k6fWwD5A== dependencies: - "@angular-devkit/architect" "0.803.14" - "@angular-devkit/core" "8.3.14" + "@angular-devkit/architect" "0.803.23" + "@angular-devkit/core" "8.3.23" "@cypress/webpack-preprocessor" "~4.1.0" - tree-kill "1.2.1" + tree-kill "1.2.2" ts-loader "5.3.1" tsconfig-paths-webpack-plugin "3.2.0" webpack-node-externals "1.7.2" -"@nrwl/cypress@8.11.1": - version "8.11.1" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-8.11.1.tgz#c9583fb35bbf718ff405a1fa3b2acbbefbd0ff4a" - integrity sha512-9zBVtTMltHfRYI3VWeEpZgHNTV587KZAVZSJIqX3R5PYbnteMIPbLBpJS44PIfp7wpKh+1ng1NSHWooGRk8hdw== +"@nrwl/jest@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-8.11.2.tgz#e58786a0a96166606339131484cb855a7de8ae0b" + integrity sha512-ZEefzPWeIkxwNQE2uYGg7/mvof4vMtfKED2Dq66rR/jE0A58Ga0FcAW4fzJd95J2mObzxlqz4Iij8C8k0Zkb+Q== dependencies: - "@angular-devkit/architect" "0.803.14" - "@angular-devkit/core" "8.3.14" - "@cypress/webpack-preprocessor" "~4.1.0" - tree-kill "1.2.1" - ts-loader "5.3.1" - tsconfig-paths-webpack-plugin "3.2.0" - webpack-node-externals "1.7.2" - -"@nrwl/jest@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-8.11.0.tgz#ed02e7facc90c91bff0f6974a3d329d1e83ca9f4" - integrity sha512-EyuuNAItQDSwJNtsDTs7zINdRG9GjU2rnTJsonMdnsdZIikM0HD8xooF/XzdIqfbc5c7ZZ46LqCChQ8PhWqBhQ== - dependencies: - "@angular-devkit/architect" "0.803.14" - "@angular-devkit/core" "8.3.14" - "@angular-devkit/schematics" "8.3.14" + "@angular-devkit/architect" "0.803.23" + "@angular-devkit/core" "8.3.23" + "@angular-devkit/schematics" "8.3.23" -"@nrwl/linter@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-8.11.0.tgz#9113d574dabfedda4059b8130e1299a95b4169c6" - integrity sha512-a66Hx84XJZTziiVNyqoan1lhcI10NFLfta0Sgk+9gGHuaT4KI3NjAhKSUNSchIlyN8enRb+Gl3Wenv2CHnqyJw== +"@nrwl/linter@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-8.11.2.tgz#71fab5b780ff0eaf6d616feff1d69a8933e3b85f" + integrity sha512-l14+DIOJtkIzx7kfTMeL+96E+hLh9R5QDM6o2ysQ5dMwb+YGpD+n8uZJzO1G+LbIVt1Wo6ICyPS73YF9y9nTGA== dependencies: "@angular-devkit/architect" "0.803.14" - "@angular-eslint/builder" "0.0.1-alpha.17" - -"@nrwl/node@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-8.11.0.tgz#8e21f869ef4b9139cc9bed0ae6ee19802f11888f" - integrity sha512-H4LXQO1TYn5XjTo5bEySzuNSzu/gIffWbm4DHX9Ilie2iRr1fBDLD+/oo5qNLGhLuFWM8o9gKG6FDpNAhI7B6g== - dependencies: - "@angular-devkit/architect" "0.803.14" - "@angular-devkit/build-webpack" "0.803.14" - "@angular-devkit/core" "8.3.14" - "@angular-devkit/schematics" "8.3.14" - "@nrwl/jest" "8.11.0" - "@nrwl/linter" "8.11.0" + "@angular-eslint/builder" "0.0.1-alpha.18" + +"@nrwl/node@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-8.11.2.tgz#6e3269b6d3d0b9aa1a21b0acddd8d2fbb2ccd937" + integrity sha512-jfbQAkzZ7uuTTfipLMEDnPZQwHwq5VxcFFp7VDqh2Lshst2XoXflW6ibgQD8bSWxCg5rjqk5igXRhNOE6Ff0kw== + dependencies: + "@angular-devkit/architect" "0.803.23" + "@angular-devkit/build-webpack" "0.803.23" + "@angular-devkit/core" "8.3.23" + "@angular-devkit/schematics" "8.3.23" + "@nrwl/jest" "8.11.2" + "@nrwl/linter" "8.11.2" circular-dependency-plugin "5.2.0" copy-webpack-plugin "5.1.1" fork-ts-checker-webpack-plugin "^3.1.1" license-webpack-plugin "2.1.2" source-map-support "0.5.12" - tree-kill "1.2.1" + tree-kill "1.2.2" ts-loader "5.4.5" tsconfig-paths-webpack-plugin "3.2.0" webpack "4.41.2" @@ -2765,39 +2779,39 @@ webpack-merge "4.2.1" webpack-node-externals "1.7.2" -"@nrwl/storybook@8.11.1": - version "8.11.1" - resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-8.11.1.tgz#62d0c13aa7ef333ae248ea5162067459545c625f" - integrity sha512-Ebhj5mygyaZ/4g0rKRjBMnJCzX9Htwba5cvBZW9Vc7hoXPu+gVucmr+U+gbOl4KSP2oRfY5mdvt+1uQHEUGrOw== +"@nrwl/storybook@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-8.11.2.tgz#d6e92f7e42bac6a4de65efa76bdd0f1d87c22926" + integrity sha512-OemkE54vr7qDNs4QkolzCclN3ZGURniOL6mBFuX95/mQ/OL5H48U5wR892WkZEjabblYjnxle2k1xb6BJAFkZg== dependencies: - "@nrwl/cypress" "8.11.1" + "@nrwl/cypress" "8.11.2" core-js "^3.2.1" - tree-kill "1.2.1" + tree-kill "1.2.2" ts-loader "5.3.1" tsconfig-paths-webpack-plugin "3.2.0" webpack-node-externals "1.7.2" -"@nrwl/tao@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-8.11.0.tgz#bf03d8825cccb06a7fd7d7c498b278deda882f78" - integrity sha512-9N+Vk/M8u1XVjMiLvtjEeFXYkb1TfSFvlKR0XyY7arCYmA/a6z594D4nUADjpDogNy2cyxBXcAjkKTOK1FSqZw== +"@nrwl/tao@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-8.11.2.tgz#8a4af0720905a4f461fbcabcbf413d78e240abd9" + integrity sha512-Xy328IKNnZ4uZ2WcLrTBIYfcJeenjvsU6Qa9IU8ZRR85DQDVHe6wOkeI5QPwC8Dtt+rJGqYRQA7hy10IJkN6cQ== dependencies: - "@angular-devkit/architect" "0.803.14" - "@angular-devkit/core" "8.3.14" - "@angular-devkit/schematics" "8.3.14" + "@angular-devkit/architect" "0.803.23" + "@angular-devkit/core" "8.3.23" + "@angular-devkit/schematics" "8.3.23" fast-levenshtein "2.0.6" inquirer "^6.3.1" minimist "^1.2.0" strip-json-comments "2.0.1" -"@nrwl/workspace@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-8.11.0.tgz#42b37098db2ad31047db1907169f6969907feee1" - integrity sha512-3cougMUedrOO8v1164i6I+mrGyDm1Uv2yFrYwMAnAcW+9s9Yy2KgEJ4HyBb4rJIhi7uKyQk9u9Q9QQtJsW+Kjg== +"@nrwl/workspace@8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-8.11.2.tgz#c7aad941fd172542bfa32c6dbe11de5c93e2470a" + integrity sha512-ttmEvcmLqlaP5XPF+eZx6nZHVLv4xlNxaydBhcisLRLTNQRqx6xdAN+52RHY6415w663205utMw1PH4TU7Kl0w== dependencies: "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" - "@nrwl/cli" "8.11.0" + "@nrwl/cli" "8.11.2" chalk "2.4.2" cosmiconfig "4.0.0" fs-extra "6.0.0" @@ -14003,6 +14017,11 @@ tree-kill@1.2.1: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-newlines@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" From d1a7f4f64fbed4ac78a2eaed0023f7482e57e87c Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Mon, 20 Jan 2020 11:56:30 +0100 Subject: [PATCH 74/84] build(dep): update `@angular/(cli|core)` to `v8.3.22` - `ng update @angular/cli @angular/core` --- README.md | 6 + package.json | 4 +- yarn.lock | 353 ++++++++++++++++----------------------------------- 3 files changed, 119 insertions(+), 244 deletions(-) diff --git a/README.md b/README.md index 06a8e3e4..cff361dc 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,12 @@ See scripts on [nx.dev](https://nx.dev/angular/api/workspace/npmscripts) - `yarn nx --help` +## Ng + +### Update + +- `ng update @angular/cli @angular/core` + ## Github Pages CircleCI pushes every build onto the diff --git a/package.json b/package.json index 7c7a398f..cefaf13b 100644 --- a/package.json +++ b/package.json @@ -55,8 +55,8 @@ "zone.js": "0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "0.803.22", - "@angular/cli": "8.3.22", + "@angular-devkit/build-angular": "0.803.23", + "@angular/cli": "8.3.23", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", "@babel/core": "7.5.4", diff --git a/yarn.lock b/yarn.lock index 12f53e0b..dd83d11e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,14 +10,6 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/architect@0.803.22": - version "0.803.22" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.22.tgz#33b54099298aaef5f93ffefb8b91a98ea9f85387" - integrity sha512-5Gr0LH+Hjd/NLdmi660VBoo3WbzQM7/yeG+ziktb7hbeVaYK4Mejtcg/DJnCoZ3hzlZuZokWVwvpdFo+A9xKbg== - dependencies: - "@angular-devkit/core" "8.3.22" - rxjs "6.4.0" - "@angular-devkit/architect@0.803.23": version "0.803.23" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.803.23.tgz#a73ae2edede539f37fbfb09e4085ac24ec3781c9" @@ -26,18 +18,18 @@ "@angular-devkit/core" "8.3.23" rxjs "6.4.0" -"@angular-devkit/build-angular@0.803.22": - version "0.803.22" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.22.tgz#0fa668e84c237c6b1ab524e50b0ccaedc3a92929" - integrity sha512-2q9qLsD52D4GACUAuQhvkgQ7vLAhZzdU0jzfs74RTxqUZ3PS6Ltrrwpdg2kp9RlQ53+nSCYjWBDLk1CxoEt4pg== +"@angular-devkit/build-angular@0.803.23": + version "0.803.23" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.803.23.tgz#d60698ca1ae3426c2d38582a8a59ae10e224980e" + integrity sha512-hlaDMuScRbgdsH3Toyze5G5NhmJypWIPGcIt4CAcXAnVdSltrBPKzu5Psr+ACcDLH3TYtlMKBrkAG9xXS3it1g== dependencies: - "@angular-devkit/architect" "0.803.22" - "@angular-devkit/build-optimizer" "0.803.22" - "@angular-devkit/build-webpack" "0.803.22" - "@angular-devkit/core" "8.3.22" + "@angular-devkit/architect" "0.803.23" + "@angular-devkit/build-optimizer" "0.803.23" + "@angular-devkit/build-webpack" "0.803.23" + "@angular-devkit/core" "8.3.23" "@babel/core" "7.7.5" "@babel/preset-env" "7.7.6" - "@ngtools/webpack" "8.3.22" + "@ngtools/webpack" "8.3.23" ajv "6.10.2" autoprefixer "9.6.1" browserslist "4.8.3" @@ -47,10 +39,10 @@ clean-css "4.2.1" copy-webpack-plugin "5.1.1" core-js "3.2.1" + coverage-istanbul-loader "2.0.3" 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" karma-source-map-support "1.4.0" less "3.9.0" @@ -79,7 +71,7 @@ stylus-loader "3.0.2" terser "4.3.9" terser-webpack-plugin "1.4.3" - tree-kill "1.2.1" + tree-kill "1.2.2" webpack "4.39.2" webpack-dev-middleware "3.7.2" webpack-dev-server "3.9.0" @@ -88,10 +80,10 @@ webpack-subresource-integrity "1.1.0-rc.6" worker-plugin "3.2.0" -"@angular-devkit/build-optimizer@0.803.22": - version "0.803.22" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.22.tgz#6d09cbb5fd28ab7bd22ddc54e938f305dfff8b20" - integrity sha512-VIDeQcBn88PjHBTen3BRVA7DJiKEJdDwukx61mUvUDOcY7S5Ot5WqG0nrZifRjha17Z+fl3XuwS9TZNYmlF7WQ== +"@angular-devkit/build-optimizer@0.803.23": + version "0.803.23" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.803.23.tgz#573138cb7202ae1cb60ca832ea5df98a46674fbd" + integrity sha512-0MJAnGjpmE1hNrwDBi/7b9G1qyt2qN/wcZOj6QseZeWuoxIVXIWgdM6gBpJdgB7HI7vv4l4LpyFX9Doq+2r7Xg== dependencies: loader-utils "1.2.3" source-map "0.7.3" @@ -99,15 +91,6 @@ typescript "3.5.3" webpack-sources "1.4.3" -"@angular-devkit/build-webpack@0.803.22": - version "0.803.22" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.22.tgz#079b2ded794308b2dc93769406bdb0a1e32015c0" - integrity sha512-RDLAhKHfTFzthzeawHEefYB1MxHiU2I32QzXI3XTCpR2XySw5JG9jIVIcsyDHQH1JtIfpHGq8vgfiTsE3r0YWA== - dependencies: - "@angular-devkit/architect" "0.803.22" - "@angular-devkit/core" "8.3.22" - rxjs "6.4.0" - "@angular-devkit/build-webpack@0.803.23": version "0.803.23" resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.803.23.tgz#43f2449835f9e020894e49420a34ac983190f3c6" @@ -128,17 +111,6 @@ rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/core@8.3.22": - version "8.3.22" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.22.tgz#085cc1cf356cec00d0a1cea83ef1f21277f5ff55" - integrity sha512-lOEYcvK3MktjR9YZT/cUjiQE5dZxl8rZ/vgWgwDiL7RtzfXTt8lPapoJe7YKS53gLbUYiBNPCtTyTAqnslWgGA== - dependencies: - 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/core@8.3.23": version "8.3.23" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.23.tgz#612bf8a76b1ccde40cd6a5e85a02dc083bb666c6" @@ -158,14 +130,6 @@ "@angular-devkit/core" "8.3.14" rxjs "6.4.0" -"@angular-devkit/schematics@8.3.22": - version "8.3.22" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.22.tgz#41461768cc6cf54708d55311e59b9defa7bff484" - integrity sha512-ETLdV1ftT+ZuuiHl6FjFQ4XLQznWMcxWognX+qgByn+DQOXsYRRvZK1L5eG/SG8CKJ8NL5oteTDloDnghARHFw== - dependencies: - "@angular-devkit/core" "8.3.22" - rxjs "6.4.0" - "@angular-devkit/schematics@8.3.23": version "8.3.23" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.23.tgz#c5232d74ce6595955961aeb0b6b48dda1f047b88" @@ -195,16 +159,16 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@8.3.22": - version "8.3.22" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.22.tgz#2512e0aeaffdbb30ace35dc288eeba9a86f28b95" - integrity sha512-OT2rzwnxwI0ETP7rXCxjxsIAZEYo9wHP/5rRbu3m15GlQ3Bclq34ZDRwC/bRxXL5+1DfmhAs9AjtYNoFoDM4Tg== +"@angular/cli@8.3.23": + version "8.3.23" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.23.tgz#1aa184bbbf8ae8def1b89d3a8eaf31ab8624bd18" + integrity sha512-umr5puS6j8elTIhhsjyb/psTmwL00oeBbsnnz5K3fkbWB2wgdMsJvLi9aR/oAyh2NlSA2ZzgB62I38VjoDR0yQ== dependencies: - "@angular-devkit/architect" "0.803.22" - "@angular-devkit/core" "8.3.22" - "@angular-devkit/schematics" "8.3.22" - "@schematics/angular" "8.3.22" - "@schematics/update" "0.803.22" + "@angular-devkit/architect" "0.803.23" + "@angular-devkit/core" "8.3.23" + "@angular-devkit/schematics" "8.3.23" + "@schematics/angular" "8.3.23" + "@schematics/update" "0.803.23" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "^4.1.1" @@ -381,6 +345,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.7.5": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" + integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helpers" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.4.0", "@babel/generator@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" @@ -904,7 +889,7 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.5.4": +"@babel/helpers@^7.5.4", "@babel/helpers@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85" integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ== @@ -2500,6 +2485,11 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + "@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" @@ -2666,15 +2656,15 @@ resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-8.6.0.tgz#8540c5bd40b33fc2f443e7e86f47c0d801b8f413" integrity sha512-K4cvCEa+5hw9qrETQWO+Cha3YbVCAT8yaIKJr/N35KntTL9mQMjoL+51JWLZfBwPV0e19CFgJIyrBnVUTxwr2A== -"@ngtools/webpack@8.3.22": - version "8.3.22" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.22.tgz#f6792d66430fb48c890a8145dee5088e3519860b" - integrity sha512-MES7Q0k6GpQEY74cxElUVy7jIaDBSLvY+eOUN2GKL5CznvBSp3+U5px6X7ZjPGzCp7no1L1JkV9g2e0hPatlcw== +"@ngtools/webpack@8.3.23": + version "8.3.23" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.3.23.tgz#2961d48d1860e93c7afcb6ec91040a753f6463a8" + integrity sha512-+XekeThky6+Upped3hOwjHwYTsXJiDuCA5ZZLmGHkTxGzjB4ZHSlBaj75yTS+s+/Ab1WgdRo2P2BxOUS7oogtw== dependencies: - "@angular-devkit/core" "8.3.22" + "@angular-devkit/core" "8.3.23" enhanced-resolve "4.1.0" rxjs "6.4.0" - tree-kill "1.2.1" + tree-kill "1.2.2" webpack-sources "1.4.3" "@nodelib/fs.scandir@2.1.3": @@ -2845,21 +2835,21 @@ "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" -"@schematics/angular@8.3.22": - version "8.3.22" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.22.tgz#fab009312bd3d50115332f2c41a92e15744ac09f" - integrity sha512-vD+UgPdbEoFPOH6xe2laFpHn/MC9R5C4A/+J9yQ6HBg5kt1YdyIBakvPOcXQCyWr5VZzDmTyMO76rd3zaef3DQ== +"@schematics/angular@8.3.23": + version "8.3.23" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.3.23.tgz#8f46c4673eca3fadc46b2d43c4367e5542be624e" + integrity sha512-yisP1iCLGC4VnZNC3kOnYyTS5cmfKEnLM9bMzhZGMWwov9RRfdxKKeSnG9FJNwHxI0WjQ0UWwfiz1dj0YacG3g== dependencies: - "@angular-devkit/core" "8.3.22" - "@angular-devkit/schematics" "8.3.22" + "@angular-devkit/core" "8.3.23" + "@angular-devkit/schematics" "8.3.23" -"@schematics/update@0.803.22": - version "0.803.22" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.22.tgz#88b2fd3c5c2e3c5b2f453b912b281df14c94fd34" - integrity sha512-X+1sJ7YadcYxDqcLX7l7MEAIL3SHIXpCqToQdAZbAE06NdTFvg5eqiKreSdmm7ZdfL0dBe6oXi/yCDVMoL2zcw== +"@schematics/update@0.803.23": + version "0.803.23" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.803.23.tgz#214df8f0f6cdd5e1ad7b535ba9b0f46a5f24a113" + integrity sha512-pLd5PseFTYF3VZ+IgMeNEFATQY5A80ylot7Dcg9FDeihqr5R9Rd1maCWIR43oKXvtK5C5+ackwR0QaPBAZ9bdw== dependencies: - "@angular-devkit/core" "8.3.22" - "@angular-devkit/schematics" "8.3.22" + "@angular-devkit/core" "8.3.23" + "@angular-devkit/schematics" "8.3.23" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.5.5" @@ -3727,16 +3717,6 @@ ajv@6.10.2, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^5.0.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -4119,7 +4099,7 @@ axobject-query@2.0.2: dependencies: ast-types-flow "0.0.7" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -4128,20 +4108,6 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-generator@^6.18.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - 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" - babel-helper-evaluate-path@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz#a62fa9c4e64ff7ea5cea9353174ef023a900a67c" @@ -4200,13 +4166,6 @@ babel-loader@8.0.6, babel-loader@^8.0.2: mkdirp "^0.5.1" pify "^4.0.1" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - babel-plugin-add-react-displayname@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" @@ -4438,55 +4397,6 @@ babel-preset-jest@^24.9.0: babel-plugin-transform-undefined-to-void "^6.9.4" lodash "^4.17.11" -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.16.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - 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@^6.18.0, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - 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@^6.18.0, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - babylonjs-gltf2interface@4.1.0-beta.20: version "4.1.0-beta.20" resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.20.tgz#90368bda475b3857b3043913d6358f8c4604d05b" @@ -5622,11 +5532,6 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.4.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== - core-js@^3.0.1, core-js@^3.0.4, core-js@^3.2.1: version "3.6.4" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" @@ -5676,6 +5581,17 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" +coverage-istanbul-loader@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz#87d42f03fa0fd3fa8743ec76945d9d67f105722a" + integrity sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA== + dependencies: + convert-source-map "^1.7.0" + istanbul-lib-instrument "^4.0.0" + loader-utils "^1.2.3" + merge-source-map "^1.1.0" + schema-utils "^2.6.1" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -5923,7 +5839,7 @@ debug@*, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -6092,13 +6008,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -6854,11 +6763,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -7373,6 +7277,11 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -7545,11 +7454,6 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - globalthis@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" @@ -8734,38 +8638,15 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-instrumenter-loader@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" - integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w== - dependencies: - convert-source-map "^1.5.0" - istanbul-lib-instrument "^1.7.3" - loader-utils "^1.1.0" - schema-utils "^0.3.0" - -istanbul-lib-coverage@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== - istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== -istanbul-lib-instrument@^1.7.3: - version "1.10.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== - dependencies: - 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-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: version "3.3.0" @@ -8780,6 +8661,19 @@ istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: istanbul-lib-coverage "^2.0.5" semver "^6.0.0" +istanbul-lib-instrument@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz#53321a7970f076262fd3292c8f9b2e4ac544aae1" + integrity sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ== + dependencies: + "@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" + istanbul-lib-report@^2.0.4: version "2.0.8" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" @@ -9296,11 +9190,6 @@ jsdom@^13.0.0: ws "^6.1.2" xml-name-validator "^3.0.0" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -9316,11 +9205,6 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -9968,6 +9852,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -12165,11 +12056,6 @@ regenerator-runtime@0.13.3, regenerator-runtime@^0.13.2, regenerator-runtime@^0. resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - regenerator-transform@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" @@ -12694,13 +12580,6 @@ scheduler@^0.18.0: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" - integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= - dependencies: - ajv "^5.0.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -13937,11 +13816,6 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -14012,11 +13886,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tree-kill@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" - integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== - tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" From e34cf44362604a2a1f4d319600ebef973b6c37c6 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Mon, 20 Jan 2020 12:00:01 +0100 Subject: [PATCH 75/84] build(dep): update @babylonjs, @babel, @storybook, @types --- package.json | 16 +- yarn.lock | 472 +++++++++++++++++++++++++-------------------------- 2 files changed, 237 insertions(+), 251 deletions(-) diff --git a/package.json b/package.json index cefaf13b..d9b6013d 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ "@angular/platform-browser": "8.2.14", "@angular/platform-browser-dynamic": "8.2.14", "@angular/router": "8.2.14", - "@babylonjs/core": "4.1.0-beta.20", - "@babylonjs/materials": "4.1.0-beta.20", + "@babylonjs/core": "4.1.0-beta.21", + "@babylonjs/materials": "4.1.0-beta.21", "@ngrx/effects": "8.6.0", "@ngrx/store": "8.6.0", "@nrwl/angular": "8.11.2", @@ -59,20 +59,20 @@ "@angular/cli": "8.3.23", "@angular/compiler-cli": "8.2.14", "@angular/language-service": "8.2.14", - "@babel/core": "7.5.4", - "@babylonjs/inspector": "4.1.0-beta.20", + "@babel/core": "7.8.3", + "@babylonjs/inspector": "4.1.0-beta.21", "@nrwl/cypress": "8.11.2", "@nrwl/jest": "8.11.2", "@nrwl/node": "8.11.2", "@nrwl/storybook": "8.11.2", "@nrwl/workspace": "8.11.2", - "@storybook/addon-knobs": "5.3.6", - "@storybook/angular": "5.3.6", + "@storybook/addon-knobs": "5.3.7", + "@storybook/angular": "5.3.7", "@types/benchmark": "1.0.31", "@types/jest": "24.9.0", - "@types/node": "13.1.7", + "@types/node": "13.1.8", "babel-loader": "8.0.6", - "babylonjs": "4.1.0-beta.20", + "babylonjs": "4.1.0-beta.21", "benchmark": "2.1.4", "codelyzer": "5.2.1", "cypress": "3.8.2", diff --git a/yarn.lock b/yarn.lock index dd83d11e..50d0bfd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -285,26 +285,6 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@7.5.4": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.4.tgz#4c32df7ad5a58e9ea27ad025c11276324e0b4ddd" - integrity sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/helpers" "^7.5.4" - "@babel/parser" "^7.5.0" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.11" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/core@7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.5.tgz#ae1323cd035b5160293307f50647e83f8ba62f7e" @@ -325,27 +305,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@>=7.2.2", "@babel/core@^7.0.1", "@babel/core@^7.1.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== - dependencies: - "@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" - -"@babel/core@^7.7.5": +"@babel/core@7.8.3", "@babel/core@^7.7.5": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== @@ -366,26 +326,36 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.5.5": +"@babel/core@>=7.2.2", "@babel/core@^7.0.1", "@babel/core@^7.1.0": version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" + integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== dependencies: + "@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" - jsesc "^2.5.1" + 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" - trim-right "^1.0.1" -"@babel/generator@^7.5.0", "@babel/generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" - integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug== +"@babel/generator@^7.4.0", "@babel/generator@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" + integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.5.5" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" + trim-right "^1.0.1" "@babel/generator@^7.7.4": version "7.7.7" @@ -397,6 +367,16 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" + integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug== + dependencies: + "@babel/types" "^7.8.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -889,15 +869,6 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.5.4", "@babel/helpers@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85" - integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helpers@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" @@ -916,6 +887,15 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helpers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85" + integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/highlight@^7.0.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" @@ -939,16 +919,16 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== -"@babel/parser@^7.5.0", "@babel/parser@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" - integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== - "@babel/parser@^7.7.4", "@babel/parser@^7.7.5": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== +"@babel/parser@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" + integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -2229,21 +2209,6 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.5.0", "@babel/traverse@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" - integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" @@ -2259,6 +2224,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" + integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" @@ -2268,76 +2248,76 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.5.0", "@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== +"@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== dependencies: esutils "^2.0.2" lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== dependencies: esutils "^2.0.2" lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babylonjs/core@4.1.0-beta.20": - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.20.tgz#fa554a10127e9409bec56b5c77256374b0524390" - integrity sha512-vKVaRNTGz/SgOljfhRhSJaAKajjkoXQQE5AgtdUz6zc4ps+9YPqV4sIFTS8jCSREnlnwpyLe7F8MjVYw4O51Aw== +"@babylonjs/core@4.1.0-beta.21": + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@babylonjs/core/-/core-4.1.0-beta.21.tgz#af14d914ca34265259ca8df3cea7c1dbb16769c3" + integrity sha512-pQDMN5GBRHBe4nWE7K+ZRlDyUMlSOJaC8VxU0fBWvUKG9oQ5yeA+hYilbfskLCaVvkUCEh6VkuP9ISyWvnwO1w== dependencies: tslib "^1.10.0" -"@babylonjs/gui@4.1.0-beta.20": - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.20.tgz#20933a191eb8ec6b1c49c809eea5af0f9da62856" - integrity sha512-dxLiAvfrgqaE+LMaulcpb40VYe2VIgWjf/SrHKPNnV7SY9dvaxBjqH7+1J7E8zO0e3n8i6nFuUWZ9ij2lKcGsQ== +"@babylonjs/gui@4.1.0-beta.21": + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@babylonjs/gui/-/gui-4.1.0-beta.21.tgz#7828f740e16dc4129b46309b7226fb8e468a826f" + integrity sha512-fW3+8b9zQEGkNG5dk+Zc771cahNAwoN0tYvnzhMm3o7LyIf+GzU2t7IUfjcEfgIT+4mQjHGmUpOJ1r/1BFdt2Q== dependencies: - "@babylonjs/core" "4.1.0-beta.20" + "@babylonjs/core" "4.1.0-beta.21" tslib "^1.10.0" -"@babylonjs/inspector@4.1.0-beta.20": - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.20.tgz#79224464a772bcf470c3ef352d117560a771356d" - integrity sha512-aonk4bArPhZ+HPj5J13BAyqD/QHBxcAr4oZZgim2DQXjuC40f6ClUYRQH/p0hPJYoy3uR0GiTOvWxx/MPhCOiQ== - dependencies: - "@babylonjs/core" "4.1.0-beta.20" - "@babylonjs/gui" "4.1.0-beta.20" - "@babylonjs/loaders" "4.1.0-beta.20" - "@babylonjs/materials" "4.1.0-beta.20" - "@babylonjs/serializers" "4.1.0-beta.20" - babylonjs-gltf2interface "4.1.0-beta.20" +"@babylonjs/inspector@4.1.0-beta.21": + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@babylonjs/inspector/-/inspector-4.1.0-beta.21.tgz#d434c5c7a2035c78bc1a1dd25f3c1049d807886f" + integrity sha512-YM5SxmhKQHolbidkHvPfQ93iwkvXSpdQ8D+EpsS/z/Rs65vaWpNhBL3iq6frVxzc6sYzOihOB7+JRrdaPCPh2g== + dependencies: + "@babylonjs/core" "4.1.0-beta.21" + "@babylonjs/gui" "4.1.0-beta.21" + "@babylonjs/loaders" "4.1.0-beta.21" + "@babylonjs/materials" "4.1.0-beta.21" + "@babylonjs/serializers" "4.1.0-beta.21" + babylonjs-gltf2interface "4.1.0-beta.21" tslib "^1.10.0" -"@babylonjs/loaders@4.1.0-beta.20": - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.20.tgz#31c910fb5f72a3049688181c7c0ffbdd519e8f4e" - integrity sha512-zNqCjb9vR4oArVaOPMqnKMQFzRe3gw0aSY56oBfMisfcwilWRD9Dcc9dy4gn7m5VgPUTIMtMrBfRnrDerNK1yA== +"@babylonjs/loaders@4.1.0-beta.21": + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@babylonjs/loaders/-/loaders-4.1.0-beta.21.tgz#60282e32378f55d6b8a86e7d957376cde32cad5d" + integrity sha512-CrJOboTMfsab6wVXkZxqfNbAlTS2r+s7g6Izffwn2siyDO5io8mvHsHCkJmXeGOSFG5Fcbdmj77Yzm1h7WRvhA== dependencies: - "@babylonjs/core" "4.1.0-beta.20" - babylonjs-gltf2interface "4.1.0-beta.20" + "@babylonjs/core" "4.1.0-beta.21" + babylonjs-gltf2interface "4.1.0-beta.21" tslib "^1.10.0" -"@babylonjs/materials@4.1.0-beta.20": - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.20.tgz#67a3368a894ffa645999a068f995c0802497a7c1" - integrity sha512-uQSaFdQAKdZC/9CLEufvDyQ37SsPC2zuZt9awugB20tRCsYuj0q6FWmrGR+hleVsOoq/xm9e8y0vnf1Kx9F5bg== +"@babylonjs/materials@4.1.0-beta.21": + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@babylonjs/materials/-/materials-4.1.0-beta.21.tgz#7540f9a1beb76132bd5741611df472dbdc93fee1" + integrity sha512-baHEd8lSwKFYYqfOJujsJNRfFV8TtixpPh6leJiWfNzBrdt0kTJzZ8O3+Wwptowtft0YEBiYI6YGs/Tt0UpT2A== dependencies: - "@babylonjs/core" "4.1.0-beta.20" + "@babylonjs/core" "4.1.0-beta.21" tslib "^1.10.0" -"@babylonjs/serializers@4.1.0-beta.20": - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.20.tgz#9ce3f3661c9d4246c1215a97482df1d86c3a12ef" - integrity sha512-BWMXr0DxGC1hNOiDaQ2FKlueBP3bdFTs98uoo+sWarKhiaOwKkast8DF7QZnEyZVR6oPvUr06FEYmWZnVgidQg== +"@babylonjs/serializers@4.1.0-beta.21": + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@babylonjs/serializers/-/serializers-4.1.0-beta.21.tgz#795f7854fc59d18429b21df9f69e0b375e6ecb06" + integrity sha512-YzMzzzF2UHxF6tBmAFH17YWveK2BuOA1i4df/5Mo0YPNsjQiS7Olgk6nbvH+QHA95WHhj0C4HeWBuGpdQN1oFw== dependencies: - "@babylonjs/core" "4.1.0-beta.20" - babylonjs-gltf2interface "4.1.0-beta.20" + "@babylonjs/core" "4.1.0-beta.21" + babylonjs-gltf2interface "4.1.0-beta.21" tslib "^1.10.0" "@cnakazawa/watch@^1.0.3": @@ -2857,17 +2837,17 @@ semver "6.3.0" semver-intersect "1.4.0" -"@storybook/addon-knobs@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.6.tgz#7d989ec0305c378c73dc5ccd57b80b9caf678016" - integrity sha512-tf6W3Q94ie+HNZ9ISnM1vL6BAR8wFWEn/Ctn7yT+P8LgL28t8C7aOgkVq1Pp8QrDicWgQpmrjwKbkblSfBacBQ== - dependencies: - "@storybook/addons" "5.3.6" - "@storybook/api" "5.3.6" - "@storybook/client-api" "5.3.6" - "@storybook/components" "5.3.6" - "@storybook/core-events" "5.3.6" - "@storybook/theming" "5.3.6" +"@storybook/addon-knobs@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.7.tgz#2897f8b8a6bed592f128271439b64106b92f61ac" + integrity sha512-Qx8X62fDSjo00FiK/5IU9ztzmN40xIRc3qbCpkVkfMA7bxmmrhwinc5KC1saNApVNdMitgU1FTOsE7ExMk4+0g== + dependencies: + "@storybook/addons" "5.3.7" + "@storybook/api" "5.3.7" + "@storybook/client-api" "5.3.7" + "@storybook/components" "5.3.7" + "@storybook/core-events" "5.3.7" + "@storybook/theming" "5.3.7" "@types/react-color" "^3.0.1" copy-to-clipboard "^3.0.8" core-js "^3.0.1" @@ -2881,27 +2861,27 @@ react-lifecycles-compat "^3.0.4" react-select "^3.0.8" -"@storybook/addons@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.6.tgz#93c5492f09b54cee4885192a0fa79465aa91751f" - integrity sha512-WXsIWOO9/0ydl0C2cGwGd6qrd4L49SoXLNiErDxmjIgLXOVicylCC3JRsExcBOlvmcfPpQniBDNFTXnl6NUldw== +"@storybook/addons@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.7.tgz#4b4502d916dd878762d09c6c2aa1bc5191ae94be" + integrity sha512-Kme86+u+ru3S90OD3brSO3sOy28aCYYB25CNSg4/7JLmcUn9XvPc+odQIAipZduNn+OYedJmuncuDz5Ze6RYdA== dependencies: - "@storybook/api" "5.3.6" - "@storybook/channels" "5.3.6" - "@storybook/client-logger" "5.3.6" - "@storybook/core-events" "5.3.6" + "@storybook/api" "5.3.7" + "@storybook/channels" "5.3.7" + "@storybook/client-logger" "5.3.7" + "@storybook/core-events" "5.3.7" core-js "^3.0.1" global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/angular@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-5.3.6.tgz#6100ac400043781e4d51fa91393605da6cddc2c4" - integrity sha512-kKuT7eEpwg0BFcOArIGs2vz45vwCkYApGx/pdJGu7LtiP+tvaZW2IShagb8uyhL5KrEZ6CoQL6gmZrSYljLN0A== +"@storybook/angular@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-5.3.7.tgz#60a560e36acf321e2358b7f861c64b8ad43ba8d4" + integrity sha512-w4/IZ3Em3J+UOfA607WIgdnmnJwS6YI6KYyABXaREyu5UcWpCzy82Ar+TLaDrxAYM6OHg8YHGtrLz6txAm6zKg== dependencies: - "@storybook/addons" "5.3.6" - "@storybook/core" "5.3.6" - "@storybook/node-logger" "5.3.6" + "@storybook/addons" "5.3.7" + "@storybook/core" "5.3.7" + "@storybook/node-logger" "5.3.7" core-js "^3.0.1" fork-ts-checker-webpack-plugin "^3.0.1" global "^4.3.2" @@ -2911,18 +2891,18 @@ ts-loader "^6.0.1" tsconfig-paths-webpack-plugin "^3.2.0" -"@storybook/api@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.6.tgz#687b58cf31994304d0262f873e611b283b6603a4" - integrity sha512-ka05nIo+KGR1kaZZUqQ0Mmn9wVgXGi7yYzfAdtdqrK2WB2xBt78pEHU00U84Qav4rk85g/U68b7tek+oE1wmUw== +"@storybook/api@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.7.tgz#fa9126d851d506607d1ba93588d3599b9b9ea0b9" + integrity sha512-SIT2Z3VtxPn26rkHNCZHYlwmfBPty0QTyWKTgVcnXxUeC74IReGzwMLJgCszouCvHFYOTru8JNndQmhnPlsQiA== dependencies: "@reach/router" "^1.2.1" - "@storybook/channels" "5.3.6" - "@storybook/client-logger" "5.3.6" - "@storybook/core-events" "5.3.6" + "@storybook/channels" "5.3.7" + "@storybook/client-logger" "5.3.7" + "@storybook/core-events" "5.3.7" "@storybook/csf" "0.0.1" - "@storybook/router" "5.3.6" - "@storybook/theming" "5.3.6" + "@storybook/router" "5.3.7" + "@storybook/theming" "5.3.7" "@types/reach__router" "^1.2.3" core-js "^3.0.1" fast-deep-equal "^2.0.1" @@ -2937,34 +2917,34 @@ telejson "^3.2.0" util-deprecate "^1.0.2" -"@storybook/channel-postmessage@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.6.tgz#fca25bd26ad3365901e2e7941e9d39d9fa92a816" - integrity sha512-mCRc4vkIKIylu0V2T6fmTDnpIT9Gp2nEFKgG0Q7QnUlITAYdM0mhrm/5jDH1BmpbFhAvaX2EBI1GYnuS/bEa0Q== +"@storybook/channel-postmessage@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.7.tgz#cf481b98424018f8e91150602f091efea46391cc" + integrity sha512-JuRrV+3MaNSmt5Ojsfd+Z6TJvCOZBeo7uNfA+ZueATe+So/Z9wC/Hy+0oypQ2diTL2Pas4G3uFIRRl5jKUsCZA== dependencies: - "@storybook/channels" "5.3.6" - "@storybook/client-logger" "5.3.6" + "@storybook/channels" "5.3.7" + "@storybook/client-logger" "5.3.7" core-js "^3.0.1" global "^4.3.2" telejson "^3.2.0" -"@storybook/channels@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.6.tgz#ed4a504fb64829d6d1bdb2ee3d48b70a33847b73" - integrity sha512-di3BcoM/O1MR749TW7NDI5q3IXAF4Tqt73CVWOLqc/ZE4c/a70rGJ8rHbWKRfXBdJlgvEU7e82SmJz0MiW0A5Q== +"@storybook/channels@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.7.tgz#19a47c11cda72f98d7d1dc05e78c1e40bdc2bbdf" + integrity sha512-HYD9y6+mxBkypBd8az/MJj4qNkrrP+MbTTbwizhoz0NsYCVCb7Ydj7+lI1dpi1HGSjiYJjwKGInoFk4Ubtr7aQ== dependencies: core-js "^3.0.1" -"@storybook/client-api@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.6.tgz#458141e85f8e564a2819b51b062bac2618821b6a" - integrity sha512-bp6MMsjprb7R1lrX4491WDaKKUItvzkh/GXU19GEOPdf490w8+dqZHisoNvVoMr6fACdiMwagxdN/+ZPHxd+Rg== +"@storybook/client-api@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.7.tgz#3a13d2b0c9bbc20af448121011b304c10e355644" + integrity sha512-cmoOYCVK6F7EceHHeo0oK61ic0LST96DWbb8KICL1c+8I+sI0fGLobSsBbOCzDgzz2gqPAQoxxpF+T4kLyLFcQ== dependencies: - "@storybook/addons" "5.3.6" - "@storybook/channel-postmessage" "5.3.6" - "@storybook/channels" "5.3.6" - "@storybook/client-logger" "5.3.6" - "@storybook/core-events" "5.3.6" + "@storybook/addons" "5.3.7" + "@storybook/channel-postmessage" "5.3.7" + "@storybook/channels" "5.3.7" + "@storybook/client-logger" "5.3.7" + "@storybook/core-events" "5.3.7" "@storybook/csf" "0.0.1" core-js "^3.0.1" eventemitter3 "^4.0.0" @@ -2977,20 +2957,20 @@ ts-dedent "^1.1.0" util-deprecate "^1.0.2" -"@storybook/client-logger@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.6.tgz#d37ac813701e8a3cc1e25b6ec017808142a421a0" - integrity sha512-B9FOMLJOmqgibxfPY9yEKXZjNWoSZ9uW7tzdwTFydvcXVf3hSGdJa102w0jEGmgautRRRQOnJ1MXkVJlMnI3MQ== +"@storybook/client-logger@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.7.tgz#ee258a8ba0121b579c719b878e3635d6ff020abd" + integrity sha512-DeacBEGXsvB6ytRjLabwGCQX6OzL2+aaTOCMcuENnMqb7qdTV2G56NodLo3i5gHoLhlvsh109hSkLhFIFHtYWQ== dependencies: core-js "^3.0.1" -"@storybook/components@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.6.tgz#6fe38ac9ba62c982842bfcb06690c3f4fef8be06" - integrity sha512-9XhQyTF884XFdCdsJT2/xRTmMW2a1CBpZCHHC/Xvs85AZ9YeLcp7eDfeu72KMa7FApKH5wuh4JiY5nBgmkQShg== +"@storybook/components@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.7.tgz#8b7361fef02f042c5bad979b4d6886863d3b6a31" + integrity sha512-WTHdoxMLVczlcPjQWjmpOo+mLqpZGSSl9ACPZacQp3w1WitswI4tmmrLc76YCCidDE+OGAtqFYD9C9LtKe7ZSA== dependencies: - "@storybook/client-logger" "5.3.6" - "@storybook/theming" "5.3.6" + "@storybook/client-logger" "5.3.7" + "@storybook/theming" "5.3.7" "@types/react-syntax-highlighter" "11.0.2" "@types/react-textarea-autosize" "^4.3.3" core-js "^3.0.1" @@ -3011,33 +2991,33 @@ simplebar-react "^1.0.0-alpha.6" ts-dedent "^1.1.0" -"@storybook/core-events@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.6.tgz#41760f8a61958cfa2a468084460da08339c74d9b" - integrity sha512-EO9fyMY9O+jjPb9tKIjh+laMy33UPcejnkKq03uv82+VymwU4O9G/FW/JHzjDM0h0ycGy07/5JLfbMtXyCXT3w== +"@storybook/core-events@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.7.tgz#9297277ae5868b87d3cc36f08415da1579cdb8df" + integrity sha512-wDHznUy6BU+ML0EnovDWBow7s7rH1ng26xoHIWSl2VhjARJiVSGVROvwgj5DctEny8gmkZkByOiEVZ+0PYA/hw== dependencies: core-js "^3.0.1" -"@storybook/core@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.3.6.tgz#689073a6d92a4dbeaa23013356e1f411edcde84f" - integrity sha512-0ROrZi4VlX48/bBMywy94Er5kzktiyYttiL0A7V90PB8U6cRQE73ec8lWKlgz7uSLqBt9jHc00AWIQbNeHNRxw== +"@storybook/core@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.3.7.tgz#6196661c12709e6acffaa42baea1a891bed50706" + integrity sha512-DEmG5UeXm4BJUvdtCN9WBHRSeQ2lnbEuiqxB9SIbsitleCcdnX2aFrMfyoTHUZNqnbnefJXUMnGT0wvwm7yGDA== dependencies: "@babel/plugin-proposal-class-properties" "^7.7.0" "@babel/plugin-proposal-object-rest-spread" "^7.6.2" "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-transform-react-constant-elements" "^7.2.0" "@babel/preset-env" "^7.4.5" - "@storybook/addons" "5.3.6" - "@storybook/channel-postmessage" "5.3.6" - "@storybook/client-api" "5.3.6" - "@storybook/client-logger" "5.3.6" - "@storybook/core-events" "5.3.6" + "@storybook/addons" "5.3.7" + "@storybook/channel-postmessage" "5.3.7" + "@storybook/client-api" "5.3.7" + "@storybook/client-logger" "5.3.7" + "@storybook/core-events" "5.3.7" "@storybook/csf" "0.0.1" - "@storybook/node-logger" "5.3.6" - "@storybook/router" "5.3.6" - "@storybook/theming" "5.3.6" - "@storybook/ui" "5.3.6" + "@storybook/node-logger" "5.3.7" + "@storybook/router" "5.3.7" + "@storybook/theming" "5.3.7" + "@storybook/ui" "5.3.7" airbnb-js-shims "^2.2.1" ansi-to-html "^0.6.11" autoprefixer "^9.7.2" @@ -3104,21 +3084,22 @@ dependencies: lodash "^4.17.15" -"@storybook/node-logger@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.6.tgz#6fd62d46ba6972e332bf5da290f87fae971645e2" - integrity sha512-NqymsJCArX1TIAe6Hs5hS5PGI57Yrz7UqyRtPMiOoNhWVkAyFip+hGbHbA3Qe4dQCirBK0F9tSZ96Xy5wvVRNg== +"@storybook/node-logger@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.7.tgz#cdbd6560c8f2067cc8993bfe21f024c195789793" + integrity sha512-l59EoDorDkwEX7KOtBmNapsuoX3huWAFj1cyOS41mqoXhlpuIWoOQSiKHRlFA3/6g+p1NSbF5+Wr4k6xsIkUww== dependencies: + "@types/npmlog" "^4.1.2" chalk "^3.0.0" core-js "^3.0.1" npmlog "^4.1.2" pretty-hrtime "^1.0.3" regenerator-runtime "^0.13.3" -"@storybook/router@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.6.tgz#0e2dc80070b88d550303e43c333ffdf52d1cae1b" - integrity sha512-g3gri0j2VYM0YFyERL8KGMwYbkASneOm6MZdasS6EWXdE6+piONNC5lTPk03v5Js8LJA8LPTjyNlUwfK3plJWw== +"@storybook/router@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.7.tgz#64e06a319ada9e783029a2d3e3c6a6ddf9b5a1ad" + integrity sha512-o9DZLe+TvFR1hLvRflUODw+XUvIgU87gh5xMBhuzglx3akywc/sPqM+ORBaOtAb169wpV2hvpjolteVPi5+W8Q== dependencies: "@reach/router" "^1.2.1" "@storybook/csf" "0.0.1" @@ -3130,14 +3111,14 @@ qs "^6.6.0" util-deprecate "^1.0.2" -"@storybook/theming@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.6.tgz#e37f5cbfbadb888e462d60c6db7cd6bc976a4767" - integrity sha512-Z7T+qyrjN2ag5/djmM5adZ6CbBKdPLHGwTgyZiKi3YWbWF1KcRTk3RgK7gtgeqqEFHA6KJsD0ubZ7kqHO2e9Sg== +"@storybook/theming@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.7.tgz#90ba738f3324f70d88ab412528a8240e9936093d" + integrity sha512-n73uvJrurBQAl1+FHBw8pNUjEnOQKfxRezbZJPZbhJNULSJ7EiPJKyAHvZyx82sUoTY4r8eGgEotU47jWKBLlA== dependencies: "@emotion/core" "^10.0.20" "@emotion/styled" "^10.0.17" - "@storybook/client-logger" "5.3.6" + "@storybook/client-logger" "5.3.7" core-js "^3.0.1" deep-object-diff "^1.1.0" emotion-theming "^10.0.19" @@ -3148,20 +3129,20 @@ resolve-from "^5.0.0" ts-dedent "^1.1.0" -"@storybook/ui@5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.3.6.tgz#43f72ad1adf95e9b50b83f812373d5853706f72a" - integrity sha512-yYzS4zZPa3Uoc4O/IYO7GdKrkJWAuEpcrRy1FNxpSxboXm1HMomgK1Iv1+Sptoy85lRJ79d9qGzi1r/Pt1FjcQ== +"@storybook/ui@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.3.7.tgz#f46c9322301ee67121e0a9c3f1bc0d81de7d0888" + integrity sha512-9yVMEcf0CF6yM9QbJ2HXqeQG3iXoW1I6B/MU/1AFytruNASeMRHU+0KEq2vgF6nXcA8X80J4I5c2KY742M6Qjw== dependencies: "@emotion/core" "^10.0.20" - "@storybook/addons" "5.3.6" - "@storybook/api" "5.3.6" - "@storybook/channels" "5.3.6" - "@storybook/client-logger" "5.3.6" - "@storybook/components" "5.3.6" - "@storybook/core-events" "5.3.6" - "@storybook/router" "5.3.6" - "@storybook/theming" "5.3.6" + "@storybook/addons" "5.3.7" + "@storybook/api" "5.3.7" + "@storybook/channels" "5.3.7" + "@storybook/client-logger" "5.3.7" + "@storybook/components" "5.3.7" + "@storybook/core-events" "5.3.7" + "@storybook/router" "5.3.7" + "@storybook/theming" "5.3.7" copy-to-clipboard "^3.0.8" core-js "^3.0.1" core-js-pure "^3.0.1" @@ -3302,16 +3283,21 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== -"@types/node@13.1.7": - version "13.1.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.7.tgz#db51d28b8dfacfe4fb2d0da88f5eb0a2eca00675" - integrity sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg== +"@types/node@13.1.8": + version "13.1.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.8.tgz#1d590429fe8187a02707720ecf38a6fe46ce294b" + integrity sha512-6XzyyNM9EKQW4HKuzbo/CkOIjn/evtCmsU+MUM1xDfJ+3/rNjBttM1NgN7AOQvN6tP1Sl1D1PIKMreTArnxM9A== "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/npmlog@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4" + integrity sha512-4QQmOF5KlwfxJ5IGXFIudkeLCdMABz03RcUXu+LCb24zmln8QW6aDjuGl4d4XPVLf2j+FnjelHTP7dvceAFbhA== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -4397,15 +4383,15 @@ babel-preset-jest@^24.9.0: babel-plugin-transform-undefined-to-void "^6.9.4" lodash "^4.17.11" -babylonjs-gltf2interface@4.1.0-beta.20: - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.20.tgz#90368bda475b3857b3043913d6358f8c4604d05b" - integrity sha512-Y3hGTh+5Yhywc7k8p8n49KKk3Od8u9pSgIp4OOjxliGSuRtc301chifpfVThgcs7UVoowfCXXxdB6mrUzRnFXw== +babylonjs-gltf2interface@4.1.0-beta.21: + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-4.1.0-beta.21.tgz#11ab9e63efd24f20d9ae3134c4964aa72e54fb16" + integrity sha512-crDU71gqlQWZ1cnL09OxgmieHmeFt5aWPipcH1hPYWQR1LgdhHzRRjF2CGNb6/h0gFV/2uK8WJaIKFeNY6K5kg== -babylonjs@4.1.0-beta.20: - version "4.1.0-beta.20" - resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.20.tgz#46ce13e315f37e98d8930c561f49f81761b6c704" - integrity sha512-FU52D50wsS3Gr/VXWmLEKAqCOA4tuw+BIPJWnCaKmTN644k9IKyzOsZnMz+WulyC29Uce3duUKgv+PCpRMCKig== +babylonjs@4.1.0-beta.21: + version "4.1.0-beta.21" + resolved "https://registry.yarnpkg.com/babylonjs/-/babylonjs-4.1.0-beta.21.tgz#8dab6b1f023502d736d9af18d4076b955cfe4665" + integrity sha512-qxeSaMWpoVVBBdqzmdzet24OxgpNuTE8EvEP5c3VBH7f1YUshbMagjlJiq9kibvbGP+7IXZHEu4quhlMRl6Slg== bail@^1.0.0: version "1.0.4" From 6eada692a65127af2105c11d2a525d47464c3cd6 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Tue, 21 Jan 2020 11:44:57 +0100 Subject: [PATCH 76/84] feat(ui): color-dialog (#19) * feat(ui): color-dialog * refactor(ui): always open dialog in story * refactor(ui): flatten config to just menus & type safety in story * feat(ui): pass colors to color-dialog * refactor(ui): make data & return value type-safe. * refactor(ui): extract interface `UiColorDialogData` * refactor(ui): extract open into `UiColorDialogService` * test(ui): s/UiMenuBarConfig/UiMenuBarMenu * refactor(ui): provide `selectedColorIndex` --- .../menu-bar-container.component.ts | 40 +++++------ .../menu-bar/menu-bar.component.spec.ts | 46 ++++++------ .../color-dialog.component.scss | 35 ++++++++++ .../color-dialog.component.spec.ts | 30 ++++++++ .../color-dialog.component.stories.ts | 55 +++++++++++++++ .../color-dialog.component.ts | 70 +++++++++++++++++++ .../draggable-dialog/color-dialog.module.ts | 28 ++++++++ .../draggable-dialog/color-dialog.service.ts | 29 ++++++++ .../lib/menu-bar/menu-bar.component.spec.ts | 18 ++--- .../menu-bar/menu-bar.component.stories.ts | 38 +++++----- .../ui/src/lib/menu-bar/menu-bar.component.ts | 10 +-- 11 files changed, 314 insertions(+), 85 deletions(-) create mode 100644 libs/ui/src/lib/draggable-dialog/color-dialog.component.scss create mode 100644 libs/ui/src/lib/draggable-dialog/color-dialog.component.spec.ts create mode 100644 libs/ui/src/lib/draggable-dialog/color-dialog.component.stories.ts create mode 100644 libs/ui/src/lib/draggable-dialog/color-dialog.component.ts create mode 100644 libs/ui/src/lib/draggable-dialog/color-dialog.module.ts create mode 100644 libs/ui/src/lib/draggable-dialog/color-dialog.service.ts diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts index a2e76188..5a8f6ff8 100644 --- a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts @@ -1,36 +1,34 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { Action, Store } from '@ngrx/store'; -import { UiMenuBarConfig } from '@talus/ui'; +import { UiMenuBarMenu } from '@talus/ui'; import * as fromApp from '../app.reducer'; import { redo, undo } from './menu-bar-container.actions'; @Component({ selector: 'fe-menu-bar-container', template: ` - + `, changeDetection: ChangeDetectionStrategy.OnPush, }) export class MenuBarContainerComponent { - menuConfig: UiMenuBarConfig = { - menus: [ - { - label: 'Edit', - menuItems: [ - { - icon: 'undo', - label: 'Undo', - value: undo(), - }, - { - icon: 'redo', - label: 'Redo', - value: redo(), - }, - ], - }, - ], - }; + menus: UiMenuBarMenu[] = [ + { + label: 'Edit', + menuItems: [ + { + icon: 'undo', + label: 'Undo', + value: undo(), + }, + { + icon: 'redo', + label: 'Redo', + value: redo(), + }, + ], + }, + ]; constructor(private store: Store) {} diff --git a/apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts b/apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts index 7ccab926..437c3f98 100644 --- a/apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts +++ b/apps/ui-e2e/src/integration/menu-bar/menu-bar.component.spec.ts @@ -1,38 +1,34 @@ -import { UiMenuBarConfig } from '@talus/ui'; +import { UiMenuBarMenu } from '@talus/ui'; -const menuConfig: UiMenuBarConfig = { - menus: [ - { - label: 'Edit', - menuItems: [ - { - icon: 'undo', - label: 'Undo', - value: 'undo()', - }, - { - icon: 'redo', - label: 'Redo', - value: 'redo()', - }, - ], - }, - ], -}; +const menus: UiMenuBarMenu[] = [ + { + label: 'Edit', + menuItems: [ + { + icon: 'undo', + label: 'Undo', + value: 'undo()', + }, + { + icon: 'redo', + label: 'Redo', + value: 'redo()', + }, + ], + }, +]; describe('ui', () => { beforeEach(() => - cy.visit( - `/iframe.html?id=uimenubarcomponent--primary&knob-menuConfig=${JSON.stringify(menuConfig)}`, - ), + cy.visit(`/iframe.html?id=uimenubarcomponent--primary&knob-menus=${JSON.stringify(menus)}`), ); it('should render all menus/menu-items & and open/close menu', () => { cy.get('ui-menu-bar').should('exist'); cy.get('.mat-menu-trigger').click(); - cy.get('.mat-menu-content').should('have.length', menuConfig.menus.length); - cy.get('.mat-menu-item').should('have.length', menuConfig.menus[0].menuItems.length); + cy.get('.mat-menu-content').should('have.length', menus.length); + cy.get('.mat-menu-item').should('have.length', menus[0].menuItems.length); cy.get('.cdk-overlay-backdrop').click(); cy.get('.mat-menu-content').should('not.exist'); diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.scss b/libs/ui/src/lib/draggable-dialog/color-dialog.component.scss new file mode 100644 index 00000000..9140e951 --- /dev/null +++ b/libs/ui/src/lib/draggable-dialog/color-dialog.component.scss @@ -0,0 +1,35 @@ +h1 { + margin-left: -2rem; + margin-right: -2rem; + margin-top: -2rem; + + mat-icon { + cursor: move; + } +} + +.spacer { + flex: 1 1 auto; +} + +.color-container { + display: flex; + flex-wrap: wrap; + padding: 0.5rem; + + .color { + cursor: pointer; + border-radius: 0.25rem; + margin: 0.5rem; + height: 2rem; + width: 2rem; + + mat-icon { + font-size: 1rem; + margin-left: 1rem; + margin-top: 1rem; + height: 1rem; + width: 1rem; + } + } +} diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.spec.ts b/libs/ui/src/lib/draggable-dialog/color-dialog.component.spec.ts new file mode 100644 index 00000000..0bf2627b --- /dev/null +++ b/libs/ui/src/lib/draggable-dialog/color-dialog.component.spec.ts @@ -0,0 +1,30 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { UiColorDialogComponent } from './color-dialog.component'; +import { UiColorDialogModule } from './color-dialog.module'; + +describe('DraggableDialogComponent', () => { + let component: UiColorDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [UiColorDialogModule], + providers: [ + // https://github.com/angular/components/issues/8419 + { provide: MatDialogRef, useValue: { close: () => {} } }, + { provide: MAT_DIALOG_DATA, useValue: {} }, + ], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UiColorDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.stories.ts b/libs/ui/src/lib/draggable-dialog/color-dialog.component.stories.ts new file mode 100644 index 00000000..99bc921c --- /dev/null +++ b/libs/ui/src/lib/draggable-dialog/color-dialog.component.stories.ts @@ -0,0 +1,55 @@ +import { CommonModule } from '@angular/common'; +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { number, object } from '@storybook/addon-knobs'; +import { Observable } from 'rxjs'; +import { UiColorDialogColor, UiColorDialogComponent } from './color-dialog.component'; +import { UiColorDialogModule } from './color-dialog.module'; +import { UiColorDialogService } from './color-dialog.service'; + +// noinspection AngularMissingOrInvalidDeclarationInModule +@Component({ + template: ` + + +
Result: {{ results$ | async | json }}
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +class UiColorDialogTestComponent implements OnInit { + @Input() colors: UiColorDialogColor[]; + @Input() selectedColorIndex: number; + + results$: Observable; + + constructor(public dialogService: UiColorDialogService) {} + + ngOnInit(): void { + this.onOpenClick(); + } + + onOpenClick(): void { + const dialogRef = this.dialogService.open(this.colors, this.selectedColorIndex); + + this.results$ = dialogRef.afterClosed(); + } +} + +export default { + title: 'UiColorDialogComponent', +}; + +export const primary = () => ({ + moduleMetadata: { + declarations: [UiColorDialogTestComponent], + imports: [CommonModule, UiColorDialogModule], + }, + component: UiColorDialogTestComponent, + props: { + selectedColorIndex: number('selectedColorIndex', 0), + colors: object('colors', [ + { r: 255, g: 0, b: 0, a: 0.8 }, + { r: 0, g: 255, b: 0, a: 0.6 }, + { r: 0, g: 0, b: 255, a: 0.4 }, + ]), + }, +}); diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.ts b/libs/ui/src/lib/draggable-dialog/color-dialog.component.ts new file mode 100644 index 00000000..0bdf5f39 --- /dev/null +++ b/libs/ui/src/lib/draggable-dialog/color-dialog.component.ts @@ -0,0 +1,70 @@ +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +export interface UiColorDialogColor { + r: number; + g: number; + b: number; + a: number; +} + +export interface UiColorDialogData { + colors: UiColorDialogColor[]; + selectedColorIndex?: number; +} + +@Component({ + template: ` +
+

+ + Color Selector + + drag_indicator + +

+ +
+

Choose here your color.

+ +
+
+ + check_circle_outline + +
+
+
+ +
+ +
+
+ `, + styleUrls: ['./color-dialog.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UiColorDialogComponent { + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: UiColorDialogData, + ) {} + + onCancelClick(): void { + this.dialogRef.close(); + } + + getRgbaString(color: UiColorDialogColor): string { + return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a} )`; + } +} diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.module.ts b/libs/ui/src/lib/draggable-dialog/color-dialog.module.ts new file mode 100644 index 00000000..66654a56 --- /dev/null +++ b/libs/ui/src/lib/draggable-dialog/color-dialog.module.ts @@ -0,0 +1,28 @@ +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { + MatButtonModule, + MatDialogModule, + MatIconModule, + MatToolbarModule, +} from '@angular/material'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { UiColorDialogComponent } from './color-dialog.component'; +import { UiColorDialogService } from './color-dialog.service'; + +@NgModule({ + declarations: [UiColorDialogComponent], + imports: [ + BrowserAnimationsModule, + CommonModule, + DragDropModule, + MatButtonModule, + MatDialogModule, + MatIconModule, + MatToolbarModule, + ], + providers: [UiColorDialogService], + entryComponents: [UiColorDialogComponent], +}) +export class UiColorDialogModule {} diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.service.ts b/libs/ui/src/lib/draggable-dialog/color-dialog.service.ts new file mode 100644 index 00000000..c976ab37 --- /dev/null +++ b/libs/ui/src/lib/draggable-dialog/color-dialog.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; +import { MatDialog, MatDialogRef } from '@angular/material'; +import { + UiColorDialogColor, + UiColorDialogComponent, + UiColorDialogData, +} from './color-dialog.component'; + +@Injectable() +export class UiColorDialogService { + constructor(public dialog: MatDialog) {} + + open( + colors: UiColorDialogColor[], + selectedColorIndex: number, + ): MatDialogRef { + const dialogRef = this.dialog.open< + UiColorDialogComponent, + UiColorDialogData, + UiColorDialogColor + >(UiColorDialogComponent, { + autoFocus: false, + data: { colors, selectedColorIndex }, + width: '350px', + }); + + return dialogRef; + } +} diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts index 6a971351..e2ba1a36 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.spec.ts @@ -1,13 +1,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { UiMenuBarModule } from '@talus/ui'; -import { UiMenuBarComponent } from './menu-bar.component'; +import { UiMenuBarComponent, UiMenuBarMenu } from './menu-bar.component'; +import { UiMenuBarModule } from './menu-bar.module'; describe('UiMenuBarComponent', () => { let component: UiMenuBarComponent; let fixture: ComponentFixture; - const expectedMenus = [ + const expectedMenus: UiMenuBarMenu[] = [ { label: 'Menu 1', menuItems: [ @@ -58,9 +58,7 @@ describe('UiMenuBarComponent', () => { }); it('should add all menus', () => { - component.menuConfig = { - menus: expectedMenus, - }; + component.menus = expectedMenus; fixture.detectChanges(); const menus = fixture.debugElement.queryAll(By.css('mat-menu')); @@ -73,9 +71,7 @@ describe('UiMenuBarComponent', () => { }); it('should add all menu-items for second menu', () => { - component.menuConfig = { - menus: expectedMenus, - }; + component.menus = expectedMenus; fixture.detectChanges(); const menuButtons = fixture.debugElement.queryAll(By.css('button')); @@ -91,9 +87,7 @@ describe('UiMenuBarComponent', () => { }); it('should emit value of clicked menu items', () => { - component.menuConfig = { - menus: expectedMenus, - }; + component.menus = expectedMenus; fixture.detectChanges(); const menuButtons = fixture.debugElement.queryAll(By.css('button')); diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts index 3f22ab02..83194e04 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.stories.ts @@ -1,5 +1,5 @@ import { object } from '@storybook/addon-knobs'; -import { UiMenuBarComponent, UiMenuBarConfig } from './menu-bar.component'; +import { UiMenuBarComponent, UiMenuBarMenu } from './menu-bar.component'; import { UiMenuBarModule } from './menu-bar.module'; export default { @@ -12,24 +12,22 @@ export const primary = () => ({ }, component: UiMenuBarComponent, props: { - menuConfig: object>('menuConfig', { - menus: [ - { - label: 'Edit', - menuItems: [ - { - icon: 'undo', - label: 'Undo', - value: 'Test undo value', - }, - { - icon: 'redo', - label: 'Redo', - value: 'Test redo value', - }, - ], - }, - ], - }), + menus: object[]>('menus', [ + { + label: 'Edit', + menuItems: [ + { + icon: 'undo', + label: 'Undo', + value: 'Test undo value', + }, + { + icon: 'redo', + label: 'Redo', + value: 'Test redo value', + }, + ], + }, + ]), }, }); diff --git a/libs/ui/src/lib/menu-bar/menu-bar.component.ts b/libs/ui/src/lib/menu-bar/menu-bar.component.ts index 010b1e28..ca6f0a29 100644 --- a/libs/ui/src/lib/menu-bar/menu-bar.component.ts +++ b/libs/ui/src/lib/menu-bar/menu-bar.component.ts @@ -1,10 +1,6 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; -export interface UiMenuBarConfig { - menus: UiMenuBarMenu[]; -} - -interface UiMenuBarMenu { +export interface UiMenuBarMenu { label: string; menuItems: UiMenuBarMenuItem[]; } @@ -19,7 +15,7 @@ interface UiMenuBarMenuItem { selector: 'ui-menu-bar', template: ` - + + `, + styleUrls: ['./options-panel.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class OptionsPanelComponent { + private cssColors$: Observable = this.store.pipe(select(fromApp.selectCssColors)); + + private selectedColorIndex$: Observable = this.store.pipe( + select(fromApp.selectSelectedColorIndex), + ); + + selectedCssColor$: Observable = this.store.pipe( + select(fromApp.selectSelectedCssColor), + ); + + cssColorsAndSelectedColorIndex$ = combineLatest([this.cssColors$, this.selectedColorIndex$]); + + constructor(public store: Store) {} + + onClick(colors: UiColorDialogColor[], selectedColorIndex: number): void { + this.store.dispatch(openColorDialog({ colors, selectedColorIndex })); + } + + getCssRgbaString(color: Rgba): string { + return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`; + } +} diff --git a/apps/frontend/src/app/options-panel/options-panel.effects.ts b/apps/frontend/src/app/options-panel/options-panel.effects.ts new file mode 100644 index 00000000..08de9e1a --- /dev/null +++ b/apps/frontend/src/app/options-panel/options-panel.effects.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { UiColorDialogService } from '@talus/ui'; +import { of } from 'rxjs'; +import { catchError, flatMap, map } from 'rxjs/operators'; +import { notNil } from '../rxjs/nil'; +import { openColorDialog, openColorDialogFailed, selectColor } from './options-panel.actions'; + +@Injectable() +export class OptionsPanelEffects { + constructor(private actions$: Actions, private colorDialogService: UiColorDialogService) {} + + openColorDialog$ = createEffect(() => + this.actions$.pipe( + ofType(openColorDialog), + map(({ colors, selectedColorIndex }) => + this.colorDialogService.open(colors, selectedColorIndex), + ), + flatMap(dialogRef => dialogRef.beforeClosed()), + notNil(), + map(selectedColorIndex => selectColor({ colorIndex: selectedColorIndex })), + catchError(() => of(openColorDialogFailed())), + ), + ); +} diff --git a/apps/frontend/src/app/options-panel/options-panel.module.ts b/apps/frontend/src/app/options-panel/options-panel.module.ts new file mode 100644 index 00000000..45e1df73 --- /dev/null +++ b/apps/frontend/src/app/options-panel/options-panel.module.ts @@ -0,0 +1,20 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule, MatIconModule } from '@angular/material'; +import { EffectsModule } from '@ngrx/effects'; +import { UiColorDialogModule } from '@talus/ui'; +import { OptionsPanelComponent } from './options-panel.component'; +import { OptionsPanelEffects } from './options-panel.effects'; + +@NgModule({ + declarations: [OptionsPanelComponent], + imports: [ + CommonModule, + EffectsModule.forFeature([OptionsPanelEffects]), + MatButtonModule, + MatIconModule, + UiColorDialogModule, + ], + exports: [OptionsPanelComponent], +}) +export class OptionsPanelModule {} diff --git a/apps/frontend/src/app/options-panel/options-panel.reducer.ts b/apps/frontend/src/app/options-panel/options-panel.reducer.ts new file mode 100644 index 00000000..af7188c3 --- /dev/null +++ b/apps/frontend/src/app/options-panel/options-panel.reducer.ts @@ -0,0 +1,80 @@ +import { createReducer, on } from '@ngrx/store'; +import { UiColorDialogColor } from '@talus/ui'; +import { Rgba } from '../model/rgba.value'; +import { selectColor } from './options-panel.actions'; + +export const featureKey = 'optionsPanel'; + +export interface State { + colors: Rgba[]; + selectedColorIndex: number; +} + +export const initialState: State = { + colors: [ + { + r: 255, + g: 255, + b: 255, + a: 255, + }, + { + r: 0, + g: 0, + b: 0, + a: 255, + }, + { + r: 0, + g: 0, + b: 255, + a: 255, + }, + { + r: 0, + g: 255, + b: 0, + a: 255, + }, + { + r: 0, + g: 255, + b: 255, + a: 255, + }, + { + r: 255, + g: 0, + b: 0, + a: 255, + }, + ], + selectedColorIndex: 4, +}; + +export const reducer = createReducer( + initialState, + on(selectColor, (state, { colorIndex }) => { + return { + ...state, + selectedColorIndex: colorIndex, + }; + }), +); + +export const selectColors = (state: State) => state.colors; +export const selectCssColors = (state: State) => { + return selectColors(state).map(convertRgbaToCssRgba); +}; + +export const selectSelectedColor = (state: State) => state.colors[state.selectedColorIndex]; +export const selectSelectedCssColor = (state: State) => { + return convertRgbaToCssRgba(selectSelectedColor(state)); +}; + +export const selectSelectedColorIndex = (state: State) => state.selectedColorIndex; + +const ALPHA_FACTOR = 1 / 255; +function convertRgbaToCssRgba(color: Rgba): UiColorDialogColor { + return { ...color, a: color.a * ALPHA_FACTOR }; +} diff --git a/apps/frontend/src/app/rxjs/nil.ts b/apps/frontend/src/app/rxjs/nil.ts new file mode 100644 index 00000000..09e2e2bd --- /dev/null +++ b/apps/frontend/src/app/rxjs/nil.ts @@ -0,0 +1,24 @@ +import { Observable } from 'rxjs'; +import { filter } from 'rxjs/operators'; + +/** + * Filters the observable until the value is not null or undefined. + */ +export function notNil(): (o: Observable) => Observable> { + return (o: Observable): Observable> => { + return o.pipe(filter(v => !isNil(v))) as Observable>; + }; +} + +/** + * Filters the observable until the value is null or undefined. + */ +export function nil(): (o: Observable) => Observable { + return (o: Observable): Observable => { + return o.pipe(filter(isNil)); + }; +} + +function isNil(value: any): boolean { + return value == null; +} diff --git a/apps/frontend/src/app/scene-viewer-container/grid.service.ts b/apps/frontend/src/app/scene-viewer-container/grid.service.ts index 13fd43dd..bc9498d5 100644 --- a/apps/frontend/src/app/scene-viewer-container/grid.service.ts +++ b/apps/frontend/src/app/scene-viewer-container/grid.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { Coord, Grid, MeshData, nodeToMesh } from '@talus/vdb'; +import { intToRgba } from '../model/rgba.value'; /** * Keeps the mutable state of the single grid. This state is not part of the store, due to @@ -23,6 +24,8 @@ export class GridService { 7: [1, 1, 1, 1], }; + private readonly alphaFactor = 1 / 255; + /** * Sets a new voxel via accessor to share access path. * @returns origin of `InternalNode1` of affected node (node containing added voxel). @@ -81,9 +84,15 @@ export class GridService { return nodeToMesh(internal1, this.valueToColor); } - private valueToColor = (value: number): [number, number, number, number] => { - return this.colors[value % 8]; + const rgba = intToRgba(value); + + return [ + rgba.r * this.alphaFactor, + rgba.g * this.alphaFactor, + rgba.b * this.alphaFactor, + rgba.a * this.alphaFactor, + ]; }; } diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts index db72b855..f6690bd6 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.spec.ts @@ -7,7 +7,9 @@ import { UiPointerButton, UiPointerPickInfo } from '@talus/ui'; import { Coord } from '@talus/vdb'; import { Subject } from 'rxjs'; import * as fromApp from '../app.reducer'; -import { Tool } from '../tools-panel/tool.model'; +import { rgbaToInt } from '../model/rgba.value'; +import { Tool } from '../model/tool.value'; +import { initialMockState } from '../testing'; import { removeVoxel, setVoxel } from './scene-viewer-container.actions'; import { SceneViewerContainerComponent } from './scene-viewer-container.component'; @@ -32,7 +34,11 @@ describe('SceneViewerContainerComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [SceneViewerContainerComponent, SceneViewerStubComponent], - providers: [provideMockStore()], + providers: [ + provideMockStore({ + initialState: initialMockState, + }), + ], }).compileComponents(); mockStore = TestBed.get(Store); @@ -117,8 +123,19 @@ describe('SceneViewerContainerComponent', () => { ])( 'should dispatch `setVoxel` action for %j', (pickedPoint: Coord, xyz: Coord, normal: Coord) => { - const initialAction = setVoxel({ xyz: [0, 0, 0], newValue: 42 }); - const action = setVoxel({ xyz, newValue: 1 }); + const initialAction = setVoxel({ + xyz: [0, 0, 0], + newValue: rgbaToInt({ r: 0, g: 255, b: 0, a: 255 }), + }); + const action = setVoxel({ + xyz, + newValue: rgbaToInt({ + r: 0, + g: 255, + b: 255, + a: 255, + }), + }); stubComponent.pointerPick.next({ pickedPoint, diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts index 6a25e96f..eafeb498 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.component.ts @@ -4,17 +4,18 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, ViewChild } from '@a import { select, Store } from '@ngrx/store'; import { UiPointerButton, UiPointerPickInfo, UiSceneViewerComponent } from '@talus/ui'; import { Coord } from '@talus/vdb'; -import { Observable } from 'rxjs'; +import { combineLatest, Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; -import { Tool } from '../tools-panel/tool.model'; +import { Rgba, rgbaToInt } from '../model/rgba.value'; +import { Tool } from '../model/tool.value'; import { paintVoxel, removeVoxel, setVoxel } from './scene-viewer-container.actions'; @Component({ selector: 'fe-scene-viewer-container', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, @@ -23,17 +24,20 @@ export class SceneViewerContainerComponent implements AfterViewInit { @ViewChild(UiSceneViewerComponent, { static: false }) private sceneViewerComponent: UiSceneViewerComponent; - selectedToolId$: Observable = this.store.pipe(select(fromApp.selectSelectedToolId)); - voxelCount$: Observable = this.store.pipe(select(fromApp.selectVoxelCount)); + private selectedToolId$: Observable = this.store.pipe(select(fromApp.selectSelectedToolId)); + private selectedColor$: Observable = this.store.pipe(select(fromApp.selectSelectedColor)); + selectedToolIdAndColor$ = combineLatest([this.selectedToolId$, this.selectedColor$]); constructor(private store: Store) {} ngAfterViewInit(): void { - this.store.dispatch(setVoxel({ xyz: [0, 0, 0], newValue: 42 })); + this.store.dispatch( + setVoxel({ xyz: [0, 0, 0], newValue: rgbaToInt({ r: 0, g: 255, b: 0, a: 255 }) }), + ); } - onPointerPick(event: UiPointerPickInfo, selectedToolId: Tool): void { - this.dispatchPickAction(event, selectedToolId); + onPointerPick(event: UiPointerPickInfo, selectedToolId: Tool, selectedColor: Rgba): void { + this.dispatchPickAction(event, selectedToolId, selectedColor); } // onMeshPick(mesh: AbstractMesh): void { @@ -41,21 +45,29 @@ export class SceneViewerContainerComponent implements AfterViewInit { // mesh.renderOutline = !mesh.renderOutline; // } - private dispatchPickAction(pickInfo: UiPointerPickInfo, selectedToolId: Tool): void { + private dispatchPickAction( + pickInfo: UiPointerPickInfo, + selectedToolId: Tool, + selectedColor: Rgba, + ): void { if (pickInfo.pointerButton !== UiPointerButton.Main) { return; } + const colorInt = rgbaToInt(selectedColor); + switch (selectedToolId) { case Tool.SetVoxel: - this.store.dispatch(setVoxel({ xyz: this.calcVoxelToAddPosition(pickInfo), newValue: 1 })); + this.store.dispatch( + setVoxel({ xyz: this.calcVoxelToAddPosition(pickInfo), newValue: colorInt }), + ); break; case Tool.RemoveVoxel: this.store.dispatch(removeVoxel({ xyz: this.calcClickedVoxelPosition(pickInfo) })); break; case Tool.PaintVoxel: this.store.dispatch( - paintVoxel({ xyz: this.calcClickedVoxelPosition(pickInfo), newValue: 4 }), + paintVoxel({ xyz: this.calcClickedVoxelPosition(pickInfo), newValue: colorInt }), ); break; } diff --git a/apps/frontend/src/app/testing/index.ts b/apps/frontend/src/app/testing/index.ts new file mode 100644 index 00000000..e6f3e8f5 --- /dev/null +++ b/apps/frontend/src/app/testing/index.ts @@ -0,0 +1 @@ +export * from './initial-mock-state'; diff --git a/apps/frontend/src/app/testing/initial-mock-state.ts b/apps/frontend/src/app/testing/initial-mock-state.ts new file mode 100644 index 00000000..4aa99cd2 --- /dev/null +++ b/apps/frontend/src/app/testing/initial-mock-state.ts @@ -0,0 +1,12 @@ +import * as fromApp from '../app.reducer'; +import * as fromOptionsPanel from '../options-panel/options-panel.reducer'; +import * as fromSceneViewerContainer from '../scene-viewer-container/scene-viewer-container.reducer'; +import * as fromToolsPanel from '../tools-panel/tools-panel.reducer'; +import * as fromUndoRedo from '../undo-redo/undo-redo.reducer'; + +export const initialMockState: fromApp.State = { + [fromUndoRedo.featureKey]: fromUndoRedo.initialState, + [fromOptionsPanel.featureKey]: fromOptionsPanel.initialState, + [fromToolsPanel.featureKey]: fromToolsPanel.initialState, + [fromSceneViewerContainer.featureKey]: fromSceneViewerContainer.initialState, +}; diff --git a/apps/frontend/src/app/tools-panel/tools-panel.actions.ts b/apps/frontend/src/app/tools-panel/tools-panel.actions.ts index 1827a91b..3a4ad0ae 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.actions.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.actions.ts @@ -1,4 +1,4 @@ import { createAction, props } from '@ngrx/store'; -import { Tool } from './tool.model'; +import { Tool } from '../model/tool.value'; export const selectTool = createAction('[toolsPanel] Select tool', props<{ id: Tool }>()); diff --git a/apps/frontend/src/app/tools-panel/tools-panel.component.ts b/apps/frontend/src/app/tools-panel/tools-panel.component.ts index 4a1b0424..7c668c61 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.component.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.component.ts @@ -3,7 +3,7 @@ import { select, Store } from '@ngrx/store'; import { UiToolbarToolChange, UiToolbarToolConfig } from '@talus/ui'; import { Observable } from 'rxjs'; import * as fromApp from '../app.reducer'; -import { Tool } from './tool.model'; +import { Tool } from '../model/tool.value'; import { selectTool } from './tools-panel.actions'; @Component({ diff --git a/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts b/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts index 85bc93e6..3790b327 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.reducer.spec.ts @@ -1,4 +1,4 @@ -import { Tool } from './tool.model'; +import { Tool } from '../model/tool.value'; import { selectTool } from './tools-panel.actions'; import { reducer } from './tools-panel.reducer'; diff --git a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts index 5105d003..267c2b93 100644 --- a/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts +++ b/apps/frontend/src/app/tools-panel/tools-panel.reducer.ts @@ -1,5 +1,5 @@ import { createReducer, on } from '@ngrx/store'; -import { Tool } from './tool.model'; +import { Tool } from '../model/tool.value'; import { selectTool } from './tools-panel.actions'; export const featureKey = 'toolsPanel'; diff --git a/apps/frontend/src/app/typings/nil.d.ts b/apps/frontend/src/app/typings/nil.d.ts new file mode 100644 index 00000000..ed96da46 --- /dev/null +++ b/apps/frontend/src/app/typings/nil.d.ts @@ -0,0 +1 @@ +declare type Nil = undefined | null; diff --git a/libs/ui/src/index.ts b/libs/ui/src/index.ts index a93155a9..554ebb81 100644 --- a/libs/ui/src/index.ts +++ b/libs/ui/src/index.ts @@ -1,3 +1,4 @@ +export * from './lib/color-dialog'; export * from './lib/menu-bar'; export * from './lib/scene-viewer'; export * from './lib/sidenav-shell'; diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.scss b/libs/ui/src/lib/color-dialog/color-dialog.component.scss similarity index 100% rename from libs/ui/src/lib/draggable-dialog/color-dialog.component.scss rename to libs/ui/src/lib/color-dialog/color-dialog.component.scss diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.spec.ts b/libs/ui/src/lib/color-dialog/color-dialog.component.spec.ts similarity index 100% rename from libs/ui/src/lib/draggable-dialog/color-dialog.component.spec.ts rename to libs/ui/src/lib/color-dialog/color-dialog.component.spec.ts diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.stories.ts b/libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts similarity index 93% rename from libs/ui/src/lib/draggable-dialog/color-dialog.component.stories.ts rename to libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts index 99bc921c..54da5998 100644 --- a/libs/ui/src/lib/draggable-dialog/color-dialog.component.stories.ts +++ b/libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts @@ -11,7 +11,7 @@ import { UiColorDialogService } from './color-dialog.service'; template: ` -
Result: {{ results$ | async | json }}
+
Selected color index: {{ results$ | async | json }}
`, changeDetection: ChangeDetectionStrategy.OnPush, }) @@ -19,7 +19,7 @@ class UiColorDialogTestComponent implements OnInit { @Input() colors: UiColorDialogColor[]; @Input() selectedColorIndex: number; - results$: Observable; + results$: Observable; constructor(public dialogService: UiColorDialogService) {} diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.component.ts b/libs/ui/src/lib/color-dialog/color-dialog.component.ts similarity index 97% rename from libs/ui/src/lib/draggable-dialog/color-dialog.component.ts rename to libs/ui/src/lib/color-dialog/color-dialog.component.ts index 0bdf5f39..c4031ebc 100644 --- a/libs/ui/src/lib/draggable-dialog/color-dialog.component.ts +++ b/libs/ui/src/lib/color-dialog/color-dialog.component.ts @@ -37,7 +37,7 @@ export interface UiColorDialogData { class="color mat-elevation-z1" *ngFor="let color of data.colors; let i = index" [style.background-color]="getRgbaString(color)" - [mat-dialog-close]="color" + [mat-dialog-close]="i" > check_circle_outline diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.module.ts b/libs/ui/src/lib/color-dialog/color-dialog.module.ts similarity index 100% rename from libs/ui/src/lib/draggable-dialog/color-dialog.module.ts rename to libs/ui/src/lib/color-dialog/color-dialog.module.ts diff --git a/libs/ui/src/lib/draggable-dialog/color-dialog.service.ts b/libs/ui/src/lib/color-dialog/color-dialog.service.ts similarity index 56% rename from libs/ui/src/lib/draggable-dialog/color-dialog.service.ts rename to libs/ui/src/lib/color-dialog/color-dialog.service.ts index c976ab37..2834c555 100644 --- a/libs/ui/src/lib/draggable-dialog/color-dialog.service.ts +++ b/libs/ui/src/lib/color-dialog/color-dialog.service.ts @@ -12,17 +12,16 @@ export class UiColorDialogService { open( colors: UiColorDialogColor[], - selectedColorIndex: number, - ): MatDialogRef { - const dialogRef = this.dialog.open< + selectedColorIndex?: number, + ): MatDialogRef { + const dialogRef = this.dialog.open( UiColorDialogComponent, - UiColorDialogData, - UiColorDialogColor - >(UiColorDialogComponent, { - autoFocus: false, - data: { colors, selectedColorIndex }, - width: '350px', - }); + { + autoFocus: false, + data: { colors, selectedColorIndex }, + width: '350px', + }, + ); return dialogRef; } diff --git a/libs/ui/src/lib/color-dialog/index.ts b/libs/ui/src/lib/color-dialog/index.ts new file mode 100644 index 00000000..ea2f90a2 --- /dev/null +++ b/libs/ui/src/lib/color-dialog/index.ts @@ -0,0 +1,3 @@ +export * from './color-dialog.component'; +export * from './color-dialog.module'; +export * from './color-dialog.service'; diff --git a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts index 5dfeb749..bbd88e2c 100644 --- a/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts +++ b/libs/ui/src/lib/scene-viewer/scene-viewer.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@angular/core'; -import { AbstractMesh } from '@babylonjs/core'; // Babylon.js needs to target individual files to fully benefit from tree shaking. // See: https://doc.babylonjs.com/features/es6_support#tree-shaking import { ArcRotateCamera } from '@babylonjs/core/Cameras/arcRotateCamera'; import { PickingInfo } from '@babylonjs/core/Collisions/pickingInfo'; import { Engine } from '@babylonjs/core/Engines/engine'; import { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight'; -import '@babylonjs/core/Materials/standardMaterial'; +import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial'; import { Vector3 } from '@babylonjs/core/Maths/math.vector'; +import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; import { VertexBuffer } from '@babylonjs/core/Meshes/buffer'; import { Mesh } from '@babylonjs/core/Meshes/mesh'; import { VertexData } from '@babylonjs/core/Meshes/mesh.vertexData'; @@ -54,14 +54,16 @@ export class CameraFactory { */ @Injectable() export class UiSceneViewerService { - pointerPick$ = new Subject(); - private engine: Engine; private scene: Scene; + private standardMaterial: StandardMaterial; private gridNode: TransformNode; // @ts-ignore: noUnusedLocals private light: HemisphericLight; + private pointerPickSubject$ = new Subject(); + pointerPick$ = this.pointerPickSubject$.asObservable(); + constructor(private cameraFactory: CameraFactory, private engineFactory: EngineFactory) {} initialize(canvas: HTMLCanvasElement): void { @@ -88,21 +90,12 @@ export class UiSceneViewerService { if (mesh) { const data = new VertexData(); - const nodeMesh = new Mesh(meshName, this.scene, this.gridNode); - // https://www.html5gamedevs.com/topic/31617-mesh-without-indices/?tab=comments#comment-181659 - // https://doc.babylonjs.com/how_to/optimizing_your_scene#using-unindexed-meshes - nodeMesh._unIndexed = true; - data.colors = mesh.colors; data.normals = mesh.normals; data.positions = mesh.positions; - data.applyToMesh(nodeMesh); - - // https://doc.babylonjs.com/how_to/optimizing_your_scene - // https://www.html5gamedevs.com/topic/12504-performancedraw-calls/ - nodeMesh.freezeNormals(); - nodeMesh.freezeWorldMatrix(); + const nodeMesh = this.createUnIndexedAlphaMesh(meshName); + data.applyToMesh(nodeMesh, false); } } @@ -112,6 +105,13 @@ export class UiSceneViewerService { useGeometryUniqueIdsMap: true, useClonedMeshMap: true, }); + + // An as transparent flagged mesh does not write to the depth buffer when rendering. + // This can lead to potential artifacts. + // https://forum.babylonjs.com/t/hasvertexalpha-causes-problems-when-unindexed-is-used-directly + this.standardMaterial = new StandardMaterial('standardMaterial', this.scene); + this.standardMaterial.forceDepthWrite = true; + this.scene.freezeMaterials(); // Used only as parent to have all nodes grouped together @@ -155,11 +155,30 @@ export class UiSceneViewerService { normal: this.getNormal(pickInfo.pickedMesh, pickInfo.faceId), }; - this.pointerPick$.next(info); + this.pointerPickSubject$.next(info); } }; } + private createUnIndexedAlphaMesh(name: string): Mesh { + const mesh = new Mesh(name, this.scene, this.gridNode); + + // https://www.html5gamedevs.com/topic/31617-mesh-without-indices/?tab=comments#comment-181659 + // https://doc.babylonjs.com/how_to/optimizing_your_scene#using-unindexed-meshes + mesh.isUnIndexed = true; + + // https://forum.babylonjs.com/t/hasvertexalpha-causes-problems-when-unindexed-is-used-directly + mesh.hasVertexAlpha = true; + mesh.material = this.standardMaterial; + + // https://doc.babylonjs.com/how_to/optimizing_your_scene + // https://www.html5gamedevs.com/topic/12504-performancedraw-calls/ + mesh.freezeNormals(); + mesh.freezeWorldMatrix(); + + return mesh; + } + /** * PickingInfo.getNormal() requires to have indices which are not available * for an un-indexed custom mesh. Therefore, read normals directly from picked mesh. diff --git a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts index d4087cfa..c939e062 100644 --- a/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts +++ b/libs/ui/src/lib/sidenav-shell/sidenav-shell.component.ts @@ -14,6 +14,15 @@ export class UiSidenavShellContentComponent {} template: ` `, + styles: [ + ` + :host { + display: flex; + flex-flow: column; + align-items: center; + } + `, + ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class UiSidenavShellLeftComponent {} diff --git a/libs/vdb/src/lib/tools/node-to-mesh.ts b/libs/vdb/src/lib/tools/node-to-mesh.ts index d666417f..091bd9d8 100644 --- a/libs/vdb/src/lib/tools/node-to-mesh.ts +++ b/libs/vdb/src/lib/tools/node-to-mesh.ts @@ -175,8 +175,8 @@ export function nodeToMesh( v0[2], ); - // Front mesh.normals.push( + // Front 0, 0, 1, From d66908edc5993d724b9d884d661656152470c3ec Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Thu, 23 Jan 2020 16:44:05 +0100 Subject: [PATCH 79/84] feat(frontend): support dark & light theme (#21) --- angular.json | 2 +- apps/frontend/src/app/app.component.spec.ts | 8 ++++ apps/frontend/src/app/app.component.ts | 23 +++++++++++- .../menu-bar-container.actions.ts | 3 ++ .../menu-bar-container.component.ts | 37 +++++++++++++++++-- .../menu-bar-container.module.ts | 3 +- .../scene-viewer-container.reducer.ts | 10 +++++ apps/frontend/src/styles.scss | 3 -- apps/frontend/src/themes.scss | 35 ++++++++++++++++++ 9 files changed, 114 insertions(+), 10 deletions(-) create mode 100644 apps/frontend/src/themes.scss diff --git a/angular.json b/angular.json index fd538bf0..730702fc 100644 --- a/angular.json +++ b/angular.json @@ -24,7 +24,7 @@ "polyfills": "apps/frontend/src/polyfills.ts", "tsConfig": "apps/frontend/tsconfig.app.json", "assets": ["apps/frontend/src/favicon.ico", "apps/frontend/src/assets"], - "styles": ["apps/frontend/src/styles.scss"], + "styles": ["apps/frontend/src/styles.scss", "apps/frontend/src/themes.scss"], "scripts": [] }, "configurations": { diff --git a/apps/frontend/src/app/app.component.spec.ts b/apps/frontend/src/app/app.component.spec.ts index 2d25d8d3..82b08931 100644 --- a/apps/frontend/src/app/app.component.spec.ts +++ b/apps/frontend/src/app/app.component.spec.ts @@ -2,8 +2,11 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { async, TestBed } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { provideMockStore } from '@ngrx/store/testing'; import { UiSceneViewerTestModule, UiSidenavShellModule } from '@talus/ui'; import { AppComponent } from './app.component'; +import * as fromApp from './app.reducer'; +import { initialMockState } from './testing'; @Component({ selector: 'fe-menu-bar-container', @@ -49,6 +52,11 @@ describe('AppComponent', () => { UiSceneViewerTestModule, UiSidenavShellModule, ], + providers: [ + provideMockStore({ + initialState: initialMockState, + }), + ], }).compileComponents(); })); diff --git a/apps/frontend/src/app/app.component.ts b/apps/frontend/src/app/app.component.ts index c5af7e12..cb987a14 100644 --- a/apps/frontend/src/app/app.component.ts +++ b/apps/frontend/src/app/app.component.ts @@ -1,8 +1,14 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Renderer2 } from '@angular/core'; +import { select, Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import * as fromApp from './app.reducer'; @Component({ selector: 'fe-root', template: ` + +
@@ -34,4 +40,19 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; }) export class AppComponent { title = 'frontend'; + + isDarkTheme$: Observable = this.store.pipe( + select(fromApp.selectSceneViewerContainerState), + map(state => state.isDarkTheme), + ); + + constructor(private store: Store, private renderer: Renderer2) {} + + setTheme(isDarkTheme: boolean): void { + const toAddClass = isDarkTheme ? 'app-dark-theme' : 'app-light-theme'; + const toRemoveClass = isDarkTheme ? 'app-light-theme' : 'app-dark-theme'; + + this.renderer.addClass(document.body, toAddClass); + this.renderer.removeClass(document.body, toRemoveClass); + } } diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts index 04d964a2..c70a8e98 100644 --- a/apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.actions.ts @@ -4,3 +4,6 @@ const actionTypePrefix = `[menuBarContainer]`; export const undo = createAction(`${actionTypePrefix} Undo`); export const redo = createAction(`${actionTypePrefix} Redo`); + +export const setDarkTheme = createAction(`${actionTypePrefix} Set dark theme`); +export const setLightTheme = createAction(`${actionTypePrefix} Set light theme`); diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts index 5a8f6ff8..84422dcc 100644 --- a/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.component.ts @@ -1,18 +1,19 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { Action, Store } from '@ngrx/store'; +import { Action, select, Store } from '@ngrx/store'; import { UiMenuBarMenu } from '@talus/ui'; +import { map } from 'rxjs/operators'; import * as fromApp from '../app.reducer'; -import { redo, undo } from './menu-bar-container.actions'; +import { redo, setDarkTheme, setLightTheme, undo } from './menu-bar-container.actions'; @Component({ selector: 'fe-menu-bar-container', template: ` - + `, changeDetection: ChangeDetectionStrategy.OnPush, }) export class MenuBarContainerComponent { - menus: UiMenuBarMenu[] = [ + private readonly menus: UiMenuBarMenu[] = [ { label: 'Edit', menuItems: [ @@ -30,6 +31,34 @@ export class MenuBarContainerComponent { }, ]; + menus$ = this.store.pipe( + select(fromApp.selectSceneViewerContainerState), + map(state => state.isDarkTheme), + map(isDarkTheme => [ + ...this.menus, + { + label: 'View', + menuItems: [ + ...(isDarkTheme + ? [ + { + icon: 'brightness_5', + label: 'Light', + value: setLightTheme(), + }, + ] + : [ + { + icon: 'brightness_2', + label: 'Dark', + value: setDarkTheme(), + }, + ]), + ], + }, + ]), + ); + constructor(private store: Store) {} onMenuItemClick(action: Action): void { diff --git a/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts b/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts index 2347c696..1c2d1865 100644 --- a/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts +++ b/apps/frontend/src/app/menu-bar-container/menu-bar-container.module.ts @@ -1,10 +1,11 @@ +import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { UiMenuBarModule } from '@talus/ui'; import { MenuBarContainerComponent } from './menu-bar-container.component'; @NgModule({ declarations: [MenuBarContainerComponent], - imports: [UiMenuBarModule], + imports: [CommonModule, UiMenuBarModule], exports: [MenuBarContainerComponent], }) export class MenuBarContainerModule {} diff --git a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts index bb3dca08..db163ffd 100644 --- a/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts +++ b/apps/frontend/src/app/scene-viewer-container/scene-viewer-container.reducer.ts @@ -1,13 +1,16 @@ import { createReducer, on } from '@ngrx/store'; +import * as menuBarContainerActions from '../menu-bar-container/menu-bar-container.actions'; import { voxelRemoved, voxelSet } from './scene-viewer-container.actions'; export const featureKey = 'sceneViewerContainer'; export interface State { + isDarkTheme: boolean; voxelCount: number; } export const initialState: State = { + isDarkTheme: true, voxelCount: 0, }; @@ -25,6 +28,13 @@ export const reducer = createReducer( voxelCount: state.voxelCount - 1, }; }), + + on(menuBarContainerActions.setDarkTheme, state => { + return { ...state, isDarkTheme: true }; + }), + on(menuBarContainerActions.setLightTheme, state => { + return { ...state, isDarkTheme: false }; + }), ); export const selectVoxelCount = (state: State) => state.voxelCount; diff --git a/apps/frontend/src/styles.scss b/apps/frontend/src/styles.scss index 76c3ec8b..5fb5bb00 100644 --- a/apps/frontend/src/styles.scss +++ b/apps/frontend/src/styles.scss @@ -1,7 +1,4 @@ /* You can add global styles to this file, and also import other style files */ - -@import '~@angular/material/prebuilt-themes/purple-green.css'; - html, body { height: 100%; diff --git a/apps/frontend/src/themes.scss b/apps/frontend/src/themes.scss new file mode 100644 index 00000000..eeef02b9 --- /dev/null +++ b/apps/frontend/src/themes.scss @@ -0,0 +1,35 @@ +/** + * https://material.angular.io/guide/theming#multiple-themes + */ + +@import '~@angular/material/theming'; +// Plus imports for other components in your app. + +// Include the common styles for Angular Material. We include this here so that you only +// have to load a single css file for Angular Material in your app. +// Be sure that you only ever include this mixin once! +@include mat-core(); + +// Define the palettes for your theme using the Material Design palettes available in palette.scss +// (imported above). For each palette, you can optionally specify a default, lighter, and darker +// hue. Available color palettes: https://material.io/design/color/ +$app-primary: mat-palette($mat-indigo); +$app-accent: mat-palette($mat-pink, A200, A100, A400); + +// The warn palette is optional (defaults to red). +$app-warn: mat-palette($mat-red); + +// Create the theme object (a Sass map containing all of the palettes). +$app-theme: mat-light-theme($app-primary, $app-accent, $app-warn); + +// Include theme styles for core and each component used in your app. +// Alternatively, you can import and @include the theme mixins for each component +// that you are using. + +.app-light-theme { + @include angular-material-theme(mat-light-theme($app-primary, $app-accent, $app-warn)); +} + +.app-dark-theme { + @include angular-material-theme(mat-dark-theme($app-primary, $app-accent, $app-warn)); +} From 083b8a39e447d92cbdc2e5eab97a8517af2fd246 Mon Sep 17 00:00:00 2001 From: Philippe Morier Date: Thu, 23 Jan 2020 17:05:19 +0100 Subject: [PATCH 80/84] feat(ui): add theme toggle to storybook (#22) --- libs/ui/.storybook/preview-body.html | 1 + libs/ui/.storybook/preview-head.html | 37 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 libs/ui/.storybook/preview-body.html diff --git a/libs/ui/.storybook/preview-body.html b/libs/ui/.storybook/preview-body.html new file mode 100644 index 00000000..e00ba780 --- /dev/null +++ b/libs/ui/.storybook/preview-body.html @@ -0,0 +1 @@ + diff --git a/libs/ui/.storybook/preview-head.html b/libs/ui/.storybook/preview-head.html index 00d17055..0848cb25 100644 --- a/libs/ui/.storybook/preview-head.html +++ b/libs/ui/.storybook/preview-head.html @@ -1 +1,38 @@ + + + + From 15520e40f8ca201b13e25d8d9cb5343db3c4b5aa Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 23 Jan 2020 17:07:31 +0100 Subject: [PATCH 81/84] feat(ui): remove `mat-button` from story --- libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts b/libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts index 54da5998..31a89085 100644 --- a/libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts +++ b/libs/ui/src/lib/color-dialog/color-dialog.component.stories.ts @@ -9,7 +9,7 @@ import { UiColorDialogService } from './color-dialog.service'; // noinspection AngularMissingOrInvalidDeclarationInModule @Component({ template: ` - +
Selected color index: {{ results$ | async | json }}
`, From 5749bf4bf96a09cee132c10b3e06bffcd614611a Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 23 Jan 2020 17:12:00 +0100 Subject: [PATCH 82/84] build(dep): update `@storybook` to `v5.3.8` --- package.json | 4 +- yarn.lock | 219 ++++++++++++++++++++++++++------------------------- 2 files changed, 115 insertions(+), 108 deletions(-) diff --git a/package.json b/package.json index d9b6013d..30b93e92 100644 --- a/package.json +++ b/package.json @@ -66,8 +66,8 @@ "@nrwl/node": "8.11.2", "@nrwl/storybook": "8.11.2", "@nrwl/workspace": "8.11.2", - "@storybook/addon-knobs": "5.3.7", - "@storybook/angular": "5.3.7", + "@storybook/addon-knobs": "5.3.8", + "@storybook/angular": "5.3.8", "@types/benchmark": "1.0.31", "@types/jest": "24.9.0", "@types/node": "13.1.8", diff --git a/yarn.lock b/yarn.lock index 50d0bfd5..89a72110 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2837,17 +2837,17 @@ semver "6.3.0" semver-intersect "1.4.0" -"@storybook/addon-knobs@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.7.tgz#2897f8b8a6bed592f128271439b64106b92f61ac" - integrity sha512-Qx8X62fDSjo00FiK/5IU9ztzmN40xIRc3qbCpkVkfMA7bxmmrhwinc5KC1saNApVNdMitgU1FTOsE7ExMk4+0g== - dependencies: - "@storybook/addons" "5.3.7" - "@storybook/api" "5.3.7" - "@storybook/client-api" "5.3.7" - "@storybook/components" "5.3.7" - "@storybook/core-events" "5.3.7" - "@storybook/theming" "5.3.7" +"@storybook/addon-knobs@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.8.tgz#c011ef54925a552e4f3c245deffec012dc51779c" + integrity sha512-QjJ0VMWFuzTFMl7j7p4y1hpYWQ3E8jIv7K2EyBvx+0PHX1ytwGTlTDs+KA84SVvVHT4kwGHVEqJ0SvFFaLDxqg== + dependencies: + "@storybook/addons" "5.3.8" + "@storybook/api" "5.3.8" + "@storybook/client-api" "5.3.8" + "@storybook/components" "5.3.8" + "@storybook/core-events" "5.3.8" + "@storybook/theming" "5.3.8" "@types/react-color" "^3.0.1" copy-to-clipboard "^3.0.8" core-js "^3.0.1" @@ -2861,27 +2861,28 @@ react-lifecycles-compat "^3.0.4" react-select "^3.0.8" -"@storybook/addons@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.7.tgz#4b4502d916dd878762d09c6c2aa1bc5191ae94be" - integrity sha512-Kme86+u+ru3S90OD3brSO3sOy28aCYYB25CNSg4/7JLmcUn9XvPc+odQIAipZduNn+OYedJmuncuDz5Ze6RYdA== +"@storybook/addons@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.8.tgz#62d62bafd4a73195f617e39f3c61ec7e7837b1ee" + integrity sha512-670QGxDuS4ZkQa7SEAGgcFaO3WvedEVJaRAoCMs0AKP+sllrbph77oCm6W0NjM6bMGwhsKc8/ownOoAbec+haw== dependencies: - "@storybook/api" "5.3.7" - "@storybook/channels" "5.3.7" - "@storybook/client-logger" "5.3.7" - "@storybook/core-events" "5.3.7" + "@storybook/api" "5.3.8" + "@storybook/channels" "5.3.8" + "@storybook/client-logger" "5.3.8" + "@storybook/core-events" "5.3.8" core-js "^3.0.1" global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/angular@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-5.3.7.tgz#60a560e36acf321e2358b7f861c64b8ad43ba8d4" - integrity sha512-w4/IZ3Em3J+UOfA607WIgdnmnJwS6YI6KYyABXaREyu5UcWpCzy82Ar+TLaDrxAYM6OHg8YHGtrLz6txAm6zKg== +"@storybook/angular@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-5.3.8.tgz#b6e77c4fd5bed3b2d728fe94cb06e58b3a91e44d" + integrity sha512-XLb/PbPFfakY7osQMZwrYrOJA6d3mtyi6zeqDlhS6PqqhwHU5jFuaLt5wA7Rh82DCAfe73oQSKcO7BN/lV47uw== dependencies: - "@storybook/addons" "5.3.7" - "@storybook/core" "5.3.7" - "@storybook/node-logger" "5.3.7" + "@storybook/addons" "5.3.8" + "@storybook/core" "5.3.8" + "@storybook/node-logger" "5.3.8" + "@types/webpack-env" "^1.15.0" core-js "^3.0.1" fork-ts-checker-webpack-plugin "^3.0.1" global "^4.3.2" @@ -2891,18 +2892,18 @@ ts-loader "^6.0.1" tsconfig-paths-webpack-plugin "^3.2.0" -"@storybook/api@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.7.tgz#fa9126d851d506607d1ba93588d3599b9b9ea0b9" - integrity sha512-SIT2Z3VtxPn26rkHNCZHYlwmfBPty0QTyWKTgVcnXxUeC74IReGzwMLJgCszouCvHFYOTru8JNndQmhnPlsQiA== +"@storybook/api@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.8.tgz#5f887911c87d1e6e1d8c12106c17f05377c6544b" + integrity sha512-Pso860gtyRc8HJ0dUkprZBSPHNrQj2zpX+C2a4TdpXgM/IW8cDQaZ4JW8ShkxxT1upKTQzVKAuogh4uWfKCJVA== dependencies: "@reach/router" "^1.2.1" - "@storybook/channels" "5.3.7" - "@storybook/client-logger" "5.3.7" - "@storybook/core-events" "5.3.7" + "@storybook/channels" "5.3.8" + "@storybook/client-logger" "5.3.8" + "@storybook/core-events" "5.3.8" "@storybook/csf" "0.0.1" - "@storybook/router" "5.3.7" - "@storybook/theming" "5.3.7" + "@storybook/router" "5.3.8" + "@storybook/theming" "5.3.8" "@types/reach__router" "^1.2.3" core-js "^3.0.1" fast-deep-equal "^2.0.1" @@ -2917,35 +2918,36 @@ telejson "^3.2.0" util-deprecate "^1.0.2" -"@storybook/channel-postmessage@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.7.tgz#cf481b98424018f8e91150602f091efea46391cc" - integrity sha512-JuRrV+3MaNSmt5Ojsfd+Z6TJvCOZBeo7uNfA+ZueATe+So/Z9wC/Hy+0oypQ2diTL2Pas4G3uFIRRl5jKUsCZA== +"@storybook/channel-postmessage@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.8.tgz#76544f1fd276338df9f427eec11d3ec12de86215" + integrity sha512-dnWD39+ABBy4bkXIUnlgo9CArfWfQ9D3xYykY8GXLlNMIVlAQBqPmBIHrd05ly7Z1CDjh0WY7dLK7vNG5nZm6A== dependencies: - "@storybook/channels" "5.3.7" - "@storybook/client-logger" "5.3.7" + "@storybook/channels" "5.3.8" + "@storybook/client-logger" "5.3.8" core-js "^3.0.1" global "^4.3.2" telejson "^3.2.0" -"@storybook/channels@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.7.tgz#19a47c11cda72f98d7d1dc05e78c1e40bdc2bbdf" - integrity sha512-HYD9y6+mxBkypBd8az/MJj4qNkrrP+MbTTbwizhoz0NsYCVCb7Ydj7+lI1dpi1HGSjiYJjwKGInoFk4Ubtr7aQ== +"@storybook/channels@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.8.tgz#778696b791e49c19b8de95c4bfb0ebb363745059" + integrity sha512-nYcBRUE5k855saNqTRU8X2p6QEDE28T05rinJTC2IOZA+iemrZNSobe56lAXBuNZk4vQFuJQb0Caxuu9o4+ADw== dependencies: core-js "^3.0.1" -"@storybook/client-api@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.7.tgz#3a13d2b0c9bbc20af448121011b304c10e355644" - integrity sha512-cmoOYCVK6F7EceHHeo0oK61ic0LST96DWbb8KICL1c+8I+sI0fGLobSsBbOCzDgzz2gqPAQoxxpF+T4kLyLFcQ== +"@storybook/client-api@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.8.tgz#e2e461e915c5e5796638efb3913d59411a9012d4" + integrity sha512-jPdkPuTBQ7uLTAAcaB9m84o+pJDQy3N3zPuSkt8SFz3LdJS0WJESsaPqxUV1BL0Lzr8Y2wumjKwVgQLumhUmvA== dependencies: - "@storybook/addons" "5.3.7" - "@storybook/channel-postmessage" "5.3.7" - "@storybook/channels" "5.3.7" - "@storybook/client-logger" "5.3.7" - "@storybook/core-events" "5.3.7" + "@storybook/addons" "5.3.8" + "@storybook/channel-postmessage" "5.3.8" + "@storybook/channels" "5.3.8" + "@storybook/client-logger" "5.3.8" + "@storybook/core-events" "5.3.8" "@storybook/csf" "0.0.1" + "@types/webpack-env" "^1.15.0" core-js "^3.0.1" eventemitter3 "^4.0.0" global "^4.3.2" @@ -2957,20 +2959,20 @@ ts-dedent "^1.1.0" util-deprecate "^1.0.2" -"@storybook/client-logger@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.7.tgz#ee258a8ba0121b579c719b878e3635d6ff020abd" - integrity sha512-DeacBEGXsvB6ytRjLabwGCQX6OzL2+aaTOCMcuENnMqb7qdTV2G56NodLo3i5gHoLhlvsh109hSkLhFIFHtYWQ== +"@storybook/client-logger@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.8.tgz#2e846eb43c42e9602a2cf619c0f3ea7381e312b3" + integrity sha512-OaWVBwGcvQq2rArSNn+s/ePWWETwal5JQn00D6feWNxqprUkUb3aE6Ao/jgBcW/g3lDAQivT7wYwhP33tkx91w== dependencies: core-js "^3.0.1" -"@storybook/components@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.7.tgz#8b7361fef02f042c5bad979b4d6886863d3b6a31" - integrity sha512-WTHdoxMLVczlcPjQWjmpOo+mLqpZGSSl9ACPZacQp3w1WitswI4tmmrLc76YCCidDE+OGAtqFYD9C9LtKe7ZSA== +"@storybook/components@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.8.tgz#1d21a02ea0058fa8ee20d44248550f9f5b500114" + integrity sha512-V8ByPSGruChH0CeTFrABGWmY8EfFOukbYSH+Rul/AG2+xg7l0Mx8LJIeq63Yc3XAvAeRyvbwf1rLe3F5l4/QZA== dependencies: - "@storybook/client-logger" "5.3.7" - "@storybook/theming" "5.3.7" + "@storybook/client-logger" "5.3.8" + "@storybook/theming" "5.3.8" "@types/react-syntax-highlighter" "11.0.2" "@types/react-textarea-autosize" "^4.3.3" core-js "^3.0.1" @@ -2991,33 +2993,33 @@ simplebar-react "^1.0.0-alpha.6" ts-dedent "^1.1.0" -"@storybook/core-events@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.7.tgz#9297277ae5868b87d3cc36f08415da1579cdb8df" - integrity sha512-wDHznUy6BU+ML0EnovDWBow7s7rH1ng26xoHIWSl2VhjARJiVSGVROvwgj5DctEny8gmkZkByOiEVZ+0PYA/hw== +"@storybook/core-events@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.8.tgz#2cc85c8109e4734298b3e1f5919c764d6abbf2f4" + integrity sha512-2GGjZj+AM4OpxU7qI2ixBeek3eigMzlyvQnDpe7cZlWDzNPNvWTspiSyQScFrtD1XV/vJTHdgDBpGb3uNHz7Eg== dependencies: core-js "^3.0.1" -"@storybook/core@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.3.7.tgz#6196661c12709e6acffaa42baea1a891bed50706" - integrity sha512-DEmG5UeXm4BJUvdtCN9WBHRSeQ2lnbEuiqxB9SIbsitleCcdnX2aFrMfyoTHUZNqnbnefJXUMnGT0wvwm7yGDA== +"@storybook/core@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.3.8.tgz#7748875afdddc9fb0ca24d0b712cc9c25fcaad9d" + integrity sha512-srMeSseUrSmh4pTe9DBD7IdFcLZoIm5r2cnH0nzPNpbrCknegW1LLLuVmSz8wLjobIrU/GYs6AO0VxKDnnbXuw== dependencies: "@babel/plugin-proposal-class-properties" "^7.7.0" "@babel/plugin-proposal-object-rest-spread" "^7.6.2" "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-transform-react-constant-elements" "^7.2.0" "@babel/preset-env" "^7.4.5" - "@storybook/addons" "5.3.7" - "@storybook/channel-postmessage" "5.3.7" - "@storybook/client-api" "5.3.7" - "@storybook/client-logger" "5.3.7" - "@storybook/core-events" "5.3.7" + "@storybook/addons" "5.3.8" + "@storybook/channel-postmessage" "5.3.8" + "@storybook/client-api" "5.3.8" + "@storybook/client-logger" "5.3.8" + "@storybook/core-events" "5.3.8" "@storybook/csf" "0.0.1" - "@storybook/node-logger" "5.3.7" - "@storybook/router" "5.3.7" - "@storybook/theming" "5.3.7" - "@storybook/ui" "5.3.7" + "@storybook/node-logger" "5.3.8" + "@storybook/router" "5.3.8" + "@storybook/theming" "5.3.8" + "@storybook/ui" "5.3.8" airbnb-js-shims "^2.2.1" ansi-to-html "^0.6.11" autoprefixer "^9.7.2" @@ -3084,10 +3086,10 @@ dependencies: lodash "^4.17.15" -"@storybook/node-logger@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.7.tgz#cdbd6560c8f2067cc8993bfe21f024c195789793" - integrity sha512-l59EoDorDkwEX7KOtBmNapsuoX3huWAFj1cyOS41mqoXhlpuIWoOQSiKHRlFA3/6g+p1NSbF5+Wr4k6xsIkUww== +"@storybook/node-logger@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.8.tgz#dd6bfba5532adece7e387457ed8077edde008a20" + integrity sha512-/UL3fOWRRAR7zMP+66Bqn3wJPkzj5AtnBDHqqkhzFM/sqMn+fvJUXqxNm9C3+CVG1RtgFQ9qLPyb16LZ596a6A== dependencies: "@types/npmlog" "^4.1.2" chalk "^3.0.0" @@ -3096,10 +3098,10 @@ pretty-hrtime "^1.0.3" regenerator-runtime "^0.13.3" -"@storybook/router@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.7.tgz#64e06a319ada9e783029a2d3e3c6a6ddf9b5a1ad" - integrity sha512-o9DZLe+TvFR1hLvRflUODw+XUvIgU87gh5xMBhuzglx3akywc/sPqM+ORBaOtAb169wpV2hvpjolteVPi5+W8Q== +"@storybook/router@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.8.tgz#91eb8822e0aa6c5b59d2db1b52b88010d9800cc3" + integrity sha512-QYVYq1tbFwABEU3pxiEO4bSO+NJJX37LazN/j59QQkz8Tf9r5V9eMNxqVu5IeY3Gi0dQazLM1ghveNU4zb5MCg== dependencies: "@reach/router" "^1.2.1" "@storybook/csf" "0.0.1" @@ -3111,14 +3113,14 @@ qs "^6.6.0" util-deprecate "^1.0.2" -"@storybook/theming@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.7.tgz#90ba738f3324f70d88ab412528a8240e9936093d" - integrity sha512-n73uvJrurBQAl1+FHBw8pNUjEnOQKfxRezbZJPZbhJNULSJ7EiPJKyAHvZyx82sUoTY4r8eGgEotU47jWKBLlA== +"@storybook/theming@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.8.tgz#7c0cb31e65c9da690dab50a99996f3e7c106ce97" + integrity sha512-W3LDFoLg7wnBnqz1GB6EZpTOdFvNObwyKV2vDjY2YNFPc2TN/w4LAQA+4Lgh3Py0O1j1v3796QwOgui+i1W0pw== dependencies: "@emotion/core" "^10.0.20" "@emotion/styled" "^10.0.17" - "@storybook/client-logger" "5.3.7" + "@storybook/client-logger" "5.3.8" core-js "^3.0.1" deep-object-diff "^1.1.0" emotion-theming "^10.0.19" @@ -3129,20 +3131,20 @@ resolve-from "^5.0.0" ts-dedent "^1.1.0" -"@storybook/ui@5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.3.7.tgz#f46c9322301ee67121e0a9c3f1bc0d81de7d0888" - integrity sha512-9yVMEcf0CF6yM9QbJ2HXqeQG3iXoW1I6B/MU/1AFytruNASeMRHU+0KEq2vgF6nXcA8X80J4I5c2KY742M6Qjw== +"@storybook/ui@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.3.8.tgz#b2e314882b2fdda64425a24b12162f070320193e" + integrity sha512-S/Zf1BHuPGsh+RXV20IFS+FUNVQy/3x44Qr1sqwP1ehUUPXq2giosDXW6OV9gaKsUYEGhywRwDKTUlN8MkI4Jg== dependencies: "@emotion/core" "^10.0.20" - "@storybook/addons" "5.3.7" - "@storybook/api" "5.3.7" - "@storybook/channels" "5.3.7" - "@storybook/client-logger" "5.3.7" - "@storybook/components" "5.3.7" - "@storybook/core-events" "5.3.7" - "@storybook/router" "5.3.7" - "@storybook/theming" "5.3.7" + "@storybook/addons" "5.3.8" + "@storybook/api" "5.3.8" + "@storybook/channels" "5.3.8" + "@storybook/client-logger" "5.3.8" + "@storybook/components" "5.3.8" + "@storybook/core-events" "5.3.8" + "@storybook/router" "5.3.8" + "@storybook/theming" "5.3.8" copy-to-clipboard "^3.0.8" core-js "^3.0.1" core-js-pure "^3.0.1" @@ -3382,6 +3384,11 @@ "@types/unist" "*" "@types/vfile-message" "*" +"@types/webpack-env@^1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.0.tgz#bd9956d5044b1fb43e869a9ba9148862ff98d9fd" + integrity sha512-TfcyNecCz8Z9/s90gBOBniyzZrTru8u2Vp0VZODq4KEBaQu8bfXvu7o/KUOecMpzjbFPUA7aqgSq628Iue5BQg== + "@types/webpack-sources@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92" From 7871f3c0894bcc84b5e4276aeefdba0ba89aad5f Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 23 Jan 2020 17:19:37 +0100 Subject: [PATCH 83/84] build(dep): update `tslint` to `v6.0.0` --- package.json | 2 +- yarn.lock | 181 +++++++++++++++++++++++---------------------------- 2 files changed, 82 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index 30b93e92..62af9e6b 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "stylelint-scss": "3.13.0", "ts-jest": "24.3.0", "ts-node": "8.6.2", - "tslint": "5.20.1", + "tslint": "6.0.0", "typescript": "3.5.3" } } diff --git a/yarn.lock b/yarn.lock index 89a72110..934552a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -346,7 +346,17 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.5.5": +"@babel/generator@^7.4.0", "@babel/generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" + integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug== + dependencies: + "@babel/types" "^7.8.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/generator@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== @@ -367,16 +377,6 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" - integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug== - dependencies: - "@babel/types" "^7.8.3" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -914,21 +914,21 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": +"@babel/parser@^7.1.0", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.4.3", "@babel/parser@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" + integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== + "@babel/parser@^7.7.4", "@babel/parser@^7.7.5": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== -"@babel/parser@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" - integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== - "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -2167,7 +2167,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": +"@babel/template@^7.1.0", "@babel/template@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== @@ -2176,6 +2176,15 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" +"@babel/template@^7.4.0", "@babel/template@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" + integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -2185,16 +2194,7 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== @@ -2209,6 +2209,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.4.3", "@babel/traverse@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" + integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" @@ -2224,22 +2239,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" - integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== @@ -2248,19 +2248,19 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== +"@babel/types@^7.4.0", "@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== dependencies: esutils "^2.0.2" lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== +"@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -3597,15 +3597,7 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-globals@^4.1.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e" - integrity sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-globals@^4.3.0: +acorn-globals@^4.1.0, acorn-globals@^4.3.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== @@ -6478,11 +6470,11 @@ escodegen@^1.11.0: source-map "~0.6.1" escodegen@^1.9.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + version "1.13.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.13.0.tgz#c7adf9bd3f3cc675bb752f202f79a720189cab29" + integrity sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw== dependencies: - esprima "^3.1.3" + esprima "^4.0.1" estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" @@ -6502,7 +6494,7 @@ esprima@^3.1.3: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -7570,17 +7562,6 @@ handlebars@4.7.2: optionalDependencies: uglify-js "^3.1.4" -handlebars@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -7761,6 +7742,11 @@ html-entities@^1.2.0, html-entities@^1.2.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + html-minifier-terser@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz#0e67a0b062ae1dd0719fc73199479298f807ae16" @@ -8688,11 +8674,11 @@ istanbul-lib-source-maps@^3.0.1: source-map "^0.6.1" istanbul-reports@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== dependencies: - handlebars "^4.1.2" + html-escaper "^2.0.0" iterate-value@^1.0.0: version "1.0.1" @@ -10267,15 +10253,15 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^5.4.2: - version "5.4.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.2.tgz#a1111b8c1a4c3eb68d98815cc04a899456b03f1a" - integrity sha512-85nkTziazE2dR4pyoLxMwz0b9MmxFQPVXYs/WlWI7CPtBkARJOV+89khdNjpbclXIJDECQYnTvh1xuZV3WHkCA== + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== dependencies: growly "^1.3.0" - is-wsl "^2.1.0" - semver "^6.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" shellwords "^0.1.1" - which "^1.3.1" + which "^1.3.0" node-pre-gyp@^0.12.0: version "0.12.0" @@ -10466,12 +10452,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nwsapi@^2.0.7: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== - -nwsapi@^2.0.9: +nwsapi@^2.0.7, nwsapi@^2.0.9: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== @@ -14021,15 +14002,15 @@ tsconfig-paths@^3.4.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@1.10.0, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@1.10.0, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslint@5.20.1: - version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== +tslint@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.0.0.tgz#1c0148beac4779924216302f192cdaa153618310" + integrity sha512-9nLya8GBtlFmmFMW7oXXwoXS1NkrccqTqAtwXzdPV9e2mqSEvCki6iHL/Fbzi5oqbugshzgGPk7KBb2qNP1DSA== dependencies: "@babel/code-frame" "^7.0.0" builtin-modules "^1.1.1" @@ -14042,7 +14023,7 @@ tslint@5.20.1: mkdirp "^0.5.1" resolve "^1.3.2" semver "^5.3.0" - tslib "^1.8.0" + tslib "^1.10.0" tsutils "^2.29.0" tsutils@^2.29.0: @@ -14782,7 +14763,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.1: +which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From 133434c8d2504090183997b31ec89424086f0190 Mon Sep 17 00:00:00 2001 From: PhilippeMorier Date: Thu, 23 Jan 2020 19:45:11 +0100 Subject: [PATCH 84/84] build(dep): back to `tslint` `v5.20.1` --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 62af9e6b..30b93e92 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "stylelint-scss": "3.13.0", "ts-jest": "24.3.0", "ts-node": "8.6.2", - "tslint": "6.0.0", + "tslint": "5.20.1", "typescript": "3.5.3" } } diff --git a/yarn.lock b/yarn.lock index 934552a1..082e9556 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14002,15 +14002,15 @@ tsconfig-paths@^3.4.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@1.10.0, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@1.10.0, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslint@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.0.0.tgz#1c0148beac4779924216302f192cdaa153618310" - integrity sha512-9nLya8GBtlFmmFMW7oXXwoXS1NkrccqTqAtwXzdPV9e2mqSEvCki6iHL/Fbzi5oqbugshzgGPk7KBb2qNP1DSA== +tslint@5.20.1: + version "5.20.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" + integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== dependencies: "@babel/code-frame" "^7.0.0" builtin-modules "^1.1.1" @@ -14023,7 +14023,7 @@ tslint@6.0.0: mkdirp "^0.5.1" resolve "^1.3.2" semver "^5.3.0" - tslib "^1.10.0" + tslib "^1.8.0" tsutils "^2.29.0" tsutils@^2.29.0: