Bladeren bron

refactor(admin-ui, ui-devkit): Minimally working devkit build

Michael Bromley 5 jaren geleden
bovenliggende
commit
f8829400fc
30 gewijzigde bestanden met toevoegingen van 573 en 86 verwijderingen
  1. 2 0
      packages/admin-ui/.npmignore
  2. 10 0
      packages/admin-ui/ng-package.json
  3. 15 15
      packages/admin-ui/package.json
  4. 8 4
      packages/admin-ui/scripts/build-public-api.js
  5. 12 0
      packages/admin-ui/src/app/app.component.module.ts
  6. 3 3
      packages/admin-ui/src/app/app.module.ts
  7. 0 5
      packages/admin-ui/src/app/app.routes.ts
  8. 1 1
      packages/admin-ui/src/environments/version.ts
  9. 1 2
      packages/admin-ui/src/public-api.ts
  10. 0 1
      packages/admin-ui/tsconfig.lib.prod.json
  11. 9 2
      packages/ui-devkit/package.json
  12. 84 0
      packages/ui-devkit/scaffold/angular.json
  13. 9 0
      packages/ui-devkit/scaffold/package.json
  14. 18 0
      packages/ui-devkit/scaffold/src/app.module.ts
  15. 56 0
      packages/ui-devkit/scaffold/src/app.routes.ts
  16. 22 0
      packages/ui-devkit/scaffold/src/main.ts
  17. 8 0
      packages/ui-devkit/scaffold/src/routing/catalog-wrapper.module.ts
  18. 8 0
      packages/ui-devkit/scaffold/src/routing/customer-wrapper.module.ts
  19. 8 0
      packages/ui-devkit/scaffold/src/routing/dashboard-wrapper.module.ts
  20. 8 0
      packages/ui-devkit/scaffold/src/routing/login-wrapper.module.ts
  21. 8 0
      packages/ui-devkit/scaffold/src/routing/marketing-wrapper.module.ts
  22. 8 0
      packages/ui-devkit/scaffold/src/routing/order-wrapper.module.ts
  23. 8 0
      packages/ui-devkit/scaffold/src/routing/settings-wrapper.module.ts
  24. 27 0
      packages/ui-devkit/scaffold/tsconfig.json
  25. 0 0
      packages/ui-devkit/src/compiler/common.ts
  26. 42 1
      packages/ui-devkit/src/compiler/compile.ts
  27. 0 0
      packages/ui-devkit/src/compiler/index.ts
  28. 0 0
      packages/ui-devkit/src/compiler/watch.ts
  29. 1 1
      packages/ui-devkit/tsconfig.compiler.json
  30. 197 51
      yarn.lock

+ 2 - 0
packages/admin-ui/.npmignore

@@ -5,3 +5,5 @@ dist
 *.spec.ts
 src/app/extensions/modules
 src/app/extensions/*.generated
+scripts
+/src

+ 10 - 0
packages/admin-ui/ng-package.json

@@ -2,6 +2,16 @@
   "$schema": "node_modules/ng-packagr/ng-package.schema.json",
   "dest": "library",
   "whitelistedNonPeerDependencies": ["."],
+  "assets": [
+    "src/index.html",
+    "src/polyfills.ts",
+    "src/tsconfig.app.json",
+    "src/assets/*.*",
+    "src/styles/**/*.scss",
+    "src/favicon.ico",
+    "src/i18n-messages/*.json",
+    "src/vendure-ui-config.json"
+  ],
   "lib": {
     "entryFile": "src/public-api.ts",
     "styleIncludePaths": ["src/styles"]

+ 15 - 15
packages/admin-ui/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/admin-ui",
-  "version": "0.9.0",
+  "version": "0.9.8",
   "license": "MIT",
   "scripts": {
     "ng": "ng",
@@ -27,21 +27,21 @@
   "typings": "./library/vendure-admin-ui.d.ts",
   "sideEffects": false,
   "dependencies": {
-    "@angular/animations": "^9.0.2",
-    "@angular/cdk": "^9.0.1",
-    "@angular/common": "^9.0.2",
-    "@angular/core": "^9.0.2",
-    "@angular/forms": "^9.0.2",
-    "@angular/language-service": "^9.0.2",
-    "@angular/platform-browser": "^9.0.2",
-    "@angular/platform-browser-dynamic": "^9.0.2",
-    "@angular/router": "^9.0.2",
+    "@angular/animations": "^9.0.4",
+    "@angular/cdk": "^9.1.0",
+    "@angular/common": "^9.0.4",
+    "@angular/core": "^9.0.4",
+    "@angular/forms": "^9.0.4",
+    "@angular/language-service": "^9.0.4",
+    "@angular/platform-browser": "^9.0.4",
+    "@angular/platform-browser-dynamic": "^9.0.4",
+    "@angular/router": "^9.0.4",
     "@vendure/common": "^0.9.0",
     "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
     "@clr/angular": "^3.0.0",
     "@clr/core": "^3.0.0",
     "@clr/icons": "^3.0.0",
-    "@clr/ui": "^3.0.0-rc.1",
+    "@clr/ui": "^3.0.0",
     "@ng-select/ng-select": "^3.7.2",
     "@ngx-translate/core": "^11.0.1",
     "@ngx-translate/http-loader": "^4.0.0",
@@ -78,10 +78,10 @@
     "zone.js": "~0.10.2"
   },
   "devDependencies": {
-    "@angular/cli": "^9.0.3",
-    "@angular/compiler": "^9.0.2",
-    "@angular/compiler-cli": "^9.0.2",
-    "@angular-devkit/build-angular": "~0.900.3",
+    "@angular/cli": "^9.0.4",
+    "@angular/compiler": "^9.0.4",
+    "@angular/compiler-cli": "^9.0.4",
+    "@angular-devkit/build-angular": "~0.900.4",
     "@angular-devkit/build-ng-packagr": "~0.900.4",
     "@biesbjerg/ngx-translate-extract": "^4.2.0",
     "@types/jasmine": "~3.3.16",

+ 8 - 4
packages/admin-ui/scripts/build-public-api.js

@@ -8,13 +8,17 @@ const path = require('path');
 console.log('Generating public api...');
 const SOURCES_DIR = path.join(__dirname, '/../src/app');
 const APP_SOURCE_FILE_PATTERN = /\.(pipe|service|component|module|routes|directive|guard|config)\.ts$/;
+const EXCLUDED_PATTERN = /app\.(module|routes)\.ts$/;
+
 const files = [];
 const publicApiFilePath = path.join(__dirname, '/../src');
 forMatchingFiles(SOURCES_DIR, APP_SOURCE_FILE_PATTERN, filename => {
-    const relativeFilename = '.' + filename.replace(publicApiFilePath, '')
-        .replace(/\\/g, '/')
-        .replace(/\.ts$/, '');
-    files.push(relativeFilename);
+    if (!EXCLUDED_PATTERN.test(filename)) {
+        const relativeFilename = '.' + filename.replace(publicApiFilePath, '')
+            .replace(/\\/g, '/')
+            .replace(/\.ts$/, '');
+        files.push(relativeFilename);
+    }
 });
 
 const header = `// This file was generated by the build-public-api.ts script\n`;

+ 12 - 0
packages/admin-ui/src/app/app.component.module.ts

@@ -0,0 +1,12 @@
+import { NgModule } from '@angular/core';
+
+import { AppComponent } from './app.component';
+import { CoreModule } from './core/core.module';
+import { SharedModule } from './shared/shared.module';
+
+@NgModule({
+    imports: [SharedModule, CoreModule],
+    declarations: [AppComponent],
+    exports: [AppComponent],
+})
+export class AppComponentModule {}

+ 3 - 3
packages/admin-ui/src/app/app.module.ts

@@ -2,12 +2,12 @@ import { NgModule } from '@angular/core';
 import { RouterModule } from '@angular/router';
 
 import { AppComponent } from './app.component';
+import { AppComponentModule } from './app.component.module';
 import { routes } from './app.routes';
-import { CoreModule } from './core/core.module';
 
 @NgModule({
-    declarations: [AppComponent],
-    imports: [RouterModule.forRoot(routes, { useHash: false }), CoreModule],
+    declarations: [],
+    imports: [AppComponentModule, RouterModule.forRoot(routes, { useHash: false })],
     bootstrap: [AppComponent],
 })
 export class AppModule {}

+ 0 - 5
packages/admin-ui/src/app/app.routes.ts

@@ -39,11 +39,6 @@ export const routes: Route[] = [
                 path: 'settings',
                 loadChildren: () => import('./settings/settings.module').then(m => m.SettingsModule),
             },
-            {
-                path: 'extensions',
-                loadChildren: () =>
-                    import(`./extensions/lazy-extensions.module`).then(m => m.LazyExtensionsModule),
-            },
         ],
     },
 ];

+ 1 - 1
packages/admin-ui/src/environments/version.ts

@@ -1 +1 @@
-export const ADMIN_UI_VERSION = '0.9.0';
+export const ADMIN_UI_VERSION = '0.9.7';

+ 1 - 2
packages/admin-ui/src/public-api.ts

@@ -1,8 +1,7 @@
 // This file was generated by the build-public-api.ts script
+export * from './app/app.component.module';
 export * from './app/app.component';
 export * from './app/app.config';
-export * from './app/app.module';
-export * from './app/app.routes';
 export * from './app/catalog/catalog.module';
 export * from './app/catalog/catalog.routes';
 export * from './app/catalog/components/apply-facet-dialog/apply-facet-dialog.component';

+ 0 - 1
packages/admin-ui/tsconfig.lib.prod.json

@@ -2,7 +2,6 @@
   "extends": "./tsconfig.lib.json",
   "angularCompilerOptions": {
     "enableIvy": false,
-    "annotateForClosureCompiler": true,
     "skipTemplateCodegen": true,
     "strictMetadataEmit": true,
     "fullTemplateTypeCheck": true,

+ 9 - 2
packages/ui-devkit/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/ui-devkit",
-  "version": "0.9.0",
+  "version": "0.9.8",
   "description": "A library for authoring Vendure Admin UI extensions",
   "keywords": [
     "vendure",
@@ -14,7 +14,8 @@
     "lib": "lib"
   },
   "files": [
-    "lib"
+    "lib",
+    "scaffold"
   ],
   "main": "lib/index.js",
   "types": "lib/index.d.ts",
@@ -24,6 +25,7 @@
   },
   "scripts": {
     "build": "rimraf ./lib && rollup -c rollup.config.js --configProduction",
+    "build:compiler": "tsc -p tsconfig.compiler.json",
     "watch": "rimraf ./lib && rollup -c rollup.config.js -w",
     "lint": "tslint --fix --project ./"
   },
@@ -31,7 +33,12 @@
     "url": "https://github.com/vendure-ecommerce/vendure/issues"
   },
   "dependencies": {
+    "@angular/cli": "^9.0.4",
+    "@angular/compiler": "^9.0.4",
+    "@angular/compiler-cli": "^9.0.4",
+    "@angular-devkit/build-angular": "~0.900.4",
     "@vendure/common": "^0.9.0",
+    "@vendure/admin-ui": "^0.9.0",
     "rxjs": "^6.5.3"
   },
   "devDependencies": {

+ 84 - 0
packages/ui-devkit/scaffold/angular.json

@@ -0,0 +1,84 @@
+{
+  "$schema": "../node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "vendure-admin": {
+      "root": "",
+      "sourceRoot": "src",
+      "projectType": "application",
+      "prefix": "vdr",
+      "schematics": {
+        "@schematics/angular:component": {
+          "style": "scss"
+        }
+      },
+      "architect": {
+        "build": {
+          "builder": "@angular-devkit/build-angular:browser",
+          "options": {
+            "aot": true,
+            "baseHref": "/admin/",
+            "outputPath": "dist",
+            "index": "src/index.html",
+            "main": "src/main.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "src/tsconfig.app.json",
+            "assets": [
+              "src/favicon.ico",
+              "src/vendure-ui-config.json",
+              "src/assets",
+              "src/i18n-messages"
+            ],
+            "styles": [
+              "../../node_modules/@clr/icons/clr-icons.min.css",
+              "src/styles/styles.scss"
+            ],
+            "stylePreprocessorOptions": {
+              "includePaths": [
+                "./src/styles"
+              ]
+            },
+            "showCircularDependencies": false
+          },
+          "configurations": {
+            "production": {
+              "budgets": [
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "6kb"
+                }
+              ],
+              "optimization": true,
+              "outputHashing": "all",
+              "sourceMap": true,
+              "extractCss": true,
+              "namedChunks": false,
+              "aot": true,
+              "extractLicenses": true,
+              "vendorChunk": false,
+              "buildOptimizer": true
+            }
+          }
+        },
+        "serve": {
+          "builder": "@angular-devkit/build-angular:dev-server",
+          "options": {
+            "browserTarget": "vendure-admin:build"
+          }
+        }
+      }
+    }
+  },
+  "defaultProject": "vendure-admin",
+  "schematics": {
+    "@schematics/angular:component": {
+      "skipTests": true,
+      "changeDetection": "OnPush"
+    }
+  },
+  "cli": {
+    "packageManager": "yarn",
+    "analytics": false
+  }
+}

+ 9 - 0
packages/ui-devkit/scaffold/package.json

@@ -0,0 +1,9 @@
+{
+  "name": "vendure-admin-ui",
+  "dependencies": {},
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build --prod"
+  }
+}

+ 18 - 0
packages/ui-devkit/scaffold/src/app.module.ts

@@ -0,0 +1,18 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { routes } from './app.routes';
+
+// Using TS "import" results in the following error when building with the Angular CLI:
+// "Error: <path>\node_modules\@vendure\admin-ui\library\app\app.module.d.ts is missing from the
+// TypeScript compilation. Please make sure it is in your tsconfig via the 'files' or 'include' property."
+// tslint:disable:no-var-requires
+declare const require: any;
+const { AppComponent, CoreModule } = require('@vendure/admin-ui');
+
+@NgModule({
+    declarations: [AppComponent],
+    imports: [RouterModule.forRoot(routes, { useHash: false }), CoreModule],
+    bootstrap: [AppComponent],
+})
+export class AppModule {}

+ 56 - 0
packages/ui-devkit/scaffold/src/app.routes.ts

@@ -0,0 +1,56 @@
+import { Route } from '@angular/router';
+import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+
+// Using TS "import" results in the following error when building with the Angular CLI:
+// "Error: <path>\node_modules\@vendure\admin-ui\library\app\app.module.d.ts is missing from the
+// TypeScript compilation. Please make sure it is in your tsconfig via the 'files' or 'include' property."
+// tslint:disable:no-var-requires
+declare const require: any;
+const { AppShellComponent, AuthGuard } = require('@vendure/admin-ui');
+
+export const routes: Route[] = [
+    {
+        path: 'login',
+        loadChildren: () => import('./routing/login-wrapper.module').then(m => m.LoginWrapperModule),
+    },
+    {
+        path: '',
+        canActivate: [AuthGuard],
+        component: AppShellComponent,
+        data: {
+            breadcrumb: _('breadcrumb.dashboard'),
+        },
+        children: [
+            {
+                path: '',
+                pathMatch: 'full',
+                loadChildren: () =>
+                    import('./routing/dashboard-wrapper.module').then(m => m.DashboardWrapperModule),
+            },
+            {
+                path: 'catalog',
+                loadChildren: () =>
+                    import('./routing/catalog-wrapper.module').then(m => m.CatalogWrapperModule),
+            },
+            {
+                path: 'customer',
+                loadChildren: () =>
+                    import('./routing/customer-wrapper.module').then(m => m.CustomerWrapperModule),
+            },
+            {
+                path: 'orders',
+                loadChildren: () => import('./routing/order-wrapper.module').then(m => m.OrderWrapperModule),
+            },
+            {
+                path: 'marketing',
+                loadChildren: () =>
+                    import('./routing/marketing-wrapper.module').then(m => m.MarketingWrapperModule),
+            },
+            {
+                path: 'settings',
+                loadChildren: () =>
+                    import('./routing/settings-wrapper.module').then(m => m.SettingsWrapperModule),
+            },
+        ],
+    },
+];

+ 22 - 0
packages/ui-devkit/scaffold/src/main.ts

@@ -0,0 +1,22 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app.module';
+
+// Using TS "import" results in the following error when building with the Angular CLI:
+// "Error: <path>\node_modules\@vendure\admin-ui\library\app\app.module.d.ts is missing from the
+// TypeScript compilation. Please make sure it is in your tsconfig via the 'files' or 'include' property."
+// tslint:disable:no-var-requires
+declare const require: any;
+const { loadAppConfig } = require('@vendure/admin-ui');
+
+if (false) {
+    enableProdMode();
+}
+
+loadAppConfig()
+    .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
+    .catch((err: any) => {
+        // tslint:disable:no-console
+        console.log(err);
+    });

+ 8 - 0
packages/ui-devkit/scaffold/src/routing/catalog-wrapper.module.ts

@@ -0,0 +1,8 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { CatalogModule } from '@vendure/admin-ui';
+
+@NgModule({
+    imports: [CatalogModule],
+})
+export class CatalogWrapperModule {}

+ 8 - 0
packages/ui-devkit/scaffold/src/routing/customer-wrapper.module.ts

@@ -0,0 +1,8 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { CustomerModule } from '@vendure/admin-ui';
+
+@NgModule({
+    imports: [CustomerModule],
+})
+export class CustomerWrapperModule {}

+ 8 - 0
packages/ui-devkit/scaffold/src/routing/dashboard-wrapper.module.ts

@@ -0,0 +1,8 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { DashboardModule } from '@vendure/admin-ui';
+
+@NgModule({
+    imports: [DashboardModule],
+})
+export class DashboardWrapperModule {}

+ 8 - 0
packages/ui-devkit/scaffold/src/routing/login-wrapper.module.ts

@@ -0,0 +1,8 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { LoginModule } from '@vendure/admin-ui';
+
+@NgModule({
+    imports: [LoginModule],
+})
+export class LoginWrapperModule {}

+ 8 - 0
packages/ui-devkit/scaffold/src/routing/marketing-wrapper.module.ts

@@ -0,0 +1,8 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { MarketingModule } from '@vendure/admin-ui';
+
+@NgModule({
+    imports: [MarketingModule],
+})
+export class MarketingWrapperModule {}

+ 8 - 0
packages/ui-devkit/scaffold/src/routing/order-wrapper.module.ts

@@ -0,0 +1,8 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { OrderModule } from '@vendure/admin-ui';
+
+@NgModule({
+    imports: [OrderModule],
+})
+export class OrderWrapperModule {}

+ 8 - 0
packages/ui-devkit/scaffold/src/routing/settings-wrapper.module.ts

@@ -0,0 +1,8 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { SettingsModule } from '@vendure/admin-ui';
+
+@NgModule({
+    imports: [SettingsModule],
+})
+export class SettingsWrapperModule {}

+ 27 - 0
packages/ui-devkit/scaffold/tsconfig.json

@@ -0,0 +1,27 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "baseUrl": "./",
+    "importHelpers": true,
+    "module": "esnext",
+    "outDir": "./dist/out-tsc",
+    "sourceMap": true,
+    "declaration": false,
+    "moduleResolution": "node",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "strict": true,
+    "noImplicitAny": false,
+    "strictPropertyInitialization": false,
+    "target": "es2015",
+    "skipLibCheck": true,
+    "esModuleInterop": true,
+    "allowSyntheticDefaultImports": true,
+    "typeRoots": [],
+    "lib": [
+      "es2017",
+      "dom",
+      "esnext.asynciterable"
+    ]
+  }
+}

+ 0 - 0
packages/admin-ui/src/compiler/common.ts → packages/ui-devkit/src/compiler/common.ts


+ 42 - 1
packages/admin-ui/src/compiler/compile.ts → packages/ui-devkit/src/compiler/compile.ts

@@ -1,5 +1,6 @@
 import { AdminUiExtension } from '@vendure/common/lib/shared-types';
 import { spawn } from 'child_process';
+import * as fs from 'fs-extra';
 import * as path from 'path';
 
 import {
@@ -14,7 +15,7 @@ import {
 /**
  * Builds the admin-ui app using the Angular CLI `ng build --prod` command.
  */
-export function compileAdminUiApp(outputPath: string, extensions: Array<Required<AdminUiExtension>>) {
+/*export function compileAdminUiApp(outputPath: string, extensions: Array<Required<AdminUiExtension>>) {
     const cwd = path.join(__dirname, '..');
     const relativeOutputPath = path.relative(cwd, outputPath);
     return new Promise((resolve, reject) => {
@@ -47,4 +48,44 @@ export function compileAdminUiApp(outputPath: string, extensions: Array<Required
     }).finally(() => {
         restoreOriginalExtensionsModule();
     });
+}*/
+
+export function compileAdminUiWithExtensions({
+    outputPath,
+    watch,
+    extensions,
+}: {
+    outputPath: string;
+    watch?: boolean;
+    extensions: Array<Required<AdminUiExtension>>;
+}) {
+    // copy scaffold
+    fs.removeSync(outputPath);
+    fs.ensureDirSync(outputPath);
+    fs.copySync(path.join(__dirname, '../../scaffold'), outputPath);
+
+    // copy source files from admin-ui package
+    const adminUiSrc = path.join(__dirname, '../../../admin-ui/library/src');
+    const outputSrc = path.join(outputPath, 'src');
+    fs.ensureDirSync(outputSrc);
+    fs.copySync(adminUiSrc, outputSrc);
+
+    return new Promise((resolve, reject) => {
+        const buildProcess = spawn('yarn', ['start'], {
+            cwd: outputPath,
+            shell: true,
+            stdio: 'inherit',
+        });
+
+        buildProcess.on('close', code => {
+            if (code === 0) {
+                resolve();
+            } else {
+                reject(code);
+            }
+        });
+        buildProcess.on('error', err => {
+            reject(err);
+        });
+    });
 }

+ 0 - 0
packages/admin-ui/src/compiler/index.ts → packages/ui-devkit/src/compiler/index.ts


+ 0 - 0
packages/admin-ui/src/compiler/watch.ts → packages/ui-devkit/src/compiler/watch.ts


+ 1 - 1
packages/admin-ui/tsconfig.compiler.json → packages/ui-devkit/tsconfig.compiler.json

@@ -2,7 +2,7 @@
   "compileOnSave": false,
   "compilerOptions": {
     "baseUrl": "./",
-    "outDir": "./compiler",
+    "outDir": "./lib/compiler",
     "sourceMap": true,
     "module": "commonjs",
     "declaration": true,

+ 197 - 51
yarn.lock

@@ -85,6 +85,73 @@
     webpack-subresource-integrity "1.3.4"
     worker-plugin "3.2.0"
 
+"@angular-devkit/build-angular@~0.900.4":
+  version "0.900.4"
+  resolved "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.900.4.tgz#571bf28478c9242ca652adda5308f7697eeb4038"
+  integrity sha512-azv4/duUFMPIgpWuKeQvx+8fb5qUZes4EauBfzYGbZcF0ljN0xjnpQF5kIuDA5FcCTA+JUKfanocR0EXa0klXQ==
+  dependencies:
+    "@angular-devkit/architect" "0.900.4"
+    "@angular-devkit/build-optimizer" "0.900.4"
+    "@angular-devkit/build-webpack" "0.900.4"
+    "@angular-devkit/core" "9.0.4"
+    "@babel/core" "7.7.7"
+    "@babel/generator" "7.7.7"
+    "@babel/preset-env" "7.7.7"
+    "@ngtools/webpack" "9.0.4"
+    ajv "6.10.2"
+    autoprefixer "9.7.1"
+    babel-loader "8.0.6"
+    browserslist "4.8.3"
+    cacache "13.0.1"
+    caniuse-lite "1.0.30001020"
+    circular-dependency-plugin "5.2.0"
+    copy-webpack-plugin "5.1.1"
+    core-js "3.6.4"
+    coverage-istanbul-loader "2.0.3"
+    cssnano "4.1.10"
+    file-loader "4.2.0"
+    find-cache-dir "3.0.0"
+    glob "7.1.5"
+    jest-worker "24.9.0"
+    karma-source-map-support "1.4.0"
+    less "3.10.3"
+    less-loader "5.0.0"
+    license-webpack-plugin "2.1.3"
+    loader-utils "1.2.3"
+    magic-string "0.25.4"
+    mini-css-extract-plugin "0.8.0"
+    minimatch "3.0.4"
+    open "7.0.0"
+    parse5 "4.0.0"
+    postcss "7.0.21"
+    postcss-import "12.0.1"
+    postcss-loader "3.0.0"
+    raw-loader "3.1.0"
+    regenerator-runtime "0.13.3"
+    rimraf "3.0.0"
+    rollup "1.25.2"
+    rxjs "6.5.3"
+    sass "1.23.3"
+    sass-loader "8.0.0"
+    semver "6.3.0"
+    source-map "0.7.3"
+    source-map-loader "0.2.4"
+    source-map-support "0.5.16"
+    speed-measure-webpack-plugin "1.3.1"
+    style-loader "1.0.0"
+    stylus "0.54.7"
+    stylus-loader "3.0.2"
+    terser "4.5.1"
+    terser-webpack-plugin "2.3.3"
+    tree-kill "1.2.2"
+    webpack "4.41.2"
+    webpack-dev-middleware "3.7.2"
+    webpack-dev-server "3.9.0"
+    webpack-merge "4.2.2"
+    webpack-sources "1.4.3"
+    webpack-subresource-integrity "1.3.4"
+    worker-plugin "3.2.0"
+
 "@angular-devkit/build-ng-packagr@~0.900.4":
   version "0.900.4"
   resolved "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.900.4.tgz#3ce96a0c7134907d9852e4f63ebbb5636197104e"
@@ -104,6 +171,17 @@
     typescript "3.6.4"
     webpack-sources "1.4.3"
 
+"@angular-devkit/build-optimizer@0.900.4":
+  version "0.900.4"
+  resolved "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.900.4.tgz#c3cad084f54cccfc9ef90dc8e24716de939b2eda"
+  integrity sha512-GimgBezfUpEmpAqmhTC6bFTmyYtGycK7meJPrrfiAU8cvtUJOaHFt7AwcbFBS8ORdOeSHbOCrIVy9CAQwA3nXw==
+  dependencies:
+    loader-utils "1.2.3"
+    source-map "0.7.3"
+    tslib "1.10.0"
+    typescript "3.6.4"
+    webpack-sources "1.4.3"
+
 "@angular-devkit/build-webpack@0.900.3":
   version "0.900.3"
   resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.900.3.tgz#4a2fd13cebe190c091606e18397a1f7cccfab6bb"
@@ -113,6 +191,15 @@
     "@angular-devkit/core" "9.0.3"
     rxjs "6.5.3"
 
+"@angular-devkit/build-webpack@0.900.4":
+  version "0.900.4"
+  resolved "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.900.4.tgz#af99221fe4f50e8326978caae67312f46557a897"
+  integrity sha512-eGWK7jl1XC6OW2LRmUoX/6yqYT6N2dF1BuBrymwRx9I3BzWr64YyDIy5m3GomQVrSWpQ1uDSCpuPX2xWlwpeLw==
+  dependencies:
+    "@angular-devkit/architect" "0.900.4"
+    "@angular-devkit/core" "9.0.4"
+    rxjs "6.5.3"
+
 "@angular-devkit/core@9.0.3":
   version "9.0.3"
   resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-9.0.3.tgz#a027862d2edd981afcc6245176e9f27768c631c9"
@@ -144,15 +231,24 @@
     ora "4.0.2"
     rxjs "6.5.3"
 
-"@angular/animations@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/animations/-/animations-9.0.2.tgz#f20a5c93bd37a1e286722c58361bb8e9ac1af0f7"
-  integrity sha512-vj4N8nSLytQI45TtGy2tJb0Yc7uqlyap+qhghc+jdyG41w18KQUnIneEWKOfHWnp8VJEfzgzaY7zr/1QPlxWgA==
+"@angular-devkit/schematics@9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.0.4.tgz#fc20fe40a575ee72ed6bee90608dbd0d0579f135"
+  integrity sha512-D6M77r8J/rrK86RQ1kvumSYAnlbOKxDDcwsac4mPAHYyOOmueheecjpTVTqSVpNjkI6jHb6haOVFEGMiDMA/Jg==
+  dependencies:
+    "@angular-devkit/core" "9.0.4"
+    ora "4.0.2"
+    rxjs "6.5.3"
+
+"@angular/animations@^9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular/animations/-/animations-9.0.4.tgz#c95c601dfb8fc4e96aee577c9c0f6cf18b64e5d7"
+  integrity sha512-zTCgrIAA9FYPMbqqpQnoNltiLR58q0FMfzP2t96q/1tjyVy/Y/IaNgVQ7eL0HeQ0nG6IAzQ1HVx8Xeneg4Yj5Q==
 
-"@angular/cdk@^9.0.1":
-  version "9.0.1"
-  resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-9.0.1.tgz#3580375ce0b4aa9ddbd6ea790ab241a8db73b156"
-  integrity sha512-slhYG9lOX7JoxcULdfIvXspkDRjYTBG8PH6B2Slxi8CpV42x0t+yQnBQxp/U3ud1m1BWVrlxwKZywaPFe1tSeA==
+"@angular/cdk@^9.1.0":
+  version "9.1.0"
+  resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-9.1.0.tgz#da88568aed9efc39b160a0ac18cfca25f4961441"
+  integrity sha512-qKpAudJx9z0MD+ADptS0OZViJBTA49+JCKym0hPQUkcB9Po4Al6gu6oZ1VSXV5Ln3T84z9aAw/AhUGP/YCFNSQ==
   optionalDependencies:
     parse5 "^5.0.0"
 
@@ -182,20 +278,41 @@
     universal-analytics "^0.4.20"
     uuid "^3.3.2"
 
-"@angular/common@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/common/-/common-9.0.2.tgz#767c659b4a34c478009a40373ca1ebb84091c0b4"
-  integrity sha512-KYOov8fg5WX/bAMkemlcAZxqiq/6ga1BoxjaiZXBj07KDq8i5Nwcm6RmNkeDByCuXd2UHVm1w5t897wEUi6fnw==
+"@angular/cli@^9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular/cli/-/cli-9.0.4.tgz#21aa041292a321e6cc3e7c2e4f0e40aead71322d"
+  integrity sha512-s+fJlHdyT29LGIt/54VN5sKMsN2RJh0Np9jk0/HChxJN/0KR3IDExVahl8KpJfyVSssCYImQckVP3NyprRWeeA==
+  dependencies:
+    "@angular-devkit/architect" "0.900.4"
+    "@angular-devkit/core" "9.0.4"
+    "@angular-devkit/schematics" "9.0.4"
+    "@schematics/angular" "9.0.4"
+    "@schematics/update" "0.900.4"
+    "@yarnpkg/lockfile" "1.1.0"
+    ansi-colors "4.1.1"
+    debug "^4.1.1"
+    ini "1.3.5"
+    inquirer "7.0.0"
+    npm-package-arg "6.1.1"
+    npm-pick-manifest "3.0.2"
+    open "7.0.0"
+    pacote "9.5.8"
+    read-package-tree "5.3.1"
+    rimraf "3.0.0"
+    semver "6.3.0"
+    symbol-observable "1.2.0"
+    universal-analytics "^0.4.20"
+    uuid "^3.3.2"
 
 "@angular/common@^9.0.4":
   version "9.0.4"
   resolved "https://registry.npmjs.org/@angular/common/-/common-9.0.4.tgz#7d168b22c5c43e72112d0a19242eca22b62bb4f3"
   integrity sha512-F3qoYrceEdCd5SlgObcbSIIdKfRXgyTBO2gbbArQHFe4GvewkH3isTn5uqAF6sfJlb7rXWZGrD6C3d9brw/fEw==
 
-"@angular/compiler-cli@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.2.tgz#41868d23f2d062e072c9cff267c835151d237e8c"
-  integrity sha512-2AAZr1jX72OG9k1viVShiDGAwV9PZEcoDt80PXkUjLTUwWxicuSBKYauph47PzK/qzqWhdbvMbh8wCWHSLq0Qg==
+"@angular/compiler-cli@^9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.4.tgz#1dec287ef3c6428f1837b8176d74993e83db08c4"
+  integrity sha512-fcln3gJCV88r1CoCASIathOd7kpLJ1c8l4t6P1CQG/MCocxMvVa8bI5LRKTcQ5VTnR46Ne9+5HegIRPk7EePBQ==
   dependencies:
     canonical-path "1.0.0"
     chokidar "^3.0.0"
@@ -207,6 +324,7 @@
     reflect-metadata "^0.1.2"
     semver "^6.3.0"
     source-map "^0.6.1"
+    sourcemap-codec "^1.4.8"
     yargs "13.1.0"
 
 "@angular/compiler@^8.2.6":
@@ -216,55 +334,40 @@
   dependencies:
     tslib "^1.9.0"
 
-"@angular/compiler@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.2.tgz#be238eb2e575e2945f8e88c4ae09d99b280b797d"
-  integrity sha512-IWlKn5v3y7k1Z2K2wfNNzbn9xgA4fFlWyPe9QpdS8iy6/bPe5GfKhHbMYIza5eIhPXDN93zdEptiAIXGP3kLBQ==
-
-"@angular/core@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/core/-/core-9.0.2.tgz#250093b6a4d3137e2cc30e73e6cee919f1386165"
-  integrity sha512-ccVPR6RZo2s9O9phO0TJ60QZ0WA7qfUMzo0xnpBW0XGcbTzLEn9upvs+0PX64f9UpnHz/MQo0wsqYvTLuoz7Yw==
+"@angular/compiler@^9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.4.tgz#038c9cdbf76f1cce47bd1b355c7d212cc89b18f9"
+  integrity sha512-+Ku8RUU00yHaKVkVw6YIfM3c5Gmvas5gJcEleiagkLbc1f/jKk1cY4gaUP6xn4TLypFM7NQglneWd+E+8wh0hQ==
 
 "@angular/core@^9.0.4":
   version "9.0.4"
   resolved "https://registry.npmjs.org/@angular/core/-/core-9.0.4.tgz#6baa5ec6c594b47de541e47f4aa37241adec393a"
   integrity sha512-6RqQb1GO2uglSlgiGbxhvy8plztZtABCWLRn0X+T1PnrxoqgxqA5WkKJjGxao+1M/ECW1V0fw4Xy7DE6KvAJwQ==
 
-"@angular/forms@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/forms/-/forms-9.0.2.tgz#917e8f85a2f358bbcdf1b1946b7afa6f5460b5ed"
-  integrity sha512-qXEth7yeCd+5i6QyvllXnh/Rkzh16raFX5nfI7mgKHjWMik15Ua8wkVhDX9b5gizWeEyZtZcMGsTbbOQy0Ft3Q==
-
-"@angular/language-service@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-9.0.2.tgz#5bc4b50e6cec95df660879f9f092774d5f2420c0"
-  integrity sha512-b+1g1FYG5MkSQtRqqUAN50N7fcEqA355dEHa2Vl03uBDZSYC/XSrR59IvgJfKLFuS4dopirvY9Eddbhk2FcAmg==
+"@angular/forms@^9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular/forms/-/forms-9.0.4.tgz#31edac9917e592695a5c12b846e93dbda6afc510"
+  integrity sha512-WyfZ2u2JzGrwkxQmfxHvZMoYHEGfoUL+JlSXa2Sy3T/FPGNckHzIzggqweJij/qGjabWLabZDla4vak42f+4PA==
 
-"@angular/platform-browser-dynamic@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.2.tgz#1ed55756abd29830c2952f07c5fdea6be0b33acc"
-  integrity sha512-RJa+Y83hIFcf7pFcbbaCi7M5Y9nUUcQVuazWbQtiUe+BY5pikyug4RsF2B10pctcxb6LFLElfmkvatmmwEQ9aQ==
+"@angular/language-service@^9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-9.0.4.tgz#5d7bff114bb1628cd512dc3560d87b55e4b412fd"
+  integrity sha512-Q/kFQV4mjZ/Mpx6GksriM5lingjX73EwtVc79AfVMA76Pv5XqfYQZuti6tk7DvYQD89sv1Z/iN2di+ZLKsSTnw==
 
 "@angular/platform-browser-dynamic@^9.0.4":
   version "9.0.4"
   resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.4.tgz#343bd43fe00a279a737e02c16dd8790dc0da93a8"
   integrity sha512-9vAn2QH07khuF4n7kyMJzgE6l30Yxg1AGd8GtOfa/4nbna+EZxFVYOkto9bpv4uEwDr9o7QrFLplko9a8xs7kg==
 
-"@angular/platform-browser@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.2.tgz#159456404b35f4c86ecf64ecc2b427389ede057d"
-  integrity sha512-RMivdtJtspYLH/96AzLwLj3v0O9ck0sL6R1uh5JacfBkmedqJzmLn+AOxTdjaGdIpFtw9tisT+0Aw/nkG14vlA==
-
 "@angular/platform-browser@^9.0.4":
   version "9.0.4"
   resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.4.tgz#03853b435c3b964660727ac9d7e15912c920cdb8"
   integrity sha512-mbiqmw0rDGPxEgKVgDuK7yZvtgjJmzpMGBYAMwkQ9YIE0SoA5XP0NvZiFkHZqDXwLgCv2IJ/kvkhfCBwnBKCXQ==
 
-"@angular/router@^9.0.2":
-  version "9.0.2"
-  resolved "https://registry.npmjs.org/@angular/router/-/router-9.0.2.tgz#f33a56b16966eabdb7b24ae484d9577d47fe117f"
-  integrity sha512-jDKq9K0pOgaMtocg7VCfIQX8jTyBSb+0hjOcj6kXQVCcmnxeBzGPRX2THQyFkyzG8owTBZlHIrJA3H2thDU2LQ==
+"@angular/router@^9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@angular/router/-/router-9.0.4.tgz#1d15496eff2f47e09bb1d9c44592a2c44d0f63c1"
+  integrity sha512-03A8RpjtqB02y1DWgCPfhCprdCCkhEYU0Fo3qWCHnpa02ikejzKxyjoJyrVU/AMNbljOj5ZMcpSfyj07aPp4tQ==
 
 "@apollographql/apollo-tools@^0.4.0":
   version "0.4.0"
@@ -1150,10 +1253,10 @@
   resolved "https://registry.npmjs.org/@clr/icons/-/icons-3.0.0.tgz#d8faa0b9c8d33a48db8db6e422d1e7c1b343d84f"
   integrity sha512-3gNVHjze/+uGafyLWZ7mEQbkI24VAnOJoUZTn7XMir7FYbuxIutunUYP0XbK3A5j/F/8LtfEc1g6ArVa9is2xA==
 
-"@clr/ui@^3.0.0-rc.1":
-  version "3.0.0-rc.1"
-  resolved "https://registry.npmjs.org/@clr/ui/-/ui-3.0.0-rc.1.tgz#1aaa73af65d22c674fe2da4d9a3d633874229951"
-  integrity sha512-Mlzyo0SRX1+44/B8upUs0CIr4wBJ+x+Qe9dgApKTmg8ztfq49omJEPtmEMqfvnzCvLzKk2W3fIJskZz+vPlFoA==
+"@clr/ui@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/@clr/ui/-/ui-3.0.0.tgz#8fc5dea32f2077609a9d005632870d9af9d1a10f"
+  integrity sha512-XUHSAoSu1jnlGn2V4cF/fp05TZixfKgV89dqmOYxPNbHbm1u/ozTHmFvd4N7HO8HgBjki+t5YYBz6YGXlq1pRA==
 
 "@cnakazawa/watch@^1.0.3":
   version "1.0.3"
@@ -2445,6 +2548,16 @@
     rxjs "6.5.3"
     webpack-sources "1.4.3"
 
+"@ngtools/webpack@9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.0.4.tgz#edb6a89192f33fc639ba677a34f19faf7c3f4289"
+  integrity sha512-CMPrmocVjNII0C/eAFV0K/nOPR60Cj6is+aiOm+HAneBBkw/P05r0eds1zarGzyn42/PbeL3nh3RYMjWkt9mrQ==
+  dependencies:
+    "@angular-devkit/core" "9.0.4"
+    enhanced-resolve "4.1.1"
+    rxjs "6.5.3"
+    webpack-sources "1.4.3"
+
 "@ngx-translate/core@^11.0.1":
   version "11.0.1"
   resolved "https://registry.npmjs.org/@ngx-translate/core/-/core-11.0.1.tgz#cecefad41f06368f5859dac48fec8fcc4485615f"
@@ -2675,6 +2788,14 @@
     "@angular-devkit/core" "9.0.3"
     "@angular-devkit/schematics" "9.0.3"
 
+"@schematics/angular@9.0.4":
+  version "9.0.4"
+  resolved "https://registry.npmjs.org/@schematics/angular/-/angular-9.0.4.tgz#e90e15abc512c310e3865717811fc3152f3462b1"
+  integrity sha512-JYkzMoEITWN+c+WcAieglGM6590kbDs+80HyHFiCWDMvGeYM0JEv98wsYq5fzFfhETMKe09CkaqB80YK4m4OKg==
+  dependencies:
+    "@angular-devkit/core" "9.0.4"
+    "@angular-devkit/schematics" "9.0.4"
+
 "@schematics/update@0.900.3":
   version "0.900.3"
   resolved "https://registry.npmjs.org/@schematics/update/-/update-0.900.3.tgz#9141ee2e1b6356e66f6269b92c284c86e4faf065"
@@ -2690,6 +2811,21 @@
     semver "6.3.0"
     semver-intersect "1.4.0"
 
+"@schematics/update@0.900.4":
+  version "0.900.4"
+  resolved "https://registry.npmjs.org/@schematics/update/-/update-0.900.4.tgz#5a125f5dd359b5a21b87b346d6dc765ae93f0a32"
+  integrity sha512-0aR412gvpqm8KlpMn6jcewD9blovnD7fEoyP+yJPU8eYCFE7BIK6kw71ZSE1uG0tbHT8g+WXbfwZNcJyI1HUmg==
+  dependencies:
+    "@angular-devkit/core" "9.0.4"
+    "@angular-devkit/schematics" "9.0.4"
+    "@yarnpkg/lockfile" "1.1.0"
+    ini "1.3.5"
+    npm-package-arg "^7.0.0"
+    pacote "9.5.8"
+    rxjs "6.5.3"
+    semver "6.3.0"
+    semver-intersect "1.4.0"
+
 "@sindresorhus/is@^0.14.0":
   version "0.14.0"
   resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -6158,6 +6294,11 @@ core-js@3.6.0:
   resolved "https://registry.npmjs.org/core-js/-/core-js-3.6.0.tgz#2b854e451de1967d1e29896025cdc13a2518d9ea"
   integrity sha512-AHPTNKzyB+YwgDWoSOCaid9PUSEF6781vsfiK8qUz62zRR448/XgK2NtCbpiUGizbep8Lrpt0Du19PpGGZvw3Q==
 
+core-js@3.6.4:
+  version "3.6.4"
+  resolved "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647"
+  integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==
+
 core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0:
   version "2.6.9"
   resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
@@ -16148,6 +16289,11 @@ sourcemap-codec@^1.4.4:
   resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9"
   integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==
 
+sourcemap-codec@^1.4.8:
+  version "1.4.8"
+  resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+  integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
 sparkles@^1.0.0:
   version "1.0.1"
   resolved "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"