From 65f255aa6afc73ba182f60407f039136d6cbdfd8 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 13 Nov 2020 09:52:59 +0100 Subject: [PATCH 01/76] Added readme --- Lectures/Lecture_11/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Lectures/Lecture_11/README.md diff --git a/Lectures/Lecture_11/README.md b/Lectures/Lecture_11/README.md new file mode 100644 index 00000000..fd34a962 --- /dev/null +++ b/Lectures/Lecture_11/README.md @@ -0,0 +1,3 @@ +# Lecture 11 +## Angular frontend for .NET backend +## Erik Macháček \ No newline at end of file From 54ca40636aa0d3a77972cc53eddfa99efd7552c6 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 13 Nov 2020 14:50:25 +0100 Subject: [PATCH 02/76] Added crude first version of slides --- Lectures/Lecture_11/Slides.pptx | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Lectures/Lecture_11/Slides.pptx diff --git a/Lectures/Lecture_11/Slides.pptx b/Lectures/Lecture_11/Slides.pptx new file mode 100644 index 00000000..10f9864d --- /dev/null +++ b/Lectures/Lecture_11/Slides.pptx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f4e03f1ad1e4c7a092608b2c260398aba72a0934b29a78fed6d4d8e8e14d924 +size 4920753 From 8206202357649759cb43372d0bb907ba14035927 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 13 Nov 2020 15:36:16 +0100 Subject: [PATCH 03/76] Generated website structure --- Lectures/Lecture_11/CookBook/.browserslistrc | 17 + Lectures/Lecture_11/CookBook/.editorconfig | 16 + Lectures/Lecture_11/CookBook/.gitignore | 46 + Lectures/Lecture_11/CookBook/README.md | 27 + Lectures/Lecture_11/CookBook/angular.json | 131 + .../CookBook/e2e/protractor.conf.js | 37 + .../CookBook/e2e/src/app.e2e-spec.ts | 23 + .../Lecture_11/CookBook/e2e/src/app.po.ts | 11 + .../Lecture_11/CookBook/e2e/tsconfig.json | 13 + Lectures/Lecture_11/CookBook/karma.conf.js | 35 + Lectures/Lecture_11/CookBook/package.json | 45 + .../CookBook/src/app/app-routing.module.ts | 10 + .../CookBook/src/app/app.component.html | 534 + .../CookBook/src/app/app.component.less | 0 .../CookBook/src/app/app.component.spec.ts | 35 + .../CookBook/src/app/app.component.ts | 10 + .../Lecture_11/CookBook/src/app/app.module.ts | 18 + .../Lecture_11/CookBook/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 + .../CookBook/src/environments/environment.ts | 16 + Lectures/Lecture_11/CookBook/src/favicon.ico | Bin 0 -> 948 bytes Lectures/Lecture_11/CookBook/src/index.html | 13 + Lectures/Lecture_11/CookBook/src/main.ts | 12 + Lectures/Lecture_11/CookBook/src/polyfills.ts | 63 + Lectures/Lecture_11/CookBook/src/styles.less | 1 + Lectures/Lecture_11/CookBook/src/test.ts | 25 + .../Lecture_11/CookBook/tsconfig.app.json | 15 + Lectures/Lecture_11/CookBook/tsconfig.json | 29 + .../Lecture_11/CookBook/tsconfig.spec.json | 18 + Lectures/Lecture_11/CookBook/tslint.json | 152 + Lectures/Lecture_11/CookBook/yarn.lock | 8965 +++++++++++++++++ 31 files changed, 10320 insertions(+) create mode 100644 Lectures/Lecture_11/CookBook/.browserslistrc create mode 100644 Lectures/Lecture_11/CookBook/.editorconfig create mode 100644 Lectures/Lecture_11/CookBook/.gitignore create mode 100644 Lectures/Lecture_11/CookBook/README.md create mode 100644 Lectures/Lecture_11/CookBook/angular.json create mode 100644 Lectures/Lecture_11/CookBook/e2e/protractor.conf.js create mode 100644 Lectures/Lecture_11/CookBook/e2e/src/app.e2e-spec.ts create mode 100644 Lectures/Lecture_11/CookBook/e2e/src/app.po.ts create mode 100644 Lectures/Lecture_11/CookBook/e2e/tsconfig.json create mode 100644 Lectures/Lecture_11/CookBook/karma.conf.js create mode 100644 Lectures/Lecture_11/CookBook/package.json create mode 100644 Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/app.component.html create mode 100644 Lectures/Lecture_11/CookBook/src/app/app.component.less create mode 100644 Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/app.component.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/app.module.ts create mode 100644 Lectures/Lecture_11/CookBook/src/assets/.gitkeep create mode 100644 Lectures/Lecture_11/CookBook/src/environments/environment.prod.ts create mode 100644 Lectures/Lecture_11/CookBook/src/environments/environment.ts create mode 100644 Lectures/Lecture_11/CookBook/src/favicon.ico create mode 100644 Lectures/Lecture_11/CookBook/src/index.html create mode 100644 Lectures/Lecture_11/CookBook/src/main.ts create mode 100644 Lectures/Lecture_11/CookBook/src/polyfills.ts create mode 100644 Lectures/Lecture_11/CookBook/src/styles.less create mode 100644 Lectures/Lecture_11/CookBook/src/test.ts create mode 100644 Lectures/Lecture_11/CookBook/tsconfig.app.json create mode 100644 Lectures/Lecture_11/CookBook/tsconfig.json create mode 100644 Lectures/Lecture_11/CookBook/tsconfig.spec.json create mode 100644 Lectures/Lecture_11/CookBook/tslint.json create mode 100644 Lectures/Lecture_11/CookBook/yarn.lock diff --git a/Lectures/Lecture_11/CookBook/.browserslistrc b/Lectures/Lecture_11/CookBook/.browserslistrc new file mode 100644 index 00000000..427441dc --- /dev/null +++ b/Lectures/Lecture_11/CookBook/.browserslistrc @@ -0,0 +1,17 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/Lectures/Lecture_11/CookBook/.editorconfig b/Lectures/Lecture_11/CookBook/.editorconfig new file mode 100644 index 00000000..59d9a3a3 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/Lectures/Lecture_11/CookBook/.gitignore b/Lectures/Lecture_11/CookBook/.gitignore new file mode 100644 index 00000000..86d943a9 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/Lectures/Lecture_11/CookBook/README.md b/Lectures/Lecture_11/CookBook/README.md new file mode 100644 index 00000000..216f6c3b --- /dev/null +++ b/Lectures/Lecture_11/CookBook/README.md @@ -0,0 +1,27 @@ +# CookBook + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.0.1. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/Lectures/Lecture_11/CookBook/angular.json b/Lectures/Lecture_11/CookBook/angular.json new file mode 100644 index 00000000..bee7b21a --- /dev/null +++ b/Lectures/Lecture_11/CookBook/angular.json @@ -0,0 +1,131 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "CookBook": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "less" + }, + "@schematics/angular:application": { + "strict": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/CookBook", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.less" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "CookBook:build" + }, + "configurations": { + "production": { + "browserTarget": "CookBook:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "CookBook:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.less" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "CookBook:serve" + }, + "configurations": { + "production": { + "devServerTarget": "CookBook:serve:production" + } + } + } + } + } + }, + "defaultProject": "CookBook" +} diff --git a/Lectures/Lecture_11/CookBook/e2e/protractor.conf.js b/Lectures/Lecture_11/CookBook/e2e/protractor.conf.js new file mode 100644 index 00000000..361e7f0c --- /dev/null +++ b/Lectures/Lecture_11/CookBook/e2e/protractor.conf.js @@ -0,0 +1,37 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + browserName: 'chrome' + }, + directConnect: true, + SELENIUM_PROMISE_MANAGER: false, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ + spec: { + displayStacktrace: StacktraceOption.PRETTY + } + })); + } +}; \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/e2e/src/app.e2e-spec.ts b/Lectures/Lecture_11/CookBook/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..0dc751a3 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', async () => { + await page.navigateTo(); + expect(await page.getTitleText()).toEqual('CookBook app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/e2e/src/app.po.ts b/Lectures/Lecture_11/CookBook/e2e/src/app.po.ts new file mode 100644 index 00000000..c9c85ab9 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + async navigateTo(): Promise { + return browser.get(browser.baseUrl); + } + + async getTitleText(): Promise { + return element(by.css('app-root .content span')).getText(); + } +} diff --git a/Lectures/Lecture_11/CookBook/e2e/tsconfig.json b/Lectures/Lecture_11/CookBook/e2e/tsconfig.json new file mode 100644 index 00000000..0782539c --- /dev/null +++ b/Lectures/Lecture_11/CookBook/e2e/tsconfig.json @@ -0,0 +1,13 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es2018", + "types": [ + "jasmine", + "node" + ] + } +} diff --git a/Lectures/Lecture_11/CookBook/karma.conf.js b/Lectures/Lecture_11/CookBook/karma.conf.js new file mode 100644 index 00000000..8102639d --- /dev/null +++ b/Lectures/Lecture_11/CookBook/karma.conf.js @@ -0,0 +1,35 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/CookBook'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/Lectures/Lecture_11/CookBook/package.json b/Lectures/Lecture_11/CookBook/package.json new file mode 100644 index 00000000..1b7d6c87 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/package.json @@ -0,0 +1,45 @@ +{ + "name": "cook-book", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~11.0.0", + "@angular/common": "~11.0.0", + "@angular/compiler": "~11.0.0", + "@angular/core": "~11.0.0", + "@angular/forms": "~11.0.0", + "@angular/platform-browser": "~11.0.0", + "@angular/platform-browser-dynamic": "~11.0.0", + "@angular/router": "~11.0.0", + "rxjs": "~6.6.0", + "tslib": "^2.0.0", + "zone.js": "~0.10.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.1100.1", + "@angular/cli": "~11.0.1", + "@angular/compiler-cli": "~11.0.0", + "@types/jasmine": "~3.6.0", + "@types/node": "^12.11.1", + "codelyzer": "^6.0.0", + "jasmine-core": "~3.6.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~5.1.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.0.3", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "protractor": "~7.0.0", + "ts-node": "~8.3.0", + "tslint": "~6.1.0", + "typescript": "~4.0.2" + } +} diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts new file mode 100644 index 00000000..d425c6f5 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = []; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/Lectures/Lecture_11/CookBook/src/app/app.component.html b/Lectures/Lecture_11/CookBook/src/app/app.component.html new file mode 100644 index 00000000..e48d8c10 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/app.component.html @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + {{ title }} app is running! + + + + + +
+ + +

Resources

+

Here are some links to help you get started:

+ + + + +

Next Steps

+

What do you want to do next with your app?

+ + + +
+
+ + + New Component +
+ +
+ + + Angular Material +
+ +
+ + + Add PWA Support +
+ +
+ + + Add Dependency +
+ +
+ + + Run and Watch Tests +
+ +
+ + + Build for Production +
+
+ + +
+
ng generate component xyz
+
ng add @angular/material
+
ng add @angular/pwa
+
ng add _____
+
ng test
+
ng build --prod
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/app.component.less b/Lectures/Lecture_11/CookBook/src/app/app.component.less new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts new file mode 100644 index 00000000..ee57cb69 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'CookBook'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('CookBook'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('CookBook app is running!'); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/src/app/app.component.ts b/Lectures/Lecture_11/CookBook/src/app/app.component.ts new file mode 100644 index 00000000..b691a706 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.less'] +}) +export class AppComponent { + title = 'CookBook'; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts new file mode 100644 index 00000000..2c3ba299 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -0,0 +1,18 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + AppRoutingModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/Lectures/Lecture_11/CookBook/src/assets/.gitkeep b/Lectures/Lecture_11/CookBook/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/environments/environment.prod.ts b/Lectures/Lecture_11/CookBook/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/Lectures/Lecture_11/CookBook/src/environments/environment.ts b/Lectures/Lecture_11/CookBook/src/environments/environment.ts new file mode 100644 index 00000000..7b4f817a --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/Lectures/Lecture_11/CookBook/src/favicon.ico b/Lectures/Lecture_11/CookBook/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + CookBook + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook/src/main.ts b/Lectures/Lecture_11/CookBook/src/main.ts new file mode 100644 index 00000000..c7b673cf --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/Lectures/Lecture_11/CookBook/src/polyfills.ts b/Lectures/Lecture_11/CookBook/src/polyfills.ts new file mode 100644 index 00000000..9b8f300e --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less new file mode 100644 index 00000000..90d4ee00 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/Lectures/Lecture_11/CookBook/src/test.ts b/Lectures/Lecture_11/CookBook/src/test.ts new file mode 100644 index 00000000..50193eb0 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/test.ts @@ -0,0 +1,25 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + keys(): string[]; + (id: string): T; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/Lectures/Lecture_11/CookBook/tsconfig.app.json b/Lectures/Lecture_11/CookBook/tsconfig.app.json new file mode 100644 index 00000000..82d91dc4 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/Lectures/Lecture_11/CookBook/tsconfig.json b/Lectures/Lecture_11/CookBook/tsconfig.json new file mode 100644 index 00000000..d3c1011a --- /dev/null +++ b/Lectures/Lecture_11/CookBook/tsconfig.json @@ -0,0 +1,29 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "module": "es2020", + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/Lectures/Lecture_11/CookBook/tsconfig.spec.json b/Lectures/Lecture_11/CookBook/tsconfig.spec.json new file mode 100644 index 00000000..092345b0 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/tsconfig.spec.json @@ -0,0 +1,18 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/Lectures/Lecture_11/CookBook/tslint.json b/Lectures/Lecture_11/CookBook/tslint.json new file mode 100644 index 00000000..277c8eba --- /dev/null +++ b/Lectures/Lecture_11/CookBook/tslint.json @@ -0,0 +1,152 @@ +{ + "extends": "tslint:recommended", + "rulesDirectory": [ + "codelyzer" + ], + "rules": { + "align": { + "options": [ + "parameters", + "statements" + ] + }, + "array-type": false, + "arrow-return-shorthand": true, + "curly": true, + "deprecation": { + "severity": "warning" + }, + "eofline": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": { + "options": [ + "spaces" + ] + }, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "quotemark": [ + true, + "single" + ], + "semicolon": { + "options": [ + "always" + ] + }, + "space-before-function-paren": { + "options": { + "anonymous": "never", + "asyncArrow": "always", + "constructor": "never", + "method": "never", + "named": "never" + } + }, + "typedef": [ + true, + "call-signature" + ], + "typedef-whitespace": { + "options": [ + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ] + }, + "variable-name": { + "options": [ + "ban-keywords", + "check-format", + "allow-pascal-case" + ] + }, + "whitespace": { + "options": [ + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast" + ] + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ] + } +} diff --git a/Lectures/Lecture_11/CookBook/yarn.lock b/Lectures/Lecture_11/CookBook/yarn.lock new file mode 100644 index 00000000..ec69ddd9 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/yarn.lock @@ -0,0 +1,8965 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@angular-devkit/architect@0.1100.1": + version "0.1100.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular-devkit/architect/-/architect-0.1100.1.tgz#0451fd261a1afc69af2e41f80f4002b93035f548" + integrity sha1-BFH9Jhoa/GmvLkH4D0ACuTA19Ug= + dependencies: + "@angular-devkit/core" "11.0.1" + rxjs "6.6.3" + +"@angular-devkit/build-angular@~0.1100.1": + version "0.1100.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular-devkit/build-angular/-/build-angular-0.1100.1.tgz#194d9600093798766164d3a5952af239a9709ed5" + integrity sha1-GU2WAAk3mHZhZNOllSryOalwntU= + dependencies: + "@angular-devkit/architect" "0.1100.1" + "@angular-devkit/build-optimizer" "0.1100.1" + "@angular-devkit/build-webpack" "0.1100.1" + "@angular-devkit/core" "11.0.1" + "@babel/core" "7.12.3" + "@babel/generator" "7.12.1" + "@babel/plugin-transform-runtime" "7.12.1" + "@babel/preset-env" "7.12.1" + "@babel/runtime" "7.12.1" + "@babel/template" "7.10.4" + "@jsdevtools/coverage-istanbul-loader" "3.0.5" + "@ngtools/webpack" "11.0.1" + ansi-colors "4.1.1" + autoprefixer "9.8.6" + babel-loader "8.1.0" + browserslist "^4.9.1" + cacache "15.0.5" + caniuse-lite "^1.0.30001032" + circular-dependency-plugin "5.2.0" + copy-webpack-plugin "6.2.1" + core-js "3.6.5" + css-loader "5.0.0" + cssnano "4.1.10" + file-loader "6.1.1" + find-cache-dir "3.3.1" + glob "7.1.6" + inquirer "7.3.3" + jest-worker "26.5.0" + karma-source-map-support "1.4.0" + less "3.12.2" + less-loader "7.0.2" + license-webpack-plugin "2.3.1" + loader-utils "2.0.0" + mini-css-extract-plugin "1.2.1" + minimatch "3.0.4" + open "7.3.0" + ora "5.1.0" + parse5-html-rewriting-stream "6.0.1" + pnp-webpack-plugin "1.6.4" + postcss "7.0.32" + postcss-import "12.0.1" + postcss-loader "4.0.4" + raw-loader "4.0.2" + regenerator-runtime "0.13.7" + resolve-url-loader "3.1.2" + rimraf "3.0.2" + rollup "2.32.1" + rxjs "6.6.3" + sass "1.27.0" + sass-loader "10.0.5" + semver "7.3.2" + source-map "0.7.3" + source-map-loader "1.1.2" + source-map-support "0.5.19" + speed-measure-webpack-plugin "1.3.3" + style-loader "2.0.0" + stylus "0.54.8" + stylus-loader "4.1.1" + terser "5.3.7" + terser-webpack-plugin "4.2.3" + text-table "0.2.0" + tree-kill "1.2.2" + webpack "4.44.2" + webpack-dev-middleware "3.7.2" + webpack-dev-server "3.11.0" + webpack-merge "5.2.0" + webpack-sources "2.0.1" + webpack-subresource-integrity "1.5.1" + worker-plugin "5.0.0" + +"@angular-devkit/build-optimizer@0.1100.1": + version "0.1100.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.1.tgz#a51ecf54e3098035d9a13ecc48fa5cadf49b79a6" + integrity sha1-pR7PVOMJgDXZoT7MSPpcrfSbeaY= + dependencies: + loader-utils "2.0.0" + source-map "0.7.3" + tslib "2.0.3" + typescript "4.0.5" + webpack-sources "2.0.1" + +"@angular-devkit/build-webpack@0.1100.1": + version "0.1100.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular-devkit/build-webpack/-/build-webpack-0.1100.1.tgz#e80990ecd44dd5e30f6508c136ec1e02c20452ae" + integrity sha1-6AmQ7NRN1eMPZQjBNuweAsIEUq4= + dependencies: + "@angular-devkit/architect" "0.1100.1" + "@angular-devkit/core" "11.0.1" + rxjs "6.6.3" + +"@angular-devkit/core@11.0.1": + version "11.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular-devkit/core/-/core-11.0.1.tgz#7125b07ac7d66a8fdaaf612a3b757817d23b8107" + integrity sha1-cSWwesfWao/ar2EqO3V4F9I7gQc= + dependencies: + ajv "6.12.6" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.3" + source-map "0.7.3" + +"@angular-devkit/schematics@11.0.1": + version "11.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular-devkit/schematics/-/schematics-11.0.1.tgz#d0826cde52a2c015b24a7c6f3b4df31665eb67ed" + integrity sha1-0IJs3lKiwBWySnxvO03zFmXrZ+0= + dependencies: + "@angular-devkit/core" "11.0.1" + ora "5.1.0" + rxjs "6.6.3" + +"@angular/animations@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/animations/-/animations-11.0.0.tgz#6f567930dca8eb8ab1320f1f48feb981493b86c6" + integrity sha1-b1Z5MNyo64qxMg8fSP65gUk7hsY= + dependencies: + tslib "^2.0.0" + +"@angular/cli@~11.0.1": + version "11.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/cli/-/cli-11.0.1.tgz#70417fb910d7e19a71b5b0926c3aeb51af3f7a5d" + integrity sha1-cEF/uRDX4ZpxtbCSbDrrUa8/el0= + dependencies: + "@angular-devkit/architect" "0.1100.1" + "@angular-devkit/core" "11.0.1" + "@angular-devkit/schematics" "11.0.1" + "@schematics/angular" "11.0.1" + "@schematics/update" "0.1100.1" + "@yarnpkg/lockfile" "1.1.0" + ansi-colors "4.1.1" + debug "4.2.0" + ini "1.3.5" + inquirer "7.3.3" + npm-package-arg "8.1.0" + npm-pick-manifest "6.1.0" + open "7.3.0" + pacote "9.5.12" + resolve "1.18.1" + rimraf "3.0.2" + semver "7.3.2" + symbol-observable "2.0.3" + universal-analytics "0.4.23" + uuid "8.3.1" + +"@angular/common@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/common/-/common-11.0.0.tgz#cc2a14b36c56f6c4d93427c2f8c17f55e4b464c9" + integrity sha1-zCoUs2xW9sTZNCfC+MF/VeS0ZMk= + dependencies: + tslib "^2.0.0" + +"@angular/compiler-cli@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/compiler-cli/-/compiler-cli-11.0.0.tgz#ff4c2c16284a31a4f8ff1d224f593f64a1458234" + integrity sha1-/0wsFihKMaT4/x0iT1k/ZKFFgjQ= + dependencies: + "@babel/core" "^7.8.6" + "@babel/types" "^7.8.6" + canonical-path "1.0.0" + chokidar "^3.0.0" + convert-source-map "^1.5.1" + dependency-graph "^0.7.2" + fs-extra "4.0.2" + magic-string "^0.25.0" + minimist "^1.2.0" + reflect-metadata "^0.1.2" + semver "^6.3.0" + source-map "^0.6.1" + sourcemap-codec "^1.4.8" + tslib "^2.0.0" + yargs "15.3.0" + +"@angular/compiler@9.0.0": + version "9.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" + integrity sha1-h+C+9MNptsra4H46QpV3j8k3mdU= + +"@angular/compiler@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/compiler/-/compiler-11.0.0.tgz#b49997d0130e7c8cfe84fa73e5610892f4a772af" + integrity sha1-tJmX0BMOfIz+hPpz5WEIkvSncq8= + dependencies: + tslib "^2.0.0" + +"@angular/core@9.0.0": + version "9.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" + integrity sha1-In3FPhrIGCT5mMbnYAC378UiZB4= + +"@angular/core@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/core/-/core-11.0.0.tgz#cdb89f3877f6e5487a0e5f18d234447ec41e8184" + integrity sha1-zbifOHf25Uh6Dl8Y0jREfsQegYQ= + dependencies: + tslib "^2.0.0" + +"@angular/forms@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/forms/-/forms-11.0.0.tgz#fd9e167024e92df17ff98714ccae322ac4fbc1ab" + integrity sha1-/Z4WcCTpLfF/+YcUzK4yKsT7was= + dependencies: + tslib "^2.0.0" + +"@angular/platform-browser-dynamic@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.0.0.tgz#630d77a0c853bcc2c80c30dfe6c101d6c7fe4ac1" + integrity sha1-Yw13oMhTvMLIDDDf5sEB1sf+SsE= + dependencies: + tslib "^2.0.0" + +"@angular/platform-browser@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/platform-browser/-/platform-browser-11.0.0.tgz#314a0362e63ac7eef80adebfc5fbe4e7f2aa2a73" + integrity sha1-MUoDYuY6x+74Ct6/xfvk5/KqKnM= + dependencies: + tslib "^2.0.0" + +"@angular/router@~11.0.0": + version "11.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@angular/router/-/router-11.0.0.tgz#59e855b0d34c4578e0556e181f2f28048fb0d5a8" + integrity sha1-WehVsNNMRXjgVW4YHy8oBI+w1ag= + dependencies: + tslib "^2.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha1-Fo2ho26Q2miujUnA8bSMfGJJITo= + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.12.5": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/compat-data/-/compat-data-7.12.5.tgz#f56db0c4bb1bbbf221b4e81345aab4141e7cb0e9" + integrity sha1-9W2wxLsbu/IhtOgTRaq0FB58sOk= + +"@babel/core@7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.6": + version "7.12.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha1-G0NohOHjv/b7EyjcArIIdZ3pKtg= + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468" + integrity sha1-DXC+Mr2qA9fFHIWX3aduDfHxVGg= + dependencies: + "@babel/types" "^7.12.1" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.1", "@babel/generator@^7.12.5": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" + integrity sha1-osUN5ci21wirlb5eYFOTbBiEpN4= + dependencies: + "@babel/types" "^7.12.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha1-W/DUlaP3V6w72ki1vzs7ownHK6M= + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha1-uwt18xv5jL+f8UPBrleLhydK4aM= + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.12.1": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha1-y0cMdhmNtqJOnbyJhydWMeXSmDE= + dependencies: + "@babel/compat-data" "^7.12.5" + "@babel/helper-validator-option" "^7.12.1" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha1-PEWZj0Me3UqSFMXx060USKYTf24= + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz#18b1302d4677f9dc4740fe8c9ed96680e29d37e8" + integrity sha1-GLEwLUZ3+dxHQP6MntlmgOKdN+g= + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + regexpu-core "^4.7.1" + +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha1-tTwQ23imQIABUmkrEzkxR6y5uzA= + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" + integrity sha1-gAakZmlcSthqKl8vsVtfLDGtVjM= + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha1-0tOyDFmtjEcRL6fSqUvAnV74Lxo= + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha1-mMHL6g4jMvM/mkZhuM4VBbLBm6I= + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha1-1JsAHR1aaMpeZgTdoBpil/fJOB4= + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" + integrity sha1-+6Dy/P8/ugDm7LZku15uJuLWFlw= + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-module-imports@^7.12.1": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha1-G/wCKfeUmI927QpNTpCGCFC1Tfs= + dependencies: + "@babel/types" "^7.12.5" + +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha1-eVT+xx9bMsSOSzA7Q3w0RT/XJHw= + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha1-UNyWQT1ZT5lad5BZBbBYk813lnM= + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha1-L3WoMSadT2d95JmG3/WZJ1M883U= + +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha1-Mt+7eYmQc8QVVXBToZvQVarlCuA= + dependencies: + lodash "^4.17.19" + +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha1-jE27+RYxT2BH3AXmoiFwdCODR/0= + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/types" "^7.12.1" + +"@babel/helper-replace-supers@^7.12.1": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" + integrity sha1-8AmhdUO7u84WsGIGrnO2PT/KaNk= + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha1-MkJ+WqYVR9OOsebq9f0UJv2tkTY= + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha1-Ri3GOn5DWt6EaDhcY9K4TM5LPL8= + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha1-+KSRJErPamdhWKxCBykRuoOtCZ8= + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI= + +"@babel/helper-validator-option@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" + integrity sha1-F1VnOAw+d9YP+YpUuwFf548heNk= + +"@babel/helper-wrap-function@^7.10.4": + version "7.12.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha1-MzIzn8TR+78cJ9eVjCfTRwjpkNk= + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.12.1": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha1-Ghukp2jZtYMQ7aUWxEmRP+ZHEW4= + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha1-fRvf1ldTU4+r5sOFls23bZrGAUM= + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" + integrity sha1-tK8y3dRzwL+mQ71/8HKLjnG4HqA= + +"@babel/plugin-proposal-async-generator-functions@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" + integrity sha1-3GwRcOJ9isqZ/2X0klvQaxyQVQ4= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha1-oIL/VB8qKaSCEGW4rdk0bAwW5d4= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" + integrity sha1-Q+tcKjSH7NmMXI6otf22midJstw= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" + integrity sha1-i5uPN2stiPXdd05NJKXMLjZ5ttQ= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" + integrity sha1-1FQjtRdxTu3VYhqd/cA/qfTrJBw= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" + integrity sha1-8sSQ024bPJZZJBA0pdLNUCY6J1E= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha1-PtT/8xwBXn8/FGfxkNvlRc17BGw= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.12.1": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz#b1ce757156d40ed79d59d467cb2b154a5c4149ba" + integrity sha1-sc51cVbUDtedWdRnyysVSlxBSbo= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha1-3vm9A86g+bcig9rA7CLSicdpEGk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" + integrity sha1-zMJCGvZNOq5QtVinHO3pKaWrKUI= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" + integrity sha1-zOEiID/IoyeUKW/Dd8be2vQ2N5c= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" + integrity sha1-hoFPbnohN0yYDBDTi0ST5wP0o4k= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha1-Khg5WNQXdluerjNPR3WOXWqC4HI= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha1-vLKXxTZueb663vUJVJzZOwTxmXg= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha1-AolkqbqA28CUyRXEh618TnpmRlo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha1-3WwLNXrBuxQtmFN0UKMZYl0T0qA= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" + integrity sha1-gIP/yGrI53f74ktZZ8SyUh88srM= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha1-OEmknMKiLpdDy9a1KSbTAzcimvE= + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + +"@babel/plugin-transform-block-scoped-functions@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" + integrity sha1-8qGjZb3itxEuCm3tkGf918B5Bdk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" + integrity sha1-8O5yeHS0KiCKSKWGuEw9IiwrvvE= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" + integrity sha1-ZeZQ/K3dPYjdzmfA+DSj1DajLbY= + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" + integrity sha1-1oz2ybf4OKikFEutvpdUHqCQSFI= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha1-uaVw/g0KjUYBFkE8tPl+jgiy+Ec= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha1-odFsFIYoF7ZAnApnjW+Tc8qc2XU= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" + integrity sha1-dFZhuropWsBuaGgieXpp+6osoig= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" + integrity sha1-sPLtNWuhvhQo7K8Sj/iiTwKDCuA= + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" + integrity sha1-B2QPKIZ+0W+VEcmciIKR9WCSHPo= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" + integrity sha1-LsdiWMcP4IxtfaFUADpIBiDrpmc= + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" + integrity sha1-1zuAOiazcBfd+dO7j03Fi/uAb1c= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" + integrity sha1-SWA4YC2vFRSmTUPY4Xy7J1Xgw60= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" + integrity sha1-MVQwCwJhhWZu67DA7X+EFf789vk= + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha1-+kAxJFQmNseGz5tGCg/7tIqG5kg= + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" + integrity sha1-Zj/qYg1ZPJPyFKRkzTmb9txoMIY= + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-identifier" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" + integrity sha1-61ohjWscaPPWIXuPosyC/sZUeQI= + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" + integrity sha1-tAf1yWvg2fX4hGdJf6grMKw+h1M= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + +"@babel/plugin-transform-new-target@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" + integrity sha1-gAc/Au4bstNlw0FkkOCFyVdZ3sA= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" + integrity sha1-TqCGlrjS5lhB0MdwZIKwSL7RBm4= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + +"@babel/plugin-transform-parameters@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha1-0uljsDh3FlDJIu/1k3mclthTJV0= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" + integrity sha1-QbyBIA1zCrtEVquLP71VN7Wa3s0= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" + integrity sha1-Xwoo2EL2RiKB8GqWToi6jXq0l1M= + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" + integrity sha1-b9/IzH7cxCs2p8EhiMZ4fIc63Ng= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-runtime@7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" + integrity sha1-BLeSBX60YDif9qQZjjd2FOoee6U= + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" + integrity sha1-C/nKxVUPzgz98ENCD2YdZF/cdeM= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" + integrity sha1-Un+fMRvk7H/cK3m7ife/iEs+Hh4= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz#5c24cf50de396d30e99afc8d1c700e8bce0f5caf" + integrity sha1-XCTPUN45bTDpmvyNHHAOi84PXK8= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" + integrity sha1-tD7ObtmnnAxxEZ9XbSme8J2UKEM= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" + integrity sha1-nKa+ND1CUS+8LmgjaoKuZLx694o= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" + integrity sha1-UjK5+BzLBwcLfDw2xnobePGEVwk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" + integrity sha1-zJZh9hOQ21xl4/66zO/Vxqw/rss= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" + integrity sha1-nH5cqCoZ78hlOEu0mJFI0u5desI= + dependencies: + "@babel/compat-data" "^7.12.1" + "@babel/helper-compilation-targets" "^7.12.1" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.1" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.1" + core-js-compat "^3.6.2" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha1-Ni8raMZihClw/bXiVP/I/BwuQV4= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@7.12.1": + version "7.12.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" + integrity sha1-tBFqa2cR0BCy2tO3tuQ78bmVR0A= + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.8.4": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha1-QQ5+SHRB4bNgwpvnFdhw2bmFiC4= + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@7.10.4", "@babel/template@^7.10.4": + version "7.10.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha1-MlGZbEIA68cdGo/EBfupQPNrong= + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5": + version "7.12.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" + integrity sha1-eKDGjI6KNeTKz9MduLswPVYG8JU= + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.12.5" + "@babel/types" "^7.12.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.4.4", "@babel/types@^7.8.6": + version "7.12.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" + integrity sha1-rg5V7xzOH7yIHNJvgjTrPmV+3JY= + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha1-JlIL8Jq+SlZEzVQU43ElqJVCQd0= + +"@jsdevtools/coverage-istanbul-loader@3.0.5": + version "3.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz#2a4bc65d0271df8d4435982db4af35d81754ee26" + integrity sha1-KkvGXQJx341ENZgttK812BdU7iY= + dependencies: + convert-source-map "^1.7.0" + istanbul-lib-instrument "^4.0.3" + loader-utils "^2.0.0" + merge-source-map "^1.1.0" + schema-utils "^2.7.0" + +"@ngtools/webpack@11.0.1": + version "11.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@ngtools/webpack/-/webpack-11.0.1.tgz#029aaff16d76fbfdf06422dde4c83f3b79c34215" + integrity sha1-Apqv8W12+/3wZCLd5Mg/O3nDQhU= + dependencies: + "@angular-devkit/core" "11.0.1" + enhanced-resolve "5.3.1" + webpack-sources "2.0.1" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha1-Olgr21OATGum0UZXnEblITDPSjs= + 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 "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M= + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY= + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@npmcli/move-file@^1.0.1": + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" + integrity sha1-3hAwcNrA9IzknPZpPCOvWcD3BGQ= + dependencies: + mkdirp "^1.0.4" + +"@schematics/angular@11.0.1": + version "11.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@schematics/angular/-/angular-11.0.1.tgz#33617ae6df12b4cc883d9d4ab4601762be12a983" + integrity sha1-M2F65t8StMyIPZ1KtGAXYr4SqYM= + dependencies: + "@angular-devkit/core" "11.0.1" + "@angular-devkit/schematics" "11.0.1" + jsonc-parser "2.3.1" + +"@schematics/update@0.1100.1": + version "0.1100.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@schematics/update/-/update-0.1100.1.tgz#18a3befe9faece0fe784843f2f6a774ed09843ce" + integrity sha1-GKO+/p+uzg/nhIQ/L2p3TtCYQ84= + dependencies: + "@angular-devkit/core" "11.0.1" + "@angular-devkit/schematics" "11.0.1" + "@yarnpkg/lockfile" "1.1.0" + ini "1.3.5" + npm-package-arg "^8.0.0" + pacote "9.5.12" + semver "7.3.2" + semver-intersect "1.4.0" + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha1-5rqA82t9qtLGhazZJmOC5omFwYM= + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/jasmine@~3.6.0": + version "3.6.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/jasmine/-/jasmine-3.6.1.tgz#f8b95def0016411c58c7adb4791dff29bc62992c" + integrity sha1-+Lld7wAWQRxYx620eR3/KbximSw= + +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha1-9MfsQ+gbMZqYFRFQMXCfJph4kfA= + +"@types/minimatch@*": + version "3.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0= + +"@types/node@*": + version "14.14.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d" + integrity sha1-jqHo+OriQwz0QFZLmMbfzh7FlF0= + +"@types/node@^12.11.1": + version "12.19.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/node/-/node-12.19.4.tgz#cdfbb62e26c7435ed9aab9c941393cc3598e9b46" + integrity sha1-zfu2LibHQ17ZqrnJQTk8w1mOm0Y= + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA= + +"@types/q@^0.0.32": + version "0.0.32" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" + integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= + +"@types/q@^1.5.1": + version "1.5.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ= + +"@types/selenium-webdriver@^3.0.0": + version "3.0.17" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" + integrity sha1-UL6gw8KswxyVnFsedHeYs7PQbUs= + +"@types/source-list-map@*": + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk= + +"@types/webpack-sources@^0.1.5": + version "0.1.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/webpack-sources/-/webpack-sources-0.1.8.tgz#078d75410435993ec8a0a2855e88706f3f751f81" + integrity sha1-B411QQQ1mT7IoKKFXohwbz91H4E= + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ= + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q= + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI= + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA= + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc= + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg= + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc= + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A= + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ= + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU= + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha1-BNM7Y2945qaBMifoJAL3Y3tiKas= + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha1-P+bXnT8PkiGDqoYALELdJWz+6c8= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha1-IhEYHlsxMmRDzIES658LkChyGmE= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha1-STXVTIX+9jewDOn1I3dFHQDUeJk= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= + +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha1-53qX+9NFt22DJF7c0X05OxtB+zE= + +JSONStream@^1.3.4: + version "1.3.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha1-MgjB8I06TZkmGrZPkjArwV4RHKA= + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^2.0.5: + version "2.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha1-wLZ4+zLWD8EhnHhNaoJv44Wut5o= + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80= + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn@^6.4.1: + version "6.4.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha1-NYZv1xBSjpLeEM8GAWSY5H454eY= + +adjust-sourcemap-loader@3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" + integrity sha1-WuEvtbexxYXoC7taY+wWOhpF5h4= + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +adm-zip@^0.4.9: + version "0.4.16" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha1-z0xQj9/6sCwmnLx/RxqHXwVXA2U= + +after@0.8.2: + version "0.8.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +agent-base@4, agent-base@^4.3.0: + version "4.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4= + dependencies: + es6-promisify "^5.0.0" + +agent-base@~4.2.1: + version "4.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk= + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.4.1: + version "3.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" + integrity sha1-oROSTdP6JKC8O3gQjEUMKr7gD2c= + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo= + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha1-81mGrOuRr63sQQL72FAUlQzvpk0= + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha1-MfKdpatuANHC0yms97WSlhTVAU0= + +ajv@6.12.6, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@4.1.1: + version "4.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha1-y7muJWv3UK8eqzRPIpqif+lLo0g= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha1-46PaS/uubIapwoViXeEkojQCb78= + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha1-pcR8xDGB8fOP/XB2g3cA05VSKmE= + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha1-7dgDYornHATIWuegkG7a00tkiTc= + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha1-xV7PAhheJGklk5kxDBc84xIzsUI= + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-path@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha1-IQtvQ4cyJ+GKS4EKAyKDMRVV1a0= + +aproba@^1.1.1: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= + +arg@^4.1.0: + version "4.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk= + +argparse@^1.0.7: + version "1.0.10" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arity-n@^1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= + +arr-union@^3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk= + +array-union@^1.0.1: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/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 "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0= + +array-uniq@^1.0.1: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha1-O7xCdd1YTMGxCAm4nU6LY6aednU= + +arrify@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha1-EamAuE67kXgc41sP3C7ilON4Pwc= + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs= + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +async-each@^1.0.1: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha1-3TeelPDbgxCwgpH51kwyCXZmF/0= + +async@^2.6.2: + version "2.6.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8= + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= + +autoprefixer@9.8.6: + version "9.8.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha1-O3NZTKG/kmYyDFrPFYjXTep0IQ8= + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= + +axobject-query@2.0.2: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha1-6hh6vluQArN3+SXYv30cVhrfOPk= + dependencies: + ast-types-flow "0.0.7" + +babel-loader@8.1.0: + version "8.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha1-xhHVESvVIJq+i5+oTD5NolJ18cM= + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha1-hP2hnJduxcbe/vV/lCez3vZuF6M= + dependencies: + object.assign "^4.1.0" + +backo2@1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.5.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= + +base64id@2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha1-J3Csa8R9MSr5eov5pjQ0LgzSXLY= + +base@^0.11.1: + version "0.11.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +better-assert@~1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +big.js@^5.2.2: + version "5.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg= + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha1-MPpAyef+B9vIlWeM0ocCTeokHdk= + +bindings@^1.5.0: + version "1.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= + dependencies: + file-uri-to-path "1.0.0" + +blob@0.0.5: + version "0.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM= + +blocking-proxy@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" + integrity sha1-gdb9H+E6TA1pV99/kbdemNrEDLI= + dependencies: + minimist "^1.2.0" + +bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: + version "3.7.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28= + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg= + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha1-vsoAVAj2Quvr6oCwQrTRjSrA7ms= + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io= + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha1-Mmc0ZC9APavDADIJhTu3CtQo70g= + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha1-jWR0wbhwv9q807z8wZNKEOlPFfA= + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw= + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0= + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM= + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha1-KGlFnZqjviRf6P4sofRuLn9U1z8= + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.6, browserslist@^4.9.1: + version "4.14.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" + integrity sha1-wHHBs2IsHC55B5mje7CUc6Q1HLY= + dependencies: + caniuse-lite "^1.0.30001157" + colorette "^1.2.1" + electron-to-chromium "^1.3.591" + escalade "^3.1.1" + node-releases "^1.1.66" + +browserstack@^1.5.1: + version "1.6.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/browserstack/-/browserstack-1.6.0.tgz#5a56ab90987605d9c138d7a8b88128370297f9bf" + integrity sha1-WlarkJh2BdnBONeouIEoNwKX+b8= + dependencies: + https-proxy-agent "^2.2.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8= + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow= + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@^1.0.3: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY= + +cacache@15.0.5, cacache@^15.0.5: + version "15.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha1-aRYoM9opFw1nMjNGQ8YOAF9fF9A= + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" + unique-filename "^1.1.1" + +cacache@^12.0.0, cacache@^12.0.2: + version "12.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw= + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha1-JBJwVLs/m9y0sfuCQYGGBy93uM4= + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= + +camelcase@5.3.1, camelcase@^5.0.0: + version "5.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= + +camelcase@^6.1.0: + version "6.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA= + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001157: + version "1.0.30001157" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/caniuse-lite/-/caniuse-lite-1.0.30001157.tgz#2d11aaeb239b340bc1aa730eca18a37fdb07a9ab" + integrity sha1-LRGq6yObNAvBqnMOyhijf9sHqas= + +canonical-path@1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" + integrity sha1-/LRwwjlY3vhQgYVr56hukE8YDR0= + +caseless@~0.12.0: + version "0.12.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha1-ThSHCmGNni7dl92DRf2dncMVZGo= + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= + +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.4.1: + version "3.4.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha1-wd84IxRI5FykrFiObHlXO6alfVs= + 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.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^2.1.8: + version "2.1.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc= + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs= + +chownr@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4= + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ= + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-dependency-plugin@5.2.0: + version "5.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" + integrity sha1-4J28LdPikoRCQD4tRbQc6ga8CpM= + +class-utils@^0.3.5: + version "0.3.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha1-7oRy27Ep5yezHooQpCfe6d/kAIs= + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.4.0: + version "2.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" + integrity sha1-EnY+RyUb+VHLdcIB36WP8byy0Ec= + +cli-width@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= + +cliui@^5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE= + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c= + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +coa@^2.0.2: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM= + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +codelyzer@^6.0.0: + version "6.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/codelyzer/-/codelyzer-6.0.1.tgz#c0e9668e847255b37c759e68fb2700b11e277d0f" + integrity sha1-wOlmjoRyVbN8dZ5o+ycAsR4nfQ8= + dependencies: + "@angular/compiler" "9.0.0" + "@angular/core" "9.0.0" + app-root-path "^3.0.0" + aria-query "^3.0.0" + axobject-query "2.0.2" + css-selector-tokenizer "^0.7.1" + cssauron "^1.4.0" + damerau-levenshtein "^1.0.4" + rxjs "^6.5.3" + semver-dsl "^1.0.1" + source-map "^0.5.7" + sprintf-js "^1.1.2" + tslib "^1.10.0" + zone.js "~0.10.3" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= + +color-string@^1.5.4: + version "1.5.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha1-3VHNJc/ulT0Tj+QAI3LMPQ5QTLY= + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha1-ymf7TnuX1hHc3jns7tQiBn2RWW4= + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1: + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha1-TQuSEyXBT6+SYzCGpTbbbolWSxs= + +colors@1.4.0, colors@^1.4.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha1-xQSRR51MG9rtLJztMs98fcI2D3g= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0, commander@^2.12.1, commander@^2.20.0: + version "2.20.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= + +commondir@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-bind@1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= + +component-inherit@0.0.3: + version "0.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compose-function@3.0.3: + version "3.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48= + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w= + +connect@^3.7.0: + version "3.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg= + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha1-ZwY871fOts9Jk6KrOlWECujEkzY= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= + +convert-source-map@1.7.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI= + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookie@0.4.0: + version "0.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha1-kilzmMrjSTf8r9bsgTnBgFHwteA= + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@6.2.1: + version "6.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/copy-webpack-plugin/-/copy-webpack-plugin-6.2.1.tgz#8015e4d5c5e637ab7b39c76daa9e03c7a4bf1ae5" + integrity sha1-gBXk1cXmN6t7Ocdtqp4Dx6S/GuU= + dependencies: + cacache "^15.0.5" + fast-glob "^3.2.4" + find-cache-dir "^3.3.1" + glob-parent "^5.1.1" + globby "^11.0.1" + loader-utils "^2.0.0" + normalize-path "^3.0.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + webpack-sources "^1.4.3" + +core-js-compat@^3.6.2: + version "3.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/core-js-compat/-/core-js-compat-3.7.0.tgz#8479c5d3d672d83f1f5ab94cf353e57113e065ed" + integrity sha1-hHnF09Zy2D8fWrlM81PlcRPgZe0= + dependencies: + browserslist "^4.14.6" + semver "7.0.0" + +core-js@3.6.5: + version "3.6.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha1-c5XcJzrzf7LlDpvT2f6EEoUjHRo= + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha1-BA9yaAnFked6F8CjYmykW08Wixo= + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha1-75tE13OVnK5j3ezRIt4jhTtg+NM= + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4= + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY= + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8= + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha1-OWz58xN/A+S45TLFj2mCVOAPgOw= + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha1-wZiUD2OnbX42wecQGLABchBUyyI= + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-loader/-/css-loader-5.0.0.tgz#f0a48dfacc3ab9936a05ee16a09e7f313872e117" + integrity sha1-8KSN+sw6uZNqBe4WoJ5/MThy4Rc= + dependencies: + camelcase "^6.1.0" + cssesc "^3.0.0" + icss-utils "^5.0.0" + loader-utils "^2.0.0" + postcss "^8.1.1" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.2" + +css-parse@~2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + dependencies: + css "^2.0.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc= + +css-select@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8= + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-selector-tokenizer@^0.7.1: + version "0.7.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha1-c18mGG5nx0mq8nV4NAXPBmH66PE= + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha1-mL69YsTB2flg7DQM+fdSLjBwmiI= + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-tree/-/css-tree-1.0.1.tgz#7726678dfe2a57993a018d9dce519bf1760e3b6d" + integrity sha1-dyZnjf4qV5k6AY2dzlGb8XYOO20= + dependencies: + mdn-data "2.0.12" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha1-6nAm/LAXd+295SEk4h8yfnrpUOQ= + +css@^2.0.0: + version "2.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk= + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssauron@^1.4.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" + integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg= + dependencies: + through X.X.X + +cssesc@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4= + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y= + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI= + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M= + +cssnano@4.1.10: + version "4.1.10" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI= + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/csso/-/csso-4.1.0.tgz#1d31193efa99b87aa6bad6c0cef155e543d09e8b" + integrity sha1-HTEZPvqZuHqmutbAzvFV5UPQnos= + dependencies: + css-tree "^1.0.0" + +custom-event@~1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +cyclist@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o= + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.4: + version "1.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha1-FDwWQcs9hcYMMjKeJoma3qhwF5E= + +dashdash@^1.12.0: + version "1.14.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-format@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha1-MdW16iEc9f12TNOLr50DPffhJc8= + +date-format@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" + integrity sha1-64eANlx9KxURB4+0keZHl4DzrZU= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= + dependencies: + ms "2.0.0" + +debug@3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE= + dependencies: + ms "2.0.0" + +debug@4.2.0, debug@^4.1.0, debug@^4.1.1: + version "4.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E= + dependencies: + ms "2.1.2" + +debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha1-6D0X3hbYp++3cX7b5fsQE17uYps= + dependencies: + ms "^2.1.1" + +debug@~4.1.0: + version "4.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E= + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o= + 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" + +default-gateway@^4.2.0: + version "4.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs= + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3: + version "1.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^2.2.0: + version "2.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +del@^4.1.1: + version "4.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha1-no8RciLqRKMf86FWwEm5kFKp8LQ= + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +dependency-graph@^0.7.2: + version "0.7.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" + integrity sha1-kdud5utyaZIJ2IrqTB/VIhysHEk= + +des.js@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node@^2.0.4: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha1-AU7o+PZpxcWAI9pkuBecCDooxGw= + +di@^0.0.1: + version "0.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@^4.0.1: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0= + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha1-QOjumPVaIUlgcUaSHGPhrl89KHU= + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo= + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E= + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto= + +domelementtype@1: + version "1.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= + +domelementtype@^2.0.1: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" + integrity sha1-87blSSAeRvWItZRj3XcYcTH+aXE= + +domutils@^1.7.0: + version "1.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog= + dependencies: + is-obj "^2.0.0" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk= + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.591: + version "1.3.595" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/electron-to-chromium/-/electron-to-chromium-1.3.595.tgz#e8a9e7c6919963419f892ea981d7b3438ccb834d" + integrity sha1-6KnnxpGZY0GfiS6pgdezQ4zLg00= + +elliptic@^6.5.3: + version "6.5.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha1-y1nrLv2vc6C9eMzXAVpirW4Pk9Y= + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= + +emojis-list@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha1-VXBmIEatKeLpFucariYKvf9Pang= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.13" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha1-VldK/deR9UqOmyeFwFgqLSYhD6k= + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= + dependencies: + once "^1.4.0" + +engine.io-client@~3.4.0: + version "3.4.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/engine.io-client/-/engine.io-client-3.4.4.tgz#77d8003f502b0782dd792b073a4d2cf7ca5ab967" + integrity sha1-d9gAP1ArB4LdeSsHOk0s98pauWc= + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha1-V85WEdk3DulPmWQbWJ+UyX5PXac= + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.4.0: + version "3.4.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/engine.io/-/engine.io-3.4.2.tgz#8fc84ee00388e3e228645e0a7d3dfaeed5bd122c" + integrity sha1-j8hO4AOI4+IoZF4KfT367tW9Eiw= + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "0.3.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "^7.1.2" + +enhanced-resolve@5.3.1: + version "5.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz#3f988d0d7775bdc2d96ede321dc81f8249492f57" + integrity sha1-P5iNDXd1vcLZbt4yHcgfgklJL1c= + dependencies: + graceful-fs "^4.2.4" + tapable "^2.0.0" + +enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha1-O4BvO/r8HsfeaVUe+TzKRsFwQSY= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +ent@~2.2.0: + version "2.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +entities@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha1-mS0xKc999ocLlsV4WMJJoSD4uLU= + +err-code@^1.0.0: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg= + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha1-pN5hsvZpifx0IWdsHLl4dXOs5Uw= + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg= + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE= + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo= + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha1-utXTwbzawoJp9MszHkMceKxwXRg= + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA= + +escape-html@~1.0.3: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha1-ygODMxD2iJoyZHgaqC5j65z+eEg= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= + +esrecurse@^4.1.0: + version "4.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE= + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= + +estraverse@^5.2.0: + version "5.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha1-MH30JUfmzHMk088DwVXVzbjFOIA= + +esutils@^2.0.2: + version "2.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= + +etag@~1.8.1: + version "1.8.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8= + +events@^3.0.0: + version "3.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha1-k7h8GPjvzUICpGGuxN/AVWtjk3k= + +eventsource@^1.0.7: + version "1.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA= + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI= + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg= + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.17.1: + version "4.17.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ= + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ= + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= + +external-editor@^3.0.3: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= + +fast-glob@^3.1.1, fast-glob@^3.2.4: + version "3.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha1-0grvv5lXk4Pn88xmUpFYybmFVNM= + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= + +fastparse@^1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha1-kXKMWllC7O2FMSg8eUQe5BIsNak= + +fastq@^1.6.0: + version "1.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha1-4Wpy8zjqykjpG1wjWTvMLvZreUc= + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha1-XA6aiWjokSwoZjn96XeosgnyUI4= + dependencies: + websocket-driver ">=0.5.1" + +figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: + version "3.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4= + +figures@^3.0.0: + version "3.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8= + dependencies: + escape-string-regexp "^1.0.5" + +file-loader@6.1.1: + version "6.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" + integrity sha1-pvKd+z9ZM6HDULLbqiCsW+BTm6o= + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= + +fill-range@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0= + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@3.3.1, find-cache-dir@^3.3.1: + version "3.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha1-ibM/rUpGcNqpT4Vff74x1thP6IA= + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc= + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flatted@^2.0.1, flatted@^2.0.2: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha1-RXWyHivO50NKqb5mL0t7X5wrUTg= + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug= + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.13.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha1-tC6Nk6Kn7qXtiGM2dtZZe8jjhNs= + +for-in@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + integrity sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA= + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha1-zP+FcIQef+QmVpPaiJNsVa7X98c= + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs= + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4= + +function-bind@^1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= + +genfun@^5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" + integrity sha1-ndlxCgaQClxKW/V6yl2k5S/nZTc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= + +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha1-lKl2j8vdBZWhySc6rPTInQdWMb4= + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha1-wbJVV189wh1Zv8ec09K0axw6VLU= + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: + version "5.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha1-tsHvQXxOVmPqSY8cRa+saRa7wik= + dependencies: + is-glob "^4.0.1" + +glob@7.1.6, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY= + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= + +globby@^11.0.1: + version "11.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha1-mivxB6Bo8//qvEmtcCx57ejP01c= + 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@^5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha1-Ila94U02MpWMRl68ltxGfKB6Kfs= + +handle-thing@^2.0.0: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha1-hX95zjWVgMNA1DCBzGSJcNC7I04= + +har-schema@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0= + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha1-d3asYn8+p3JQz8My2rfd9eT10R0= + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= + +has-symbols@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg= + +has-value@^0.3.1: + version "0.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM= + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I= + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4= + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.8.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg= + +hosted-git-info@^3.0.6: + version "3.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" + integrity sha1-owcnOF6oWs/O6U4KrZ42jHkuA2w= + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c= + +html-entities@^1.3.1: + version "1.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha1-+5oaS1sUxdq6gtPjTGrk/nAaDkQ= + +html-escaper@^2.0.0: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha1-39YAJ9o2o238viNiYsAKWCJoFFM= + +http-cache-semantics@^3.8.1: + version "3.8.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha1-ObDhat2bYFvwqe89nar0hDtMrNI= + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha1-2i4x0jezk6rnKs5DiC3X4nCo/3c= + +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha1-5IIb7vWyFCogJr1zkm/lN2McVAU= + dependencies: + agent-base "4" + debug "3.1.0" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha1-GDx9xKoUeRUDBkmMIQza+WCApDo= + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk= + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3: + version "2.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha1-TuenN6vZJniik9mzShr00NCMeHs= + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha1-zhPRh1sMOmdL1qBLf3awGxtt7QE= + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/icss-utils/-/icss-utils-5.0.0.tgz#03ed56c3accd32f9caaf1752ebf64ef12347bb84" + integrity sha1-A+1Ww6zNMvnKrxdS6/ZO8SNHu4Q= + +ieee754@^1.1.4: + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= + +iferr@^0.1.5: + version "0.1.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha1-AX4kRxhL/q3nwjjkrv3R6PlbHjc= + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.4: + version "5.1.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha1-8VCotQo0KJsz4i9YiavU2AFvDlc= + +image-size@~0.5.0: + version "0.5.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +immediate@~3.0.5: + version "3.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +import-fresh@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.2.1: + version "3.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha1-/BKcFgxdaCNVB/QzGmuq0Ya9vD4= + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha1-VQcL44pZk88Y72236WH1vuXFoJ0= + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha1-xM78qo5RBRwqQLos6KPScpWvlGc= + +inflight@^1.0.4: + version "1.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= + +inherits@2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@1.3.5, ini@^1.3.4: + version "1.3.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc= + +inquirer@7.3.3: + version "7.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM= + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc= + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@1.1.5, ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM= + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha1-RXSirlb3qyBolvtDHq7tBm/fjwM= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha1-76ouqdqg16suoTqXsritUf776L4= + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha1-x8ZxXNItTdtI0+GZcCI6zquwgNk= + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.0.0, is-core-module@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha1-pMwDHZsaymPuy9GKZQ4Ty07quUY= + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha1-vac28s2P0G0yhE53Q7+nSUw7/X4= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha1-QSWojkTkUNOE4JBH7eca3C0UQVY= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= + +is-glob@^3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4= + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + +is-number@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= + +is-obj@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha1-WsSLNF72dTOb1sekipEhELJBz1I= + dependencies: + is-path-inside "^1.0.0" + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha1-v+Lcomxp85cmWkAJljYCk1oFOss= + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha1-fJgQWH1lmkDSe8201WFuqwWUlLI= + dependencies: + path-is-inside "^1.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k= + dependencies: + has-symbols "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= + +is-stream@^1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-svg@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha1-kyHb0pwhLlypnE+peUxxS8r6L3U= + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc= + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= + +is-wsl@^1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^4.0.6: + version "4.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" + integrity sha1-7ctisiTitHEIMLZ0mMjk5aTSYQs= + +isexe@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha1-9ZRKN8cLVQsCp4pcOyBVsoDOyOw= + +istanbul-lib-instrument@^4.0.1, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha1-hzxv/4l0UBGCIndGlqPyiQLXfB0= + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha1-dRj+UupE3jcvRgp2tezan/tz2KY= + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha1-dXQ85tlruG3H7kNSz2Nmoj8LGtk= + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.0: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha1-1ZMhDlAAaDdQywn8BkTktuJ/1Ts= + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jasmine-core@^3.6.0, jasmine-core@~3.6.0: + version "3.6.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jasmine-core/-/jasmine-core-3.6.0.tgz#491f3bb23941799c353ceb7a45b38a950ebc5a20" + integrity sha1-SR87sjlBeZw1POt6RbOKlQ68WiA= + +jasmine-core@~2.8.0: + version "2.8.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" + integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= + +jasmine-spec-reporter@~5.0.0: + version "5.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz#b61288ab074ad440dc2477c4d42840b0e74a6b95" + integrity sha1-thKIqwdK1EDcJHfE1ChAsOdKa5U= + dependencies: + colors "1.4.0" + +jasmine@2.8.0: + version "2.8.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" + integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= + dependencies: + exit "^0.1.2" + glob "^7.0.6" + jasmine-core "~2.8.0" + +jasminewd2@^2.1.0: + version "2.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" + integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= + +jest-worker@26.5.0: + version "26.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jest-worker/-/jest-worker-26.5.0.tgz#87deee86dbbc5f98d9919e0dadf2c40e3152fa30" + integrity sha1-h97uhtu8X5jZkZ4NrfLEDjFS+jA= + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^26.5.0: + version "26.6.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha1-f3LLxNZDw2Xie5/XdfnQ6qnHqO0= + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= + +js-yaml@^3.13.1: + version "3.14.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha1-p6NBcPJqIbsWJCTYray0ETpp5II= + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= + +jsesc@~0.5.0: + version "0.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + +json-schema@0.2.3: + version "0.2.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E= + +json5@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4= + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha1-ybD3+pIzv+WAf+ZvzzpWF+1ZfUM= + dependencies: + minimist "^1.2.5" + +jsonc-parser@2.3.1: + version "2.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsonc-parser/-/jsonc-parser-2.3.1.tgz#59549150b133f2efacca48fe9ce1ec0659af2342" + integrity sha1-WVSRULEz8u+sykj+nOHsBlmvI0I= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jszip@^3.1.3: + version "3.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6" + integrity sha1-tP0fNoJFNGZY54H+yWdYAkieFfY= + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +karma-chrome-launcher@~3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha1-gFpYZ5mk0F9OVPcqIEl58/MGZzg= + dependencies: + which "^1.2.1" + +karma-coverage@~2.0.3: + version "2.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/karma-coverage/-/karma-coverage-2.0.3.tgz#c10f4711f4cf5caaaa668b1d6f642e7da122d973" + integrity sha1-wQ9HEfTPXKqqZosdb2QufaEi2XM= + dependencies: + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.1" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.0" + minimatch "^3.0.4" + +karma-jasmine-html-reporter@^1.5.0: + version "1.5.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz#669f33d694d88fce1b0ccfda57111de716cb0192" + integrity sha1-Zp8z1pTYj84bDM/aVxEd5xbLAZI= + +karma-jasmine@~4.0.0: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/karma-jasmine/-/karma-jasmine-4.0.1.tgz#b99e073b6d99a5196fc4bffc121b89313b0abd82" + integrity sha1-uZ4HO22ZpRlvxL/8EhuJMTsKvYI= + dependencies: + jasmine-core "^3.6.0" + +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha1-WFJs7M9+hzDlbv/Zek3o1xKsDWs= + dependencies: + source-map-support "^0.5.5" + +karma@~5.1.0: + version "5.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/karma/-/karma-5.1.1.tgz#4e472c1e5352d73edbd2090726afdb01d7869d72" + integrity sha1-TkcsHlNS1z7b0gkHJq/bAdeGnXI= + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.0.0" + colors "^1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + flatted "^2.0.2" + glob "^7.1.6" + graceful-fs "^4.2.4" + http-proxy "^1.18.1" + isbinaryfile "^4.0.6" + lodash "^4.17.15" + log4js "^6.2.1" + mime "^2.4.5" + minimatch "^3.0.4" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^2.3.0" + source-map "^0.6.1" + tmp "0.2.1" + ua-parser-js "0.7.21" + yargs "^15.3.1" + +killable@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= + +klona@^2.0.4: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha1-e7Hjr/sMuGJFR+9+j2cI6i4538A= + +less-loader@7.0.2: + version "7.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/less-loader/-/less-loader-7.0.2.tgz#0d73a49ec32a9d3ff12614598e6e2b47fb2a35c4" + integrity sha1-DXOknsMqnT/xJhRZjm4rR/sqNcQ= + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +less@3.12.2: + version "3.12.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/less/-/less-3.12.2.tgz#157e6dd32a68869df8859314ad38e70211af3ab4" + integrity sha1-FX5t0ypohp34hZMUrTjnAhGvOrQ= + dependencies: + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + native-request "^1.0.5" + source-map "~0.6.0" + +license-webpack-plugin@2.3.1: + version "2.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/license-webpack-plugin/-/license-webpack-plugin-2.3.1.tgz#08eddb2f776c7c64c02f308a00e017d6e824d0b6" + integrity sha1-CO3bL3dsfGTALzCKAOAX1ugk0LY= + dependencies: + "@types/webpack-sources" "^0.1.5" + webpack-sources "^1.2.0" + +lie@~3.3.0: + version "3.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha1-3Pgt7lRfRgdNryAMfBxaCOD0D2o= + dependencies: + immediate "~3.0.5" + +line-column@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" + integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= + dependencies: + isarray "^1.0.0" + isobject "^2.0.0" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +loader-runner@^2.4.0: + version "2.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c= + +loader-utils@1.2.3: + version "1.2.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc= + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha1-5MrOW4FtQloWa18JfhDNErNgZLA= + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha1-xXm140yzSxp07cbB+za/o3HVphM= + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= + dependencies: + p-locate "^4.1.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: + version "4.17.20" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI= + +log-symbols@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha1-abPMRtIPRI7M23XqH6cz2eghySA= + dependencies: + chalk "^4.0.0" + +log4js@^6.2.1: + version "6.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" + integrity sha1-EN+vu0NDUaPjAnegC5h5RG9xW8s= + dependencies: + date-format "^3.0.0" + debug "^4.1.1" + flatted "^2.0.1" + rfdc "^1.1.4" + streamroller "^2.2.4" + +loglevel@^1.6.8: + version "1.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha1-coFmhVp0DVnTjbAc9G8ELKoEG7A= + +lru-cache@^5.1.1: + version "5.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= + dependencies: + yallist "^4.0.0" + +magic-string@0.25.7, magic-string@^0.25.0: + version "0.25.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE= + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU= + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8= + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha1-LrLjfqm2fEiR9oShOUeZr0hM96I= + +make-fetch-happen@^5.0.0: + version "5.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" + integrity sha1-qoOHEE8mh+3KAchofuRQE9AtGb0= + dependencies: + agentkeepalive "^3.4.1" + cacache "^12.0.0" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^6.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8= + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.12: + version "2.0.12" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mdn-data/-/mdn-data-2.0.12.tgz#bbb658d08b38f574bbb88f7b83703defdcc46844" + integrity sha1-u7ZY0Is49XS7uI97g3A979zEaEQ= + +mdn-data@2.0.4: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs= + +media-typer@0.3.0: + version "0.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha1-L93n5gIJOfcJBqaPLXrmheTIxkY= + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= + +merge2@^1.3.0: + version "1.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= + +methods@~1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk= + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha1-8IA1HIZbDcViqEYpZtqlNUPHik0= + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.44.0: + version "1.44.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I= + +"mime-db@>= 1.43.0 < 2": + version "1.45.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha1-zO7aIczXw6dF66LezVXUtz54eeo= + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.27" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8= + dependencies: + mime-db "1.44.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= + +mime@^2.4.4, mime@^2.4.5: + version "2.4.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha1-5bQHyQ20QvK+tbFiNz0Htpr/pNE= + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= + +mini-css-extract-plugin@1.2.1: + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mini-css-extract-plugin/-/mini-css-extract-plugin-1.2.1.tgz#30ea7dee632b3002b0c77aeed447790408cb247e" + integrity sha1-MOp97mMrMAKwx3ru1Ed5BAjLJH4= + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc= + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc= + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M= + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw= + dependencies: + minipass "^3.0.0" + +minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY= + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha1-fUL/HzljVILhX5zbUxhN7r1YFf0= + dependencies: + yallist "^4.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha1-IpDeloGKNMKVUcio0wEha9Zahh0= + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha1-6Q00Zrogm5MkUVCKEc49NjIUWTE= + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha1-6goykfl+C16HdrNj1fChLZTGcCI= + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha1-PrXtYmInVteaXw4qIh3+utdcL34= + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= + +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: + version "2.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha1-oOx72QVcQoL3kMPIL04o2zsxsik= + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= + +nan@^2.12.1: + version "2.14.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk= + +nanoid@^3.1.16: + version "3.1.16" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/nanoid/-/nanoid-3.1.16.tgz#b21f0a7d031196faf75314d7c65d36352beeef64" + integrity sha1-sh8KfQMRlvr3UxTXxl02NSvu72Q= + +nanomatch@^1.2.9: + version "1.2.13" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-request@^1.0.5: + version "1.0.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/native-request/-/native-request-1.0.8.tgz#8f66bf606e0f7ea27c0e5995eb2f5d03e33ae6fb" + integrity sha1-j2a/YG4PfqJ8DlmV6y9dA+M65vs= + +negotiator@0.6.2: + version "0.6.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= + +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= + +next-tick@~1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= + +node-fetch-npm@^2.0.2: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" + integrity sha1-ZQfQ4XqewL477FFpWKSXzsVL9aQ= + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + +node-forge@^0.10.0: + version "0.10.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU= + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.66: + version "1.1.66" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/node-releases/-/node-releases-1.1.66.tgz#609bd0dc069381015cd982300bae51ab4f1b1814" + integrity sha1-YJvQ3AaTgQFc2YIwC65Rq08bGBQ= + +normalize-package-data@^2.4.0: + version "2.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= + +normalize-range@^0.1.2: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^3.0.0: + version "3.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha1-suHE3E98bVd0PfczpPWXjRhlBVk= + +npm-bundled@^1.0.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha1-Ht1XCGWpTNsbyCIHdeKUZsn7I0s= + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + integrity sha1-o3+sx2Oi/eBJfvLG0Kx8P74A17Q= + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha1-bnmkHyP9I1wGIyGCKNp9nCO49uI= + +npm-package-arg@8.1.0, npm-package-arg@^8.0.0: + version "8.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-package-arg/-/npm-package-arg-8.1.0.tgz#b5f6319418c3246a1c38e1a8fbaa06231bc5308f" + integrity sha1-tfYxlBjDJGocOOGo+6oGIxvFMI8= + dependencies: + hosted-git-info "^3.0.6" + semver "^7.0.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: + version "6.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha1-AhaMsKSaK3W/mIooaY3ntSnfXLc= + dependencies: + hosted-git-info "^2.7.1" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.12: + version "1.4.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha1-Vu5swTW5+YrT1Rwcldoiu7my7z4= + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@6.1.0: + version "6.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz#2befed87b0fce956790f62d32afb56d7539c022a" + integrity sha1-K+/th7D86VZ5D2LTKvtW11OcAio= + dependencies: + npm-install-checks "^4.0.0" + npm-package-arg "^8.0.0" + semver "^7.0.0" + +npm-pick-manifest@^3.0.0: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7" + integrity sha1-9Nnl/UviFT5fTl+be+jcQZqZq7c= + dependencies: + figgy-pudding "^3.5.1" + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-registry-fetch@^4.0.0: + version "4.0.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7" + integrity sha1-V5Ub9lQeAkazTJ+aOKtzYHyUSdc= + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^5.1.1" + make-fetch-happen "^5.0.0" + npm-package-arg "^6.1.0" + safe-buffer "^5.2.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-copy@^0.1.0: + version "0.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.8.0: + version "1.8.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA= + +object-is@^1.0.1: + version "1.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" + integrity sha1-LjueZVYBN0Ve471irsTZCi6hzIE= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4= + +object-visit@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha1-Npvx+VktiridcS3O1cuBx8U1Jkk= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4= + +on-finished@~2.3.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= + dependencies: + mimic-fn "^2.1.0" + +open@7.3.0: + version "7.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" + integrity sha1-RUYf3uRkRPNkW24U6zypS4Lhvmk= + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w= + dependencies: + is-wsl "^1.1.0" + +ora@5.1.0: + version "5.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ora/-/ora-5.1.0.tgz#b188cf8cd2d4d9b13fd25383bc3e5cba352c94f8" + integrity sha1-sYjPjNLU2bE/0lODvD5cujUslPg= + dependencies: + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.4.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8= + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.5: + version "0.1.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha1-FmTgEK88rcaBuq/T4qQ3vnsPtf4= + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha1-o0KLtwiLOmApL2aRkni3wpetTwc= + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha1-MQko/u+cnsxltosXaTAYpmXOoXU= + +p-map@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha1-uy+Vpe2i7BaOySdOBqdHw+KQTSs= + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha1-MWtMiJPiyNwc+okfQGxLQivr8yg= + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= + +pacote@9.5.12: + version "9.5.12" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66" + integrity sha1-HhHdeo1za8w2s3WpgE1BuwN3v2Y= + dependencies: + bluebird "^3.5.3" + cacache "^12.0.2" + chownr "^1.1.2" + figgy-pudding "^3.5.1" + get-stream "^4.1.0" + glob "^7.1.3" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + make-fetch-happen "^5.0.0" + minimatch "^3.0.4" + minipass "^2.3.5" + mississippi "^3.0.0" + mkdirp "^0.5.1" + normalize-package-data "^2.4.0" + npm-normalize-package-bin "^1.0.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.1.12" + npm-pick-manifest "^3.0.0" + npm-registry-fetch "^4.0.0" + osenv "^0.1.5" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^5.0.1" + rimraf "^2.6.2" + safe-buffer "^5.1.2" + semver "^5.6.0" + ssri "^6.0.1" + tar "^4.4.10" + unique-filename "^1.1.1" + which "^1.3.1" + +pako@~1.0.2, pako@~1.0.5: + version "1.0.11" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8= + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw= + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ= + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha1-+WCIzfJKj6qa6poAny2dlCyZlkY= + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5-html-rewriting-stream@6.0.1: + version "6.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" + integrity sha1-3hggVZMXq05FHqctugX939kUSAs= + dependencies: + parse5 "^6.0.1" + parse5-sax-parser "^6.0.1" + +parse5-sax-parser@^6.0.1: + version "6.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" + integrity sha1-mLTTZrWyZqfNkLS1iQZmeviC2ro= + dependencies: + parse5 "^6.0.1" + +parse5@^6.0.1: + version "6.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws= + +parseqs@0.0.5: + version "0.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.6: + version "0.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha1-jku1oZ0c3IRKCKyXTTTic6+mcNU= + +parseuri@0.0.5: + version "0.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.6: + version "0.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha1-4Ulugp46wv9H85pN0ESzKCPEolo= + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha1-5sTd1+06onxoogzE5Q4aTug7vEo= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha1-y4cksPramEWWhW0abrr9NYRlS5Q= + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0= + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM= + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= + dependencies: + find-up "^4.0.0" + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha1-yXEaxNxIpoXauvyG+Lbdn434QUk= + dependencies: + ts-pnp "^1.1.6" + +portfinder@^1.0.26: + version "1.0.28" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g= + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha1-+KbpnxLmGcLrwjz2xIb9wVhgkz4= + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha1-rgYLzpPteUrHEmTwgTLVUJVr04E= + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha1-H7q9LCRr/2qq15l7KwkY9NevQDM= + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha1-P+EzzTyCKC5VD8myORdqkge3hOs= + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha1-yMlR6fc+2UKAGUWERKAq2Qu592U= + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha1-ZSrvipZybwKfXj4AFG7npOdV/1c= + dependencies: + postcss "^7.0.0" + +postcss-import@12.0.1: + version "12.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + integrity sha1-z4x6sLXMq1ZJAkU25WX4QZKLcVM= + dependencies: + postcss "^7.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-loader@4.0.4: + version "4.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-loader/-/postcss-loader-4.0.4.tgz#b2d005b52e008a44991cf8123bee207e635eb53e" + integrity sha1-stAFtS4AikSZHPgSO+4gfmNetT4= + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ= + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha1-NivqT/Wh+Y5AdacTxsslrv75plA= + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE= + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ= + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g= + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha1-zaHwR8CugMl9vijD52pDuIAldB0= + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha1-67tU+uFZjuz99pGgKz/zs5ClpRw= + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY= + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw= + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha1-izWt067oOhNrBHHg1ZvlilAoXdQ= + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha1-Db4EpM6QY9RmftK+R2u4MMglk1o= + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8= + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw= + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw= + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha1-jgCcoqOUnNr4rSPmtquZy159KNk= + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs= + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE= + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4= + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha1-f9QuvqXpyBRgljniwuhK4nC6SN8= + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha1-F++kBerMbge+NBSlyi0QdGgdTik= + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA= + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM= + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha1-F7mXvHEbMzurFDqu07jT1uPTglg= + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w= + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: + version "3.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha1-n/giVH4okyE88cMO+lGsX9G6goE= + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha1-RD9qIM7WSBor2k+oUypuVdeJoss= + +postcss@7.0.21: + version "7.0.21" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha1-BrsHgkwZwgIcXQVtWxDDW5iffhc= + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@7.0.32: + version "7.0.32" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha1-QxDW7jRwU9o0M9sr5JKIPWLOxZ0= + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32: + version "7.0.35" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha1-0r4AuZj38hHYonaXQHny6SuXDiQ= + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.1.1: + version "8.1.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/postcss/-/postcss-8.1.7.tgz#ff6a82691bd861f3354fd9b17b2332f88171233f" + integrity sha1-/2qCaRvYYfM1T9mxeyMy+IFxIz8= + dependencies: + colorette "^1.2.1" + line-column "^1.0.2" + nanoid "^3.1.16" + source-map "^0.6.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= + +process@^0.11.10: + version "0.11.10" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + +protoduck@^5.0.1: + version "5.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" + integrity sha1-A8NlnKGAB7aaUP2Cp+vMUWJhFR8= + dependencies: + genfun "^5.0.0" + +protractor@~7.0.0: + version "7.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03" + integrity sha1-w+JjYIvXLiwtyAKxGncnEaR5LQM= + dependencies: + "@types/q" "^0.0.32" + "@types/selenium-webdriver" "^3.0.0" + blocking-proxy "^1.0.0" + browserstack "^1.5.1" + chalk "^1.1.3" + glob "^7.0.3" + jasmine "2.8.0" + jasminewd2 "^2.1.0" + q "1.4.1" + saucelabs "^1.5.0" + selenium-webdriver "3.6.0" + source-map-support "~0.4.0" + webdriver-js-extender "2.1.0" + webdriver-manager "^12.1.7" + yargs "^15.3.1" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8= + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA= + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4= + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= + +q@1.4.1: + version "1.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= + +q@^1.1.2, q@^1.4.1: + version "1.5.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qjobs@^1.2.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha1-xF6cYYAL0IfviNfiVkI73Unl0HE= + +qs@6.7.0: + version "6.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw= + +qs@~6.5.2: + version "6.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo= + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha1-ySGW/IarQr6YPxvzF3giSTHWFFg= + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= + +raw-body@2.4.0: + version "2.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI= + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-loader@4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + integrity sha1-GqxrfRrRUB5m79rBUixz5ZpYTrY= + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, 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.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg= + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4= + dependencies: + picomatch "^2.2.1" + +reflect-metadata@^0.1.2: + version "0.1.13" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha1-Z648pXyXKiqhZCsQ/jY/4y1J3Ag= + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha1-5d5xEdZV57pgwFfb6f83yH5lzew= + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo= + +regenerator-runtime@0.13.7, regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha1-ysLazIoepnX+qrrriugziYrkb1U= + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ= + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha1-OzfskEnhlHmAboeMq+fByoPM/lg= + +regexp.prototype.flags@^1.2.0: + version "1.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha1-erqJs8E6ZFCdq888qNn7ub31y3U= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha1-LepamgcjMpj78NuR+pq8TG4PitY= + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM= + +regjsparser@^0.6.4: + version "0.6.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha1-p2n4aEMIQBpm6bUp0kNv9NBmYnI= + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4= + +repeat-string@^1.6.1: + version "1.6.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request@^2.87.0, request@^2.88.2: + version "2.88.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM= + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= + +requires-port@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= + +resolve-url-loader@3.1.2: + version "3.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" + integrity sha1-I14sKOIuPkMrp6XU4wXFmljt/Ag= + dependencies: + adjust-sourcemap-loader "3.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.18.1: + version "1.18.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha1-AY/LLFsgfSpkJK7jYcWiZtqPQTA= + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: + version "1.19.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha1-GvW/YwQJc0oGfK4pMYqsf6KaJnw= + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= + +retry@^0.10.0: + version "0.10.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + +retry@^0.12.0: + version "0.12.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= + +rework-visit@1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rfdc@^1.1.4: + version "1.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" + integrity sha1-unLME2egzNnPgahws7WL060H+MI= + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= + dependencies: + glob "^7.1.3" + +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw= + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup@2.32.1: + version "2.32.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rollup/-/rollup-2.32.1.tgz#625a92c54f5b4d28ada12d618641491d4dbb548c" + integrity sha1-YlqSxU9bTSitoS1hhkFJHU27VIw= + optionalDependencies: + fsevents "~2.1.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= + +run-parallel@^1.1.9: + version "1.1.10" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha1-YKUbKug2Y2yBN33xbLEHNRvNE+8= + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@6.6.3, rxjs@^6.5.3, rxjs@^6.6.0, rxjs@~6.6.0: + version "6.6.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha1-jKhGNcTaqQDA05Z6buesYCce5VI= + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= + +safe-regex@^1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: + version "2.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +sass-loader@10.0.5: + version "10.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sass-loader/-/sass-loader-10.0.5.tgz#f53505b5ddbedf43797470ceb34066ded82bb769" + integrity sha1-9TUFtd2+30N5dHDOs0Bm3tgrt2k= + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sass@1.27.0: + version "1.27.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sass/-/sass-1.27.0.tgz#0657ff674206b95ec20dc638a93e179c78f6ada2" + integrity sha1-Blf/Z0IGuV7CDcY4qT4XnHj2raI= + dependencies: + chokidar ">=2.0.0 <4.0.0" + +saucelabs@^1.5.0: + version "1.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" + integrity sha1-lAWnPDYNRJsjKDmRmobDltN5/Z0= + dependencies: + https-proxy-agent "^2.2.1" + +sax@>=0.6.0, sax@~1.2.4: + version "1.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= + +schema-utils@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A= + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc= + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha1-Z1AvaqK2ai1AMrQnmilEl4oJE+8= + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: + version "3.6.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" + integrity sha1-K6h6FmLAILiYjJga5iyyoBKY6vw= + dependencies: + jszip "^3.1.3" + rimraf "^2.5.4" + tmp "0.0.30" + xml2js "^0.4.17" + +selfsigned@^1.10.7: + version "1.10.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha1-DRcgi30Swz+OrIXEGDXyf8PYGjA= + dependencies: + node-forge "^0.10.0" + +semver-dsl@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" + integrity sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA= + dependencies: + semver "^5.3.0" + +semver-intersect@1.4.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" + integrity sha1-vdnAa+3N0v7bjNNSw8Q+6MYTIfM= + dependencies: + semver "^5.0.0" + +"semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= + +semver@7.0.0: + version "7.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha1-XzyjV2HkfgWyBsba/yz4FPAxa44= + +semver@7.3.2, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2: + version "7.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha1-YElisFK4HtB4aq6EOJ/7pw/9OTg= + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0= + +send@0.17.1: + version "0.17.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg= + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao= + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha1-eIbshIBJpGJGepfT2Rjrsqr5NPQ= + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha1-jymBrZJTH1UDWwH7IwdppA4C76M= + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw= + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slash@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha1-kWBcJdkWUvRmHqacz0XxszHKIbo= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha1-qz8Nb2a4/H/KOVmrWZH4IiF4m+k= + +socket.io-client@2.3.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" + integrity sha1-FNW6LgC5vNFFrkQ6uWs/hsvMG7Q= + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~4.1.0" + engine.io-client "~3.4.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/socket.io-parser/-/socket.io-parser-3.3.1.tgz#f07d9c8cb3fb92633aa93e76d98fd3a334623199" + integrity sha1-8H2cjLP7kmM6qT522Y/TozRiMZk= + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha1-sGr4ODApdYN+qy3JgAN9okBU1ko= + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io@^2.3.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb" + integrity sha1-zXYu1qT67KWbwfPiQ8CWkxHrc/s= + dependencies: + debug "~4.1.0" + engine.io "~3.4.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.3.0" + socket.io-parser "~3.4.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U= + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.20: + version "0.3.20" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha1-smooPsVi74smh7RAM6Tuzqx12FU= + dependencies: + faye-websocket "^0.10.0" + uuid "^3.4.0" + websocket-driver "0.6.5" + +socks-proxy-agent@^4.0.0: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha1-PImR8xRbJ5nnDhG9X7yLGWMRY4Y= + dependencies: + agent-base "~4.2.1" + socks "~2.3.2" + +socks@~2.3.2: + version "2.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" + integrity sha1-ARKfCl1TTSuJdxLtis6rfuZdeOM= + dependencies: + ip "1.1.5" + smart-buffer "^4.1.0" + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ= + +source-map-loader@1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map-loader/-/source-map-loader-1.1.2.tgz#5b782bf08496d3a7f355e1780df0e25190a80991" + integrity sha1-W3gr8ISW06fzVeF4DfDiUZCoCZE= + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.2" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + source-map "^0.6.1" + whatwg-mimetype "^2.3.0" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.19, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: + version "0.5.19" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha1-qYti+G3K9PZzmWSMCFKRq56P7WE= + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.4.0: + version "0.4.18" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8= + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= + +source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M= + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha1-6oBL2UhXQC5pktBaOO8a41qatMQ= + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha1-3s6BrJweZxPl99G28X1Gj6U9iak= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4= + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha1-ANSGOmQArXXfkzYaFghgXl3NzzE= + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha1-t09GYgOj7aRSwCSSuR+56EonZ3s= + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +speed-measure-webpack-plugin@1.3.3: + version "1.3.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz#6ff894fc83e8a6310dde3af863a0329cd79da4f5" + integrity sha1-b/iU/IPopjEN3jr4Y6AynNedpPU= + dependencies: + chalk "^2.0.1" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM= + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.0, ssri@^6.0.1: + version "6.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg= + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.0: + version "8.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" + integrity sha1-ecp04h+M6u3fy0uQFDxFi42YiAg= + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88= + +static-extend@^0.1.1: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs= + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha1-6+J6DDibBPvMIzZClS4Qcxr6m64= + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw= + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha1-1wiCgVWasneEJCebCHfaPDktWj0= + +streamroller@^2.2.4: + version "2.2.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" + integrity sha1-wZjO1C25QIamGTYIGHzoCl8rDlM= + dependencies: + date-format "^2.1.0" + debug "^4.1.1" + fs-extra "^8.1.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE= + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha1-lSGCxGzHssMT0VluYjmSvRY7crU= + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.1: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha1-bd2ah5a8cUtImjriIkaiCPN7+kY= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimstart@^1.0.1: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha1-ItRdqBAVMJzQzdeXh+iRn8XGE+c= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI= + dependencies: + ansi-regex "^5.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +style-loader@2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha1-lmlgL9RpB0DqrsE3eZoDrdu8OTw= + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU= + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +stylus-loader@4.1.1: + version "4.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stylus-loader/-/stylus-loader-4.1.1.tgz#0e94f5d6274932a2dad054d1a736b32146ac7a99" + integrity sha1-DpT11idJMqLa0FTRpzazIUasepk= + dependencies: + fast-glob "^3.2.4" + klona "^2.0.4" + loader-utils "^2.0.0" + normalize-path "^3.0.0" + schema-utils "^3.0.0" + +stylus@0.54.8: + version "0.54.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" + integrity sha1-PaPmWWa8Vnp7BEv+DuzmU+CZ0Uc= + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.6" + mkdirp "~1.0.4" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.3.0" + source-map "^0.7.3" + +supports-color@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= + dependencies: + has-flag "^4.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc= + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@2.0.3: + version "2.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" + integrity sha1-W1IdPQekPDUQVfpDuDVbYtM/0Wo= + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha1-ofzMBrWNth/XpF2i2kT186Pme6I= + +tapable@^2.0.0: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tapable/-/tapable-2.1.1.tgz#b01cc1902d42a7bb30514e320ce21c456f72fd3f" + integrity sha1-sBzBkC1Cp7swUU4yDOIcRW9y/T8= + +tar@^4.4.10: + version "4.4.13" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU= + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +tar@^6.0.2: + version "6.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" + integrity sha1-vegVCG4Qs58dzSmOidWW4VNeIA8= + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terser-webpack-plugin@4.2.3: + version "4.2.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha1-KNrvSoO9F8HbApcHCtwH/Iz8apo= + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha1-oheu+uozDnNP+sthIOwfoxLWBAs= + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@5.3.7: + version "5.3.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/terser/-/terser-5.3.7.tgz#798a4ae2e7ff67050c3e99fcc4e00725827d97e2" + integrity sha1-eYpK4uf/ZwUMPpn8xOAHJYJ9l+I= + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +terser@^4.1.2: + version "4.8.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc= + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.4: + version "5.3.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd" + integrity sha1-mRrouiGj2ZBXm1SqmvEVhhl6dd0= + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +text-table@0.2.0: + version "0.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0: + version "2.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +"through@>=2.2.7 <3", through@X.X.X, through@^2.3.6: + version "2.3.8" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30= + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4= + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@0.0.30: + version "0.0.30" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" + integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.2.1: + version "0.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha1-hFf8MDfc9HGcJRNnoa9lAO4czxQ= + dependencies: + rimraf "^3.0.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tree-kill@1.2.2: + version "1.2.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha1-TKCakJLIi3OnzcXooBtQeweQoMw= + +ts-node@~8.3.0: + version "8.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" + integrity sha1-5AWWGEETcZJKH7XzsSWRXzJO+1c= + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.6" + yn "^3.0.0" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha1-pQCtCEsHmPHDBxrzkeZZEshrypI= + +tslib@2.0.3, tslib@^2.0.0: + version "2.0.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha1-jgdBrEX8DCJuWKF7/D5kubxsphw= + +tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha1-zy04vcNKE0vK8QkcQfZhni9nLQA= + +tslint@~6.1.0: + version "6.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha1-XCOy7MwySH1VI706Rw6aoxeJ2QQ= + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.3" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.13.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k= + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-fest@^0.11.0: + version "0.11.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha1-l6vwhyMQ/tiKXEZrJWgVdhReM/E= + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A= + +type@^2.0.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha1-m9wixkjPjPht0j0yM2pBz7ZHXj8= + +typedarray@^0.0.6: + version "0.0.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@4.0.5, typescript@~4.0.2: + version "4.0.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" + integrity sha1-rp3d/RBp8ctb6z7zshcN18EzI4k= + +ua-parser-js@0.7.21: + version "0.7.21" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha1-hTz5zpP2QvZxdCc8w0Vlrm8wh3c= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha1-JhmADEyCWADv3YNDr33Zkzy+KBg= + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw= + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha1-DZH2AO7rMJaqlisdb8iIduZOpTE= + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ= + +union-value@^1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA= + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha1-uqvOkQg/xk6UWw861hPiZPfNTmw= + dependencies: + imurmurhash "^0.1.4" + +universal-analytics@0.4.23: + version "0.4.23" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/universal-analytics/-/universal-analytics-0.4.23.tgz#d915e676850c25c4156762471bdd7cf2eaaca8ac" + integrity sha1-2RXmdoUMJcQVZ2JHG9188uqsqKw= + dependencies: + debug "^4.1.1" + request "^2.88.2" + uuid "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= + +uri-js@^4.2.2: + version "4.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha1-qnFCYd55PoqCNHp7zJznTobyhgI= + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3: + version "1.4.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha1-qKg1NejACjFuQDpdtKwbm4U64ng= + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha1-a693dLgO6w91INi4HQeYKlmruu4= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE= + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@8.3.1: + version "8.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha1-K6LmygANpg/OWhlpVKskETHgWjE= + +uuid@^3.0.0, uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +vary@~1.1.2: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha1-4rgApT56Kbk1BsPPQRANFsTErY4= + +verror@1.10.0: + version "1.10.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha1-eGQcSIuObKkadfUR56OzKobl3aA= + +void-elements@^2.0.0: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc= + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM= + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha1-wdjRSTFtPqhShIiVy2oL/oh7h98= + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webdriver-js-extender@2.1.0: + version "2.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" + integrity sha1-V9epPADbTMjVVuTT20tdsKgMO7c= + dependencies: + "@types/selenium-webdriver" "^3.0.0" + selenium-webdriver "^3.0.1" + +webdriver-manager@^12.1.7: + version "12.1.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webdriver-manager/-/webdriver-manager-12.1.7.tgz#ed4eaee8f906b33c146e869b55e850553a1b1162" + integrity sha1-7U6u6PkGszwUboabVehQVTobEWI= + dependencies: + adm-zip "^0.4.9" + chalk "^1.1.1" + del "^2.2.0" + glob "^7.0.3" + ini "^1.3.4" + minimist "^1.2.0" + q "^1.4.1" + request "^2.87.0" + rimraf "^2.5.2" + semver "^5.3.0" + xml2js "^0.4.17" + +webpack-dev-middleware@3.7.2, webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha1-ABnD23FuP6XOy/ZPKriKdLqzMfM= + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.0: + version "3.11.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha1-jxVKO84bz9HMYY705wMniFXn/4w= + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.20" + sockjs-client "1.4.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8= + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@5.2.0: + version "5.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack-merge/-/webpack-merge-5.2.0.tgz#31cbcc954f8f89cd4b06ca8d97a38549f7f3f0c9" + integrity sha1-McvMlU+Pic1LBsqNl6OFSffz8Mk= + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@2.0.1: + version "2.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack-sources/-/webpack-sources-2.0.1.tgz#1467f6e692ddce91e88b8044c44347b1087bbd4f" + integrity sha1-FGf25pLdzpHoi4BExENHsQh7vU8= + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha1-7t2OwLko+/HL/plOItLYkPMwqTM= + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-subresource-integrity@1.5.1: + version "1.5.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.1.tgz#6f44ea99987266b70c4ec42ac51064d33e982277" + integrity sha1-b0TqmZhyZrcMTsQqxRBk0z6YInc= + dependencies: + webpack-sources "^1.3.0" + +webpack@4.44.2: + version "4.44.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha1-a/4rCvBVyLLR6Q7SzZNj+EEma3I= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +websocket-driver@0.6.5: + version "0.6.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A= + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha1-f4RzvIOd/YdgituV1+sHUhFXikI= + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78= + +which-module@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.1, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha1-p30g5SAMb6qsl55LOq3Hs91/j+w= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag= + dependencies: + errno "~0.1.7" + +worker-plugin@5.0.0: + version "5.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/worker-plugin/-/worker-plugin-5.0.0.tgz#113b5fe1f4a5d6a957cecd29915bedafd70bb537" + integrity sha1-ETtf4fSl1qlXzs0pkVvtr9cLtTc= + dependencies: + loader-utils "^1.1.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha1-6Tk7oHEC5skaOyIUePAlfNKFblM= + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.2.1: + version "6.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha1-RC/fCkftZPWbal2P8TD0dI7VJPs= + dependencies: + async-limiter "~1.0.0" + +ws@^7.1.2: + version "7.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" + integrity sha1-pd12okGXlA1Ki7ng4VK7RQN2Tac= + +ws@~6.1.0: + version "6.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha1-W1yIAK+rkl6UzLKdFTyNAsF3bvk= + dependencies: + async-limiter "~1.0.0" + +xml2js@^0.4.17: + version "0.4.23" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha1-oMaVFnUkIesqx1juTUzPWIQ+rGY= + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha1-vpuuHIoEbnazESdyY0fQrXACvrM= + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= + +y18n@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha1-le+U+F7MgdAHwmThkKEg8KPIVms= + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= + +yallist@^4.0.0: + version "4.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= + +yaml@^1.10.0: + version "1.10.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha1-O1k63ZRIdgd9TWg/7gEIG9n/8x4= + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha1-Ew8JcC667vJlDVTObj5XBvek+zg= + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.0, yargs-parser@^18.1.2: + version "18.1.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A= + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@15.3.0: + version "15.3.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yargs/-/yargs-15.3.0.tgz#403af6edc75b3ae04bf66c94202228ba119f0976" + integrity sha1-QDr27cdbOuBL9myUICIouhGfCXY= + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.3.1: + version "15.4.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg= + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yeast@0.1.2: + version "0.1.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +yn@^3.0.0: + version "3.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A= + +zone.js@~0.10.2, zone.js@~0.10.3: + version "0.10.3" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" + integrity sha1-Pl5NoDxgfJ3NkuN901aHoUoUDBY= From 51fcbf3bf94bf5bbbff0f51ab08705238353c154 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 13 Nov 2020 15:41:00 +0100 Subject: [PATCH 04/76] Updated list of used tools --- Lectures/Lecture_11/Slides.pptx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/Slides.pptx b/Lectures/Lecture_11/Slides.pptx index 10f9864d..d0d01549 100644 --- a/Lectures/Lecture_11/Slides.pptx +++ b/Lectures/Lecture_11/Slides.pptx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f4e03f1ad1e4c7a092608b2c260398aba72a0934b29a78fed6d4d8e8e14d924 -size 4920753 +oid sha256:d209b2a7891fde227f030d0200de239e2c798605d504523597ea82cc4d21b1a8 +size 4920798 From eceee408a31991e25b6e9d0fb95f1f9ef32ec16e Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 27 Nov 2020 10:54:47 +0100 Subject: [PATCH 05/76] Generated ingredient page --- .../Lecture_11/CookBook/src/app/app.module.ts | 4 ++- .../app/ingredient/ingredient.component.html | 1 + .../app/ingredient/ingredient.component.less | 0 .../ingredient/ingredient.component.spec.ts | 25 +++++++++++++++++++ .../app/ingredient/ingredient.component.ts | 15 +++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 2c3ba299..8001127c 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -3,10 +3,12 @@ import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { IngredientComponent } from './ingredient/ingredient.component'; @NgModule({ declarations: [ - AppComponent + AppComponent, + IngredientComponent ], imports: [ BrowserModule, diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html new file mode 100644 index 00000000..4e6797b6 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -0,0 +1 @@ +

ingredient works!

diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts new file mode 100644 index 00000000..9db07894 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { IngredientComponent } from './ingredient.component'; + +describe('IngredientComponent', () => { + let component: IngredientComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ IngredientComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(IngredientComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts new file mode 100644 index 00000000..1a9de457 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-ingredient', + templateUrl: './ingredient.component.html', + styleUrls: ['./ingredient.component.less'] +}) +export class IngredientComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} From 41e85d04f9bdfec2e003c4bf1d9a352045df91eb Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 27 Nov 2020 11:03:55 +0100 Subject: [PATCH 06/76] Updated routing --- Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts index d425c6f5..753f958d 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -1,7 +1,12 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; +import { AppComponent } from './app.component'; +import { IngredientComponent } from './ingredient/ingredient.component'; -const routes: Routes = []; +const routes: Routes = [ + { path: 'home', component: AppComponent }, + { path: 'ingredient', component: IngredientComponent } +]; @NgModule({ imports: [RouterModule.forRoot(routes)], From 5a050d409692f04b0965bfe86882d4f1c06c8877 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 27 Nov 2020 13:09:25 +0100 Subject: [PATCH 07/76] Added Guid to typescript --- Lectures/Lecture_11/CookBook/package.json | 1 + Lectures/Lecture_11/CookBook/yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/package.json b/Lectures/Lecture_11/CookBook/package.json index 1b7d6c87..8e3229e6 100644 --- a/Lectures/Lecture_11/CookBook/package.json +++ b/Lectures/Lecture_11/CookBook/package.json @@ -19,6 +19,7 @@ "@angular/platform-browser": "~11.0.0", "@angular/platform-browser-dynamic": "~11.0.0", "@angular/router": "~11.0.0", + "guid-typescript": "^1.0.9", "rxjs": "~6.6.0", "tslib": "^2.0.0", "zone.js": "~0.10.2" diff --git a/Lectures/Lecture_11/CookBook/yarn.lock b/Lectures/Lecture_11/CookBook/yarn.lock index ec69ddd9..91d7e7bc 100644 --- a/Lectures/Lecture_11/CookBook/yarn.lock +++ b/Lectures/Lecture_11/CookBook/yarn.lock @@ -4034,6 +4034,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha1-Ila94U02MpWMRl68ltxGfKB6Kfs= +guid-typescript@^1.0.9: + version "1.0.9" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" + integrity sha1-4193ADU1sCl+oIVI9azmrbFIDdw= + handle-thing@^2.0.0: version "2.0.1" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" From 538c2e4980750f62369ea6b0017b4073f449e0f9 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 27 Nov 2020 13:09:51 +0100 Subject: [PATCH 08/76] Added typings for ingredient --- .../CookBook/src/typings/ingredientDetailModel.d.ts | 7 +++++++ .../CookBook/src/typings/ingredientListModel.d.ts | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts create mode 100644 Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts diff --git a/Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts b/Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts new file mode 100644 index 00000000..dababc8d --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts @@ -0,0 +1,7 @@ +import { Guid } from "guid-typescript"; + +declare interface IngredientDetailModel { + id: Guid; + name: string; + description: string; +} diff --git a/Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts b/Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts new file mode 100644 index 00000000..fcf5a57e --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts @@ -0,0 +1,6 @@ +import { Guid } from "guid-typescript"; + +declare interface IngredientListModel { + Id: Guid; + Name: string; +} \ No newline at end of file From c2629f201958e84a942d55c0f70a64cda018d77d Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Fri, 27 Nov 2020 16:15:42 +0100 Subject: [PATCH 09/76] Switched whole back bone to generated api --- Lectures/Lecture_11/CookBook/package.json | 3 +- .../CookBook/src/app/api/api-configuration.ts | 20 + .../CookBook/src/app/api/api.module.ts | 50 ++ .../CookBook/src/app/api/base-service.ts | 34 + .../Lecture_11/CookBook/src/app/api/models.ts | 7 + .../CookBook/src/app/api/models/food-type.ts | 8 + .../app/api/models/ingredient-detail-model.ts | 7 + .../app/api/models/ingredient-list-model.ts | 6 + .../src/app/api/models/recipe-detail-model.ts | 12 + .../models/recipe-list-ingredient-model.ts | 10 + .../src/app/api/models/recipe-list-model.ts | 10 + .../CookBook/src/app/api/models/unit.ts | 11 + .../CookBook/src/app/api/request-builder.ts | 353 ++++++++++ .../CookBook/src/app/api/services.ts | 3 + .../app/api/services/ingredient.service.ts | 283 ++++++++ .../src/app/api/services/logging.service.ts | 73 ++ .../src/app/api/services/recipe.service.ts | 283 ++++++++ .../src/app/api/strict-http-response.ts | 10 + .../CookBook/src/app/api/swagger.json | 653 ++++++++++++++++++ .../Lecture_11/CookBook/src/app/app.module.ts | 4 +- .../src/typings/ingredientDetailModel.d.ts | 7 - .../src/typings/ingredientListModel.d.ts | 6 - Lectures/Lecture_11/CookBook/yarn.lock | 170 ++++- 23 files changed, 2000 insertions(+), 23 deletions(-) create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/api-configuration.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/api.module.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/base-service.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models/food-type.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-detail-model.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-list-model.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models/recipe-detail-model.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-ingredient-model.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-model.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/models/unit.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/request-builder.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/services.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/services/ingredient.service.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/services/logging.service.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/services/recipe.service.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/strict-http-response.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/api/swagger.json delete mode 100644 Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts delete mode 100644 Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts diff --git a/Lectures/Lecture_11/CookBook/package.json b/Lectures/Lecture_11/CookBook/package.json index 8e3229e6..24004b9d 100644 --- a/Lectures/Lecture_11/CookBook/package.json +++ b/Lectures/Lecture_11/CookBook/package.json @@ -41,6 +41,7 @@ "protractor": "~7.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~4.0.2" + "typescript": "~4.0.2", + "ng-openapi-gen": "~0.14.0" } } diff --git a/Lectures/Lecture_11/CookBook/src/app/api/api-configuration.ts b/Lectures/Lecture_11/CookBook/src/app/api/api-configuration.ts new file mode 100644 index 00000000..914ae24e --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/api-configuration.ts @@ -0,0 +1,20 @@ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; + +/** + * Global configuration + */ +@Injectable({ + providedIn: 'root', +}) +export class ApiConfiguration { + rootUrl: string = 'https://localhost:44378'; +} + +/** + * Parameters for `ApiModule.forRoot()` + */ +export interface ApiConfigurationParams { + rootUrl?: string; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/api.module.ts b/Lectures/Lecture_11/CookBook/src/app/api/api.module.ts new file mode 100644 index 00000000..1a0d6743 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/api.module.ts @@ -0,0 +1,50 @@ +/* tslint:disable */ +/* eslint-disable */ +import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { ApiConfiguration, ApiConfigurationParams } from './api-configuration'; + +import { IngredientService } from './services/ingredient.service'; +import { LoggingService } from './services/logging.service'; +import { RecipeService } from './services/recipe.service'; + +/** + * Module that provides all services and configuration. + */ +@NgModule({ + imports: [], + exports: [], + declarations: [], + providers: [ + IngredientService, + LoggingService, + RecipeService, + ApiConfiguration + ], +}) +export class ApiModule { + static forRoot(params: ApiConfigurationParams): ModuleWithProviders { + return { + ngModule: ApiModule, + providers: [ + { + provide: ApiConfiguration, + useValue: params + } + ] + } + } + + constructor( + @Optional() @SkipSelf() parentModule: ApiModule, + @Optional() http: HttpClient + ) { + if (parentModule) { + throw new Error('ApiModule is already loaded. Import in your base AppModule only.'); + } + if (!http) { + throw new Error('You need to import the HttpClientModule in your AppModule! \n' + + 'See also https://github.com/angular/angular/issues/20575'); + } + } +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/base-service.ts b/Lectures/Lecture_11/CookBook/src/app/api/base-service.ts new file mode 100644 index 00000000..a5437af3 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/base-service.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { ApiConfiguration } from './api-configuration'; + +/** + * Base class for services + */ +@Injectable() +export class BaseService { + constructor( + protected config: ApiConfiguration, + protected http: HttpClient + ) { + } + + private _rootUrl: string = ''; + + /** + * Returns the root url for all operations in this service. If not set directly in this + * service, will fallback to `ApiConfiguration.rootUrl`. + */ + get rootUrl(): string { + return this._rootUrl || this.config.rootUrl; + } + + /** + * Sets the root URL for API operations in this service. + */ + set rootUrl(rootUrl: string) { + this._rootUrl = rootUrl; + } +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models.ts b/Lectures/Lecture_11/CookBook/src/app/api/models.ts new file mode 100644 index 00000000..e18e8147 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models.ts @@ -0,0 +1,7 @@ +export { IngredientListModel } from './models/ingredient-list-model'; +export { IngredientDetailModel } from './models/ingredient-detail-model'; +export { RecipeListModel } from './models/recipe-list-model'; +export { FoodType } from './models/food-type'; +export { RecipeDetailModel } from './models/recipe-detail-model'; +export { RecipeListIngredientModel } from './models/recipe-list-ingredient-model'; +export { Unit } from './models/unit'; diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models/food-type.ts b/Lectures/Lecture_11/CookBook/src/app/api/models/food-type.ts new file mode 100644 index 00000000..ed34a302 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models/food-type.ts @@ -0,0 +1,8 @@ +/* tslint:disable */ +/* eslint-disable */ +export enum FoodType { + Unknown = 0, + MainDish = 1, + Soup = 2, + Dessert = 3 +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-detail-model.ts b/Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-detail-model.ts new file mode 100644 index 00000000..1cb0378a --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-detail-model.ts @@ -0,0 +1,7 @@ +/* tslint:disable */ +/* eslint-disable */ +export interface IngredientDetailModel { + description: string; + id?: string; + name: string; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-list-model.ts b/Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-list-model.ts new file mode 100644 index 00000000..b5014286 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models/ingredient-list-model.ts @@ -0,0 +1,6 @@ +/* tslint:disable */ +/* eslint-disable */ +export interface IngredientListModel { + id?: string; + name?: null | string; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-detail-model.ts b/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-detail-model.ts new file mode 100644 index 00000000..1480b5cd --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-detail-model.ts @@ -0,0 +1,12 @@ +/* tslint:disable */ +/* eslint-disable */ +import { FoodType } from './food-type'; +import { RecipeListIngredientModel } from './recipe-list-ingredient-model'; +export interface RecipeDetailModel { + description?: null | string; + duration?: string; + foodType?: FoodType; + id?: string; + ingredients?: null | Array; + name?: null | string; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-ingredient-model.ts b/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-ingredient-model.ts new file mode 100644 index 00000000..08207406 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-ingredient-model.ts @@ -0,0 +1,10 @@ +/* tslint:disable */ +/* eslint-disable */ +import { IngredientListModel } from './ingredient-list-model'; +import { Unit } from './unit'; +export interface RecipeListIngredientModel { + amount?: number; + ingredient?: null | IngredientListModel; + unit?: Unit; + unitText?: null | string; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-model.ts b/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-model.ts new file mode 100644 index 00000000..e11fd20d --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models/recipe-list-model.ts @@ -0,0 +1,10 @@ +/* tslint:disable */ +/* eslint-disable */ +import { FoodType } from './food-type'; +export interface RecipeListModel { + duration?: string; + foodType?: FoodType; + foodTypeText?: null | string; + id?: string; + name?: null | string; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/models/unit.ts b/Lectures/Lecture_11/CookBook/src/app/api/models/unit.ts new file mode 100644 index 00000000..ba752750 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/models/unit.ts @@ -0,0 +1,11 @@ +/* tslint:disable */ +/* eslint-disable */ +export enum Unit { + Unknown = 0, + Kg = 1, + L = 2, + Ml = 3, + G = 4, + Pieces = 5, + Spoon = 6 +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/request-builder.ts b/Lectures/Lecture_11/CookBook/src/app/api/request-builder.ts new file mode 100644 index 00000000..d1c2e845 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/request-builder.ts @@ -0,0 +1,353 @@ +/* tslint:disable */ +/* eslint-disable */ +import { HttpRequest, HttpParameterCodec, HttpParams, HttpHeaders } from '@angular/common/http'; + +/** + * Custom parameter codec to correctly handle the plus sign in parameter + * values. See https://github.com/angular/angular/issues/18261 + */ +class ParameterCodec implements HttpParameterCodec { + encodeKey(key: string): string { + return encodeURIComponent(key); + } + + encodeValue(value: string): string { + return encodeURIComponent(value); + } + + decodeKey(key: string): string { + return decodeURIComponent(key); + } + + decodeValue(value: string): string { + return decodeURIComponent(value); + } +} +const ParameterCodecInstance = new ParameterCodec(); + +/** + * Defines the options for appending a parameter + */ +interface ParameterOptions { + style?: string; + explode?: boolean; +} + +/** + * Base class for a parameter + */ +abstract class Parameter { + constructor(public name: string, public value: any, public options: ParameterOptions, defaultStyle: string, defaultExplode: boolean) { + this.options = options || {}; + if (this.options.style === null || this.options.style === undefined) { + this.options.style = defaultStyle; + } + if (this.options.explode === null || this.options.explode === undefined) { + this.options.explode = defaultExplode; + } + } + + serializeValue(value: any, separator = ','): string { + if (value === null || value === undefined) { + return ''; + } else if (value instanceof Array) { + return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator); + } else if (typeof value === 'object') { + const array: string[] = []; + for (const key of Object.keys(value)) { + let propVal = value[key]; + if (propVal !== null && propVal !== undefined) { + propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator)); + if (this.options.explode) { + array.push(`${key}=${propVal}`); + } else { + array.push(key); + array.push(propVal); + } + } + } + return array.join(separator); + } else { + return String(value); + } + } +} + +/** + * A parameter in the operation path + */ +class PathParameter extends Parameter { + constructor(name: string, value: any, options: ParameterOptions) { + super(name, value, options, 'simple', false); + } + + append(path: string): string { + let value = this.value; + if (value === null || value === undefined) { + value = ''; + } + let prefix = this.options.style === 'label' ? '.' : ''; + let separator = this.options.explode ? prefix === '' ? ',' : prefix : ','; + if (this.options.style === 'matrix') { + // The parameter name is just used as prefix, except in some cases... + prefix = `;${this.name}=`; + if (this.options.explode && typeof value === 'object') { + prefix = ';'; + if (value instanceof Array) { + // For arrays we have to repeat the name for each element + value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`); + separator = ';'; + } else { + // For objects we have to put each the key / value pairs + value = this.serializeValue(value, ';'); + } + } + } + value = prefix + this.serializeValue(value, separator); + // Replace both the plain variable and the corresponding variant taking in the prefix and explode into account + path = path.replace(`{${this.name}}`, value); + path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value); + return path; + } +} + +/** + * A parameter in the query + */ +class QueryParameter extends Parameter { + constructor(name: string, value: any, options: ParameterOptions) { + super(name, value, options, 'form', true); + } + + append(params: HttpParams): HttpParams { + if (this.value instanceof Array) { + // Array serialization + if (this.options.explode) { + for (const v of this.value) { + params = params.append(this.name, this.serializeValue(v)); + } + } else { + const separator = this.options.style === 'spaceDelimited' + ? ' ' : this.options.style === 'pipeDelimited' + ? '|' : ','; + return params.append(this.name, this.serializeValue(this.value, separator)); + } + } else if (this.value !== null && typeof this.value === 'object') { + // Object serialization + if (this.options.style === 'deepObject') { + // Append a parameter for each key, in the form `name[key]` + for (const key of Object.keys(this.value)) { + const propVal = this.value[key]; + if (propVal !== null && propVal !== undefined) { + params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal)); + } + } + } else if (this.options.explode) { + // Append a parameter for each key without using the parameter name + for (const key of Object.keys(this.value)) { + const propVal = this.value[key]; + if (propVal !== null && propVal !== undefined) { + params = params.append(key, this.serializeValue(propVal)); + } + } + } else { + // Append a single parameter whose values are a comma-separated list of key,value,key,value... + const array: any[] = []; + for (const key of Object.keys(this.value)) { + const propVal = this.value[key]; + if (propVal !== null && propVal !== undefined) { + array.push(key); + array.push(propVal); + } + } + params = params.append(this.name, this.serializeValue(array)); + } + } else if (this.value !== null && this.value !== undefined) { + // Plain value + params = params.append(this.name, this.serializeValue(this.value)); + } + return params; + } +} + +/** + * A parameter in the HTTP request header + */ +class HeaderParameter extends Parameter { + constructor(name: string, value: any, options: ParameterOptions) { + super(name, value, options, 'simple', false); + } + + append(headers: HttpHeaders): HttpHeaders { + if (this.value !== null && this.value !== undefined) { + if (this.value instanceof Array) { + for (const v of this.value) { + headers = headers.append(this.name, this.serializeValue(v)); + } + } else { + headers = headers.append(this.name, this.serializeValue(this.value)); + } + } + return headers; + } +} + +/** + * Helper to build http requests from parameters + */ +export class RequestBuilder { + + private _path = new Map(); + private _query = new Map(); + private _header = new Map(); + _bodyContent: any | null; + _bodyContentType?: string; + + constructor( + public rootUrl: string, + public operationPath: string, + public method: string) { + } + + /** + * Sets a path parameter + */ + path(name: string, value: any, options?: ParameterOptions): void { + this._path.set(name, new PathParameter(name, value, options || {})); + } + + /** + * Sets a query parameter + */ + query(name: string, value: any, options?: ParameterOptions): void { + this._query.set(name, new QueryParameter(name, value, options || {})); + } + + /** + * Sets a header parameter + */ + header(name: string, value: any, options?: ParameterOptions): void { + this._header.set(name, new HeaderParameter(name, value, options || {})); + } + + /** + * Sets the body content, along with the content type + */ + body(value: any, contentType = 'application/json'): void { + if (value instanceof Blob) { + this._bodyContentType = value.type; + } else { + this._bodyContentType = contentType; + } + if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') { + // Handle URL-encoded data + const pairs: string[][] = []; + for (const key of Object.keys(value)) { + let val = value[key]; + if (!(val instanceof Array)) { + val = [val]; + } + for (const v of val) { + const formValue = this.formDataValue(v); + if (formValue !== null) { + pairs.push([key, formValue]); + } + } + } + this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&'); + } else if (this._bodyContentType === 'multipart/form-data') { + // Handle multipart form data + const formData = new FormData(); + if (value !== null && value !== undefined) { + for (const key of Object.keys(value)) { + const val = value[key]; + if (val instanceof Array) { + for (const v of val) { + const toAppend = this.formDataValue(v); + if (toAppend !== null) { + formData.append(key, toAppend); + } + } + } else { + const toAppend = this.formDataValue(val); + if (toAppend !== null) { + formData.set(key, toAppend); + } + } + } + } + this._bodyContent = formData; + } else { + // The body is the plain content + this._bodyContent = value; + } + } + + private formDataValue(value: any): any { + if (value === null || value === undefined) { + return null; + } + if (value instanceof Blob) { + return value; + } + if (typeof value === 'object') { + return JSON.stringify(value); + } + return String(value); + } + + /** + * Builds the request with the current set parameters + */ + build(options?: { + /** Which content types to accept */ + accept?: string; + + /** The expected response type */ + responseType?: 'json' | 'text' | 'blob' | 'arraybuffer'; + + /** Whether to report progress on uploads / downloads */ + reportProgress?: boolean; + }): HttpRequest { + + options = options || {}; + + // Path parameters + let path = this.operationPath; + for (const pathParam of this._path.values()) { + path = pathParam.append(path); + } + const url = this.rootUrl + path; + + // Query parameters + let httpParams = new HttpParams({ + encoder: ParameterCodecInstance + }); + for (const queryParam of this._query.values()) { + httpParams = queryParam.append(httpParams); + } + + // Header parameters + let httpHeaders = new HttpHeaders(); + if (options.accept) { + httpHeaders = httpHeaders.append('Accept', options.accept); + } + for (const headerParam of this._header.values()) { + httpHeaders = headerParam.append(httpHeaders); + } + + // Request content headers + if (this._bodyContentType && !(this._bodyContent instanceof FormData)) { + httpHeaders = httpHeaders.set('Content-Type', this._bodyContentType); + } + + // Perform the request + return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, { + params: httpParams, + headers: httpHeaders, + responseType: options.responseType, + reportProgress: options.reportProgress + }); + } +} + diff --git a/Lectures/Lecture_11/CookBook/src/app/api/services.ts b/Lectures/Lecture_11/CookBook/src/app/api/services.ts new file mode 100644 index 00000000..9d50a2dc --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/services.ts @@ -0,0 +1,3 @@ +export { IngredientService } from './services/ingredient.service'; +export { LoggingService } from './services/logging.service'; +export { RecipeService } from './services/recipe.service'; diff --git a/Lectures/Lecture_11/CookBook/src/app/api/services/ingredient.service.ts b/Lectures/Lecture_11/CookBook/src/app/api/services/ingredient.service.ts new file mode 100644 index 00000000..5e6358e3 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/services/ingredient.service.ts @@ -0,0 +1,283 @@ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { BaseService } from '../base-service'; +import { ApiConfiguration } from '../api-configuration'; +import { StrictHttpResponse } from '../strict-http-response'; +import { RequestBuilder } from '../request-builder'; +import { Observable } from 'rxjs'; +import { map, filter } from 'rxjs/operators'; + +import { IngredientDetailModel } from '../models/ingredient-detail-model'; +import { IngredientListModel } from '../models/ingredient-list-model'; + +@Injectable({ + providedIn: 'root', +}) +export class IngredientService extends BaseService { + constructor( + config: ApiConfiguration, + http: HttpClient + ) { + super(config, http); + } + + /** + * Path part for operation ingredientGetAll + */ + static readonly IngredientGetAllPath = '/api/Ingredient'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `ingredientGetAll()` instead. + * + * This method doesn't expect any request body. + */ + ingredientGetAll$Response(params?: { + version?: string; + culture?: any; + }): Observable>> { + + const rb = new RequestBuilder(this.rootUrl, IngredientService.IngredientGetAllPath, 'get'); + if (params) { + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `ingredientGetAll$Response()` instead. + * + * This method doesn't expect any request body. + */ + ingredientGetAll(params?: { + version?: string; + culture?: any; + }): Observable> { + + return this.ingredientGetAll$Response(params).pipe( + map((r: StrictHttpResponse>) => r.body as Array) + ); + } + + /** + * Path part for operation ingredientUpdate + */ + static readonly IngredientUpdatePath = '/api/Ingredient'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `ingredientUpdate()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + ingredientUpdate$Response(params: { + version?: string; + culture?: any; + body: IngredientDetailModel + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, IngredientService.IngredientUpdatePath, 'put'); + if (params) { + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + rb.body(params.body, 'application/json'); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `ingredientUpdate$Response()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + ingredientUpdate(params: { + version?: string; + culture?: any; + body: IngredientDetailModel + }): Observable { + + return this.ingredientUpdate$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as string) + ); + } + + /** + * Path part for operation ingredientCreate + */ + static readonly IngredientCreatePath = '/api/Ingredient'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `ingredientCreate()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + ingredientCreate$Response(params: { + version?: string; + culture?: any; + body: IngredientDetailModel + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, IngredientService.IngredientCreatePath, 'post'); + if (params) { + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + rb.body(params.body, 'application/json'); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `ingredientCreate$Response()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + ingredientCreate(params: { + version?: string; + culture?: any; + body: IngredientDetailModel + }): Observable { + + return this.ingredientCreate$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as string) + ); + } + + /** + * Path part for operation ingredientGetById + */ + static readonly IngredientGetByIdPath = '/api/Ingredient/{id}'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `ingredientGetById()` instead. + * + * This method doesn't expect any request body. + */ + ingredientGetById$Response(params: { + id: string; + version?: string; + culture?: any; + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, IngredientService.IngredientGetByIdPath, 'get'); + if (params) { + rb.path('id', params.id, {}); + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `ingredientGetById$Response()` instead. + * + * This method doesn't expect any request body. + */ + ingredientGetById(params: { + id: string; + version?: string; + culture?: any; + }): Observable { + + return this.ingredientGetById$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as IngredientDetailModel) + ); + } + + /** + * Path part for operation ingredientDelete + */ + static readonly IngredientDeletePath = '/api/Ingredient/{id}'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `ingredientDelete()` instead. + * + * This method doesn't expect any request body. + */ + ingredientDelete$Response(params: { + id: string; + version?: string; + culture?: any; + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, IngredientService.IngredientDeletePath, 'delete'); + if (params) { + rb.path('id', params.id, {}); + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + } + + return this.http.request(rb.build({ + responseType: 'blob', + accept: 'application/octet-stream' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `ingredientDelete$Response()` instead. + * + * This method doesn't expect any request body. + */ + ingredientDelete(params: { + id: string; + version?: string; + culture?: any; + }): Observable { + + return this.ingredientDelete$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as Blob) + ); + } + +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/services/logging.service.ts b/Lectures/Lecture_11/CookBook/src/app/api/services/logging.service.ts new file mode 100644 index 00000000..c16a7c94 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/services/logging.service.ts @@ -0,0 +1,73 @@ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { BaseService } from '../base-service'; +import { ApiConfiguration } from '../api-configuration'; +import { StrictHttpResponse } from '../strict-http-response'; +import { RequestBuilder } from '../request-builder'; +import { Observable } from 'rxjs'; +import { map, filter } from 'rxjs/operators'; + + +@Injectable({ + providedIn: 'root', +}) +export class LoggingService extends BaseService { + constructor( + config: ApiConfiguration, + http: HttpClient + ) { + super(config, http); + } + + /** + * Path part for operation loggingLogSomething + */ + static readonly LoggingLogSomethingPath = '/api/Logging'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `loggingLogSomething()` instead. + * + * This method doesn't expect any request body. + */ + loggingLogSomething$Response(params?: { + version?: string; + culture?: any; + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, LoggingService.LoggingLogSomethingPath, 'get'); + if (params) { + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + } + + return this.http.request(rb.build({ + responseType: 'text', + accept: '*/*' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `loggingLogSomething$Response()` instead. + * + * This method doesn't expect any request body. + */ + loggingLogSomething(params?: { + version?: string; + culture?: any; + }): Observable { + + return this.loggingLogSomething$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as void) + ); + } + +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/services/recipe.service.ts b/Lectures/Lecture_11/CookBook/src/app/api/services/recipe.service.ts new file mode 100644 index 00000000..76c43edd --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/services/recipe.service.ts @@ -0,0 +1,283 @@ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { BaseService } from '../base-service'; +import { ApiConfiguration } from '../api-configuration'; +import { StrictHttpResponse } from '../strict-http-response'; +import { RequestBuilder } from '../request-builder'; +import { Observable } from 'rxjs'; +import { map, filter } from 'rxjs/operators'; + +import { RecipeDetailModel } from '../models/recipe-detail-model'; +import { RecipeListModel } from '../models/recipe-list-model'; + +@Injectable({ + providedIn: 'root', +}) +export class RecipeService extends BaseService { + constructor( + config: ApiConfiguration, + http: HttpClient + ) { + super(config, http); + } + + /** + * Path part for operation recipeGetAll + */ + static readonly RecipeGetAllPath = '/api/Recipe'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `recipeGetAll()` instead. + * + * This method doesn't expect any request body. + */ + recipeGetAll$Response(params?: { + version?: string; + culture?: any; + }): Observable>> { + + const rb = new RequestBuilder(this.rootUrl, RecipeService.RecipeGetAllPath, 'get'); + if (params) { + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `recipeGetAll$Response()` instead. + * + * This method doesn't expect any request body. + */ + recipeGetAll(params?: { + version?: string; + culture?: any; + }): Observable> { + + return this.recipeGetAll$Response(params).pipe( + map((r: StrictHttpResponse>) => r.body as Array) + ); + } + + /** + * Path part for operation recipeUpdate + */ + static readonly RecipeUpdatePath = '/api/Recipe'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `recipeUpdate()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + recipeUpdate$Response(params: { + version?: string; + culture?: any; + body: RecipeDetailModel + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, RecipeService.RecipeUpdatePath, 'put'); + if (params) { + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + rb.body(params.body, 'application/json'); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `recipeUpdate$Response()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + recipeUpdate(params: { + version?: string; + culture?: any; + body: RecipeDetailModel + }): Observable { + + return this.recipeUpdate$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as string) + ); + } + + /** + * Path part for operation recipeCreate + */ + static readonly RecipeCreatePath = '/api/Recipe'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `recipeCreate()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + recipeCreate$Response(params: { + version?: string; + culture?: any; + body: RecipeDetailModel + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, RecipeService.RecipeCreatePath, 'post'); + if (params) { + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + rb.body(params.body, 'application/json'); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `recipeCreate$Response()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + recipeCreate(params: { + version?: string; + culture?: any; + body: RecipeDetailModel + }): Observable { + + return this.recipeCreate$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as string) + ); + } + + /** + * Path part for operation recipeGetById + */ + static readonly RecipeGetByIdPath = '/api/Recipe/{id}'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `recipeGetById()` instead. + * + * This method doesn't expect any request body. + */ + recipeGetById$Response(params: { + id: string; + version?: string; + culture?: any; + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, RecipeService.RecipeGetByIdPath, 'get'); + if (params) { + rb.path('id', params.id, {}); + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + } + + return this.http.request(rb.build({ + responseType: 'json', + accept: 'application/json' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `recipeGetById$Response()` instead. + * + * This method doesn't expect any request body. + */ + recipeGetById(params: { + id: string; + version?: string; + culture?: any; + }): Observable { + + return this.recipeGetById$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as RecipeDetailModel) + ); + } + + /** + * Path part for operation recipeDelete + */ + static readonly RecipeDeletePath = '/api/Recipe/{id}'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `recipeDelete()` instead. + * + * This method doesn't expect any request body. + */ + recipeDelete$Response(params: { + id: string; + version?: string; + culture?: any; + }): Observable> { + + const rb = new RequestBuilder(this.rootUrl, RecipeService.RecipeDeletePath, 'delete'); + if (params) { + rb.path('id', params.id, {}); + rb.query('version', params.version, {}); + rb.query('culture', params.culture, {}); + } + + return this.http.request(rb.build({ + responseType: 'blob', + accept: 'application/octet-stream' + })).pipe( + filter((r: any) => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access to only to the response body. + * To access the full response (for headers, for example), `recipeDelete$Response()` instead. + * + * This method doesn't expect any request body. + */ + recipeDelete(params: { + id: string; + version?: string; + culture?: any; + }): Observable { + + return this.recipeDelete$Response(params).pipe( + map((r: StrictHttpResponse) => r.body as Blob) + ); + } + +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/strict-http-response.ts b/Lectures/Lecture_11/CookBook/src/app/api/strict-http-response.ts new file mode 100644 index 00000000..42589fac --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/strict-http-response.ts @@ -0,0 +1,10 @@ +/* tslint:disable */ +/* eslint-disable */ +import { HttpResponse } from '@angular/common/http'; + +/** + * Constrains the http response to not have the body defined as `T | null`, but `T` only. + */ +export type StrictHttpResponse = HttpResponse & { + readonly body: T; +} diff --git a/Lectures/Lecture_11/CookBook/src/app/api/swagger.json b/Lectures/Lecture_11/CookBook/src/app/api/swagger.json new file mode 100644 index 00000000..7cc7cce3 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/api/swagger.json @@ -0,0 +1,653 @@ +{ + "x-generator": "NSwag v13.2.2.0 (NJsonSchema v10.1.4.0 (Newtonsoft.Json v12.0.0.0))", + "openapi": "3.0.0", + "info": { + "title": "My Title", + "version": "1.0.0" + }, + "servers": [ + { + "url": "https://localhost:44378" + } + ], + "paths": { + "/api/Ingredient": { + "get": { + "tags": [ + "Ingredient" + ], + "operationId": "IngredientGetAll", + "parameters": [ + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 1 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IngredientListModel" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Ingredient" + ], + "operationId": "IngredientCreate", + "parameters": [ + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "requestBody": { + "x-name": "ingredient", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IngredientDetailModel" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "guid" + } + } + } + } + } + }, + "put": { + "tags": [ + "Ingredient" + ], + "operationId": "IngredientUpdate", + "parameters": [ + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "requestBody": { + "x-name": "ingredient", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IngredientDetailModel" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "guid" + } + } + } + } + } + } + }, + "/api/Ingredient/{id}": { + "get": { + "tags": [ + "Ingredient" + ], + "operationId": "IngredientGetById", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "guid" + }, + "x-position": 1 + }, + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IngredientDetailModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Ingredient" + ], + "operationId": "IngredientDelete", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "guid" + }, + "x-position": 1 + }, + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + } + }, + "/api/Logging": { + "get": { + "tags": [ + "Logging" + ], + "operationId": "LoggingLogSomething", + "parameters": [ + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 1 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "responses": { + "200": { + "description": "" + } + } + } + }, + "/api/Recipe": { + "get": { + "tags": [ + "Recipe" + ], + "operationId": "RecipeGetAll", + "parameters": [ + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 1 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RecipeListModel" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Recipe" + ], + "operationId": "RecipeCreate", + "parameters": [ + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "requestBody": { + "x-name": "recipe", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecipeDetailModel" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "guid" + } + } + } + } + } + }, + "put": { + "tags": [ + "Recipe" + ], + "operationId": "RecipeUpdate", + "parameters": [ + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "requestBody": { + "x-name": "recipe", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecipeDetailModel" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "guid", + "nullable": true + } + } + } + } + } + } + }, + "/api/Recipe/{id}": { + "get": { + "tags": [ + "Recipe" + ], + "operationId": "RecipeGetById", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "guid" + }, + "x-position": 1 + }, + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecipeDetailModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Recipe" + ], + "operationId": "RecipeDelete", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "guid" + }, + "x-position": 1 + }, + { + "name": "version", + "in": "query", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "type": "string", + "name": "culture", + "in": "query" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "IngredientListModel": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "format": "guid" + }, + "name": { + "type": "string", + "nullable": true + } + } + }, + "IngredientDetailModel": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "description" + ], + "properties": { + "id": { + "type": "string", + "format": "guid" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string", + "minLength": 10 + } + } + }, + "RecipeListModel": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "format": "guid" + }, + "name": { + "type": "string", + "nullable": true + }, + "duration": { + "type": "string", + "format": "time-span" + }, + "foodType": { + "$ref": "#/components/schemas/FoodType" + }, + "foodTypeText": { + "type": "string", + "nullable": true + } + } + }, + "FoodType": { + "type": "integer", + "description": "", + "x-enumNames": [ + "Unknown", + "MainDish", + "Soup", + "Dessert" + ], + "enum": [ + 0, + 1, + 2, + 3 + ] + }, + "RecipeDetailModel": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "format": "guid" + }, + "name": { + "type": "string", + "nullable": true + }, + "description": { + "type": "string", + "nullable": true + }, + "duration": { + "type": "string", + "format": "time-span" + }, + "foodType": { + "$ref": "#/components/schemas/FoodType" + }, + "ingredients": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RecipeListIngredientModel" + } + } + } + }, + "RecipeListIngredientModel": { + "type": "object", + "additionalProperties": false, + "properties": { + "ingredient": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/IngredientListModel" + } + ] + }, + "amount": { + "type": "number", + "format": "double" + }, + "unit": { + "$ref": "#/components/schemas/Unit" + }, + "unitText": { + "type": "string", + "nullable": true + } + } + }, + "Unit": { + "type": "integer", + "description": "", + "x-enumNames": [ + "Unknown", + "Kg", + "L", + "Ml", + "G", + "Pieces", + "Spoon" + ], + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ] + } + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 8001127c..284ba785 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -4,6 +4,7 @@ import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { IngredientComponent } from './ingredient/ingredient.component'; +import {ApiModule} from './api/api.module'; @NgModule({ declarations: [ @@ -12,7 +13,8 @@ import { IngredientComponent } from './ingredient/ingredient.component'; ], imports: [ BrowserModule, - AppRoutingModule + AppRoutingModule, + ApiModule.forRoot({ rootUrl: 'https://localhost:44378//api' }) ], providers: [], bootstrap: [AppComponent] diff --git a/Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts b/Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts deleted file mode 100644 index dababc8d..00000000 --- a/Lectures/Lecture_11/CookBook/src/typings/ingredientDetailModel.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Guid } from "guid-typescript"; - -declare interface IngredientDetailModel { - id: Guid; - name: string; - description: string; -} diff --git a/Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts b/Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts deleted file mode 100644 index fcf5a57e..00000000 --- a/Lectures/Lecture_11/CookBook/src/typings/ingredientListModel.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Guid } from "guid-typescript"; - -declare interface IngredientListModel { - Id: Guid; - Name: string; -} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/yarn.lock b/Lectures/Lecture_11/CookBook/yarn.lock index 91d7e7bc..83c437ee 100644 --- a/Lectures/Lecture_11/CookBook/yarn.lock +++ b/Lectures/Lecture_11/CookBook/yarn.lock @@ -1102,6 +1102,13 @@ merge-source-map "^1.1.0" schema-utils "^2.7.0" +"@loopback/openapi-v3-types@^1.2.1": + version "1.2.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@loopback/openapi-v3-types/-/openapi-v3-types-1.2.1.tgz#8c5998e4390c3f6f3a99d781c42438c277c6d4fd" + integrity sha1-jFmY5DkMP286mdeBxCQ4wnfG1P0= + dependencies: + openapi3-ts "^1.3.0" + "@ngtools/webpack@11.0.1": version "11.0.1" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@ngtools/webpack/-/webpack-11.0.1.tgz#029aaff16d76fbfdf06422dde4c83f3b79c34215" @@ -1162,7 +1169,19 @@ semver "7.3.2" semver-intersect "1.4.0" -"@types/glob@^7.1.1": +"@types/argparse@^1.0.38": + version "1.0.38" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha1-qB/YYG1IH4c6OADG665PHXaKVqk= + +"@types/fs-extra@^8.1.1": + version "8.1.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/fs-extra/-/fs-extra-8.1.1.tgz#1e49f22d09aa46e19b51c0b013cb63d0d923a068" + integrity sha1-HknyLQmqRuGbUcCwE8tj0NkjoGg= + dependencies: + "@types/node" "*" + +"@types/glob@*", "@types/glob@^7.1.1": version "7.1.3" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" integrity sha1-5rqA82t9qtLGhazZJmOC5omFwYM= @@ -1175,16 +1194,33 @@ resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/jasmine/-/jasmine-3.6.1.tgz#f8b95def0016411c58c7adb4791dff29bc62992c" integrity sha1-+Lld7wAWQRxYx620eR3/KbximSw= +"@types/jsesc@^0.4.29": + version "0.4.29" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/jsesc/-/jsesc-0.4.29.tgz#d8db65b72776996c03870306a5b048c26980cf8e" + integrity sha1-2Ntltyd2mWwDhwMGpbBIwmmAz44= + "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.6" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha1-9MfsQ+gbMZqYFRFQMXCfJph4kfA= +"@types/lodash@^4.14.165": + version "4.14.165" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/lodash/-/lodash-4.14.165.tgz#74d55d947452e2de0742bad65270433b63a8c30f" + integrity sha1-dNVdlHRS4t4HQrrWUnBDO2Ooww8= + "@types/minimatch@*": version "3.0.3" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0= +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha1-UDqs/lzCcD1UhDJrGyfvpnoznB8= + dependencies: + "@types/node" "*" + "@types/node@*": version "14.14.7" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d" @@ -1195,6 +1231,11 @@ resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/node/-/node-12.19.4.tgz#cdfbb62e26c7435ed9aab9c941393cc3598e9b46" integrity sha1-zfu2LibHQ17ZqrnJQTk8w1mOm0Y= +"@types/node@^12.19.7": + version "12.19.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/node/-/node-12.19.7.tgz#cf8b6ac088dd9182ac9a1d765f787a8d12490c04" + integrity sha1-z4tqwIjdkYKsmh12X3h6jRJJDAQ= + "@types/parse-json@^4.0.0": version "4.0.0" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -1210,6 +1251,14 @@ resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" integrity sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ= +"@types/rimraf@^2.0.4": + version "2.0.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46" + integrity sha1-QDiHsLU8YQCmw10qsk9szAQv7EY= + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/selenium-webdriver@^3.0.0": version "3.0.17" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" @@ -1574,7 +1623,7 @@ arg@^4.1.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk= -argparse@^1.0.7: +argparse@^1.0.10, argparse@^1.0.7: version "1.0.10" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= @@ -2141,6 +2190,11 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.0" +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + caller-callsite@^2.0.0: version "2.0.0" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -3348,6 +3402,11 @@ entities@^2.0.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha1-mS0xKc999ocLlsV4WMJJoSD4uLU= +eol@^0.9.1: + version "0.9.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" + integrity sha1-9wGRL1BAdL41xhF6XEreSc1Ues0= + err-code@^1.0.0: version "1.1.2" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" @@ -3472,6 +3531,11 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +esm@^3.2.25: + version "3.2.25" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha1-NCwYwp1WFXaIulzjH4Qx+7eVzBA= + esprima@^4.0.0: version "4.0.1" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -4044,6 +4108,18 @@ handle-thing@^2.0.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha1-hX95zjWVgMNA1DCBzGSJcNC7I04= +handlebars@^4.7.6: + version "4.7.6" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha1-1MBcG6+Q6ZRfd6pop6IZqkp9904= + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -4920,7 +4996,7 @@ jsbn@~0.1.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsesc@^2.5.1: +jsesc@^2.5.1, jsesc@^2.5.2: version "2.5.2" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= @@ -4940,6 +5016,15 @@ json-parse-even-better-errors@^2.3.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= +json-schema-ref-parser@^7.1.4: + version "7.1.4" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-schema-ref-parser/-/json-schema-ref-parser-7.1.4.tgz#abb3f2613911e9060dc2268477b40591753facf0" + integrity sha1-q7PyYTkR6QYNwiaEd7QFkXU/rPA= + dependencies: + call-me-maybe "^1.0.1" + js-yaml "^3.13.1" + ono "^6.0.0" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4950,6 +5035,11 @@ json-schema@0.2.3: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@^0.2.5: + version "0.2.5" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-schema/-/json-schema-0.2.5.tgz#97997f50972dd0500214e208c407efa4b5d7063b" + integrity sha1-l5l/UJct0FACFOIIxAfvpLXXBjs= + json-stringify-safe@~5.0.1: version "5.0.1" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -5222,7 +5312,7 @@ lodash.uniq@^4.5.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: version "4.17.20" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI= @@ -5654,7 +5744,7 @@ negotiator@0.6.2: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= -neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= @@ -5664,6 +5754,34 @@ next-tick@~1.0.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= +ng-openapi-gen@~0.14.0: + version "0.14.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ng-openapi-gen/-/ng-openapi-gen-0.14.0.tgz#fdf10f5e695060824105eb5a4c1681186d5eb881" + integrity sha1-/fEPXmlQYIJBBetaTBaBGG1euIE= + dependencies: + "@loopback/openapi-v3-types" "^1.2.1" + "@types/argparse" "^1.0.38" + "@types/fs-extra" "^8.1.1" + "@types/jsesc" "^0.4.29" + "@types/json-schema" "^7.0.6" + "@types/lodash" "^4.14.165" + "@types/mkdirp" "^0.5.2" + "@types/node" "^12.19.7" + "@types/rimraf" "^2.0.4" + argparse "^1.0.10" + eol "^0.9.1" + esm "^3.2.25" + fs-extra "^8.1.0" + handlebars "^4.7.6" + jsesc "^2.5.2" + json-schema "^0.2.5" + json-schema-ref-parser "^7.1.4" + lodash "^4.17.20" + mkdirp "^0.5.5" + rimraf "^2.7.1" + ts-node "^8.10.2" + typescript "^3.9.7" + nice-try@^1.0.4: version "1.0.5" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -5961,6 +6079,11 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +ono@^6.0.0: + version "6.0.1" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ono/-/ono-6.0.1.tgz#1bc14ffb8af1e5db3f7397f75b88e4a2d64bbd71" + integrity sha1-G8FP+4rx5ds/c5f3W4jkotZLvXE= + open@7.3.0: version "7.3.0" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" @@ -5969,6 +6092,11 @@ open@7.3.0: is-docker "^2.0.0" is-wsl "^2.1.1" +openapi3-ts@^1.3.0: + version "1.4.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/openapi3-ts/-/openapi3-ts-1.4.0.tgz#679d5a24be0efc36f5de4fc2c4b8513663e16f65" + integrity sha1-Z51aJL4O/Db13k/CxLhRNmPhb2U= + opn@^5.5.0: version "5.5.0" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -7198,7 +7326,7 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= @@ -7669,7 +7797,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@0.5.19, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: +source-map-support@0.5.19, source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha1-qYti+G3K9PZzmWSMCFKRq56P7WE= @@ -8249,6 +8377,17 @@ tree-kill@1.2.2: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha1-TKCakJLIi3OnzcXooBtQeweQoMw= +ts-node@^8.10.2: + version "8.10.2" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + integrity sha1-7uA3ZGM7EjTd03+NuewQt17H+40= + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + ts-node@~8.3.0: version "8.3.0" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" @@ -8351,11 +8490,21 @@ typescript@4.0.5, typescript@~4.0.2: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" integrity sha1-rp3d/RBp8ctb6z7zshcN18EzI4k= +typescript@^3.9.7: + version "3.9.7" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha1-mNYApevcOPQMsndSLxLcgA6eJfo= + ua-parser-js@0.7.21: version "0.7.21" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" integrity sha1-hTz5zpP2QvZxdCc8w0Vlrm8wh3c= +uglify-js@^3.1.4: + version "3.12.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/uglify-js/-/uglify-js-3.12.0.tgz#b943f129275c41d435eb54b643bbffee71dccf57" + integrity sha1-uUPxKSdcQdQ161S2Q7v/7nHcz1c= + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -8789,6 +8938,11 @@ wildcard@^2.0.0: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha1-p30g5SAMb6qsl55LOq3Hs91/j+w= +wordwrap@^1.0.0: + version "1.0.0" + resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + worker-farm@^1.7.0: version "1.7.0" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -8959,7 +9113,7 @@ yeast@0.1.2: resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= -yn@^3.0.0: +yn@3.1.1, yn@^3.0.0: version "3.1.1" resolved "http://dev-artifactory.dev.local:80/artifactory/api/npm/npm/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A= From 266704180d09c85d1fd0a3c04c10abcf8acaab3a Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 18:49:32 +0100 Subject: [PATCH 10/76] Added stub home --- .../Lecture_11/CookBook/src/app/app.module.ts | 2 ++ .../CookBook/src/app/home/home.component.html | 3 +++ .../CookBook/src/app/home/home.component.less | 0 .../src/app/home/home.component.spec.ts | 25 +++++++++++++++++++ .../CookBook/src/app/home/home.component.ts | 15 +++++++++++ 5 files changed, 45 insertions(+) create mode 100644 Lectures/Lecture_11/CookBook/src/app/home/home.component.html create mode 100644 Lectures/Lecture_11/CookBook/src/app/home/home.component.less create mode 100644 Lectures/Lecture_11/CookBook/src/app/home/home.component.spec.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/home/home.component.ts diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 284ba785..fe6feee7 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -5,11 +5,13 @@ import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { IngredientComponent } from './ingredient/ingredient.component'; import {ApiModule} from './api/api.module'; +import { HomeComponent } from './home/home.component'; @NgModule({ declarations: [ AppComponent, IngredientComponent + HomeComponent ], imports: [ BrowserModule, diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.html b/Lectures/Lecture_11/CookBook/src/app/home/home.component.html new file mode 100644 index 00000000..02bf3b59 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.html @@ -0,0 +1,3 @@ +

Hello, world!

+

At this project you can make your own recipes, so don't hesitate and show the world, what you can cook!

+ \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.less b/Lectures/Lecture_11/CookBook/src/app/home/home.component.less new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/home/home.component.spec.ts new file mode 100644 index 00000000..2c5a1726 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ HomeComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.ts b/Lectures/Lecture_11/CookBook/src/app/home/home.component.ts new file mode 100644 index 00000000..799bafd6 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.less'] +}) +export class HomeComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} From 7ac79c6002ec4d7d51980c7c79d00c7010fde02f Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 18:52:14 +0100 Subject: [PATCH 11/76] Added naviagation and fixed routing --- .../CookBook/src/app/app-routing.module.ts | 7 +- .../CookBook/src/app/app.component.html | 539 +----------------- .../Lecture_11/CookBook/src/app/app.module.ts | 6 +- 3 files changed, 15 insertions(+), 537 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts index 753f958d..5a744fae 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -1,11 +1,12 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; import { IngredientComponent } from './ingredient/ingredient.component'; +import { HomeComponent } from './home/home.component'; const routes: Routes = [ - { path: 'home', component: AppComponent }, - { path: 'ingredient', component: IngredientComponent } + { path: '', redirectTo: 'home', pathMatch: 'full' }, + { path: 'home', component: HomeComponent }, + { path: 'ingredient/*', component: IngredientComponent }, ]; @NgModule({ diff --git a/Lectures/Lecture_11/CookBook/src/app/app.component.html b/Lectures/Lecture_11/CookBook/src/app/app.component.html index e48d8c10..a883e20d 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/app.component.html @@ -1,534 +1,9 @@ - - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - {{ title }} app is running! - - - - - -
- - -

Resources

-

Here are some links to help you get started:

- - - - -

Next Steps

-

What do you want to do next with your app?

- - - -
-
- - - New Component -
- -
- - - Angular Material -
- -
- - - Add PWA Support -
- -
- - - Add Dependency -
- -
- - - Run and Watch Tests -
- -
- - - Build for Production -
-
- - -
-
ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
-
ng add _____
-
ng test
-
ng build --prod
-
- - - - - - - - - - - -
- - - - - - - - - - + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index fe6feee7..72fe2e57 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -4,18 +4,20 @@ import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { IngredientComponent } from './ingredient/ingredient.component'; -import {ApiModule} from './api/api.module'; +import { ApiModule } from './api/api.module'; +import { HttpClientModule } from '@angular/common/http'; import { HomeComponent } from './home/home.component'; @NgModule({ declarations: [ AppComponent, - IngredientComponent + IngredientComponent, HomeComponent ], imports: [ BrowserModule, AppRoutingModule, + HttpClientModule, ApiModule.forRoot({ rootUrl: 'https://localhost:44378//api' }) ], providers: [], From 33bed9621681dc4b9ee36b6207f7fc1ab71f5aef Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 18:53:54 +0100 Subject: [PATCH 12/76] Added igredient page stub --- .../CookBook/src/app/app-routing.module.ts | 2 ++ .../Lecture_11/CookBook/src/app/app.module.ts | 2 ++ .../ingredient-page.component.html | 1 + .../ingredient-page.component.less | 0 .../ingredient-page.component.spec.ts | 25 +++++++++++++++++++ .../ingredient-page.component.ts | 20 +++++++++++++++ 6 files changed, 50 insertions(+) create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts index 5a744fae..212420be 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -1,12 +1,14 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { IngredientComponent } from './ingredient/ingredient.component'; +import { IngredientPageComponent } from './ingredient-page/ingredient-page.component'; import { HomeComponent } from './home/home.component'; const routes: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, { path: 'ingredient/*', component: IngredientComponent }, + { path: 'ingredients', component: IngredientPageComponent } ]; @NgModule({ diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 72fe2e57..504bf18e 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -5,6 +5,7 @@ import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { IngredientComponent } from './ingredient/ingredient.component'; import { ApiModule } from './api/api.module'; +import { IngredientPageComponent } from './ingredient-page/ingredient-page.component'; import { HttpClientModule } from '@angular/common/http'; import { HomeComponent } from './home/home.component'; @@ -12,6 +13,7 @@ import { HomeComponent } from './home/home.component'; declarations: [ AppComponent, IngredientComponent, + IngredientPageComponent, HomeComponent ], imports: [ diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html new file mode 100644 index 00000000..17149710 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -0,0 +1 @@ +

ingredient-page works!

diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts new file mode 100644 index 00000000..942cddc9 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { IngredientPageComponent } from './ingredient-page.component'; + +describe('IngredientPageComponent', () => { + let component: IngredientPageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ IngredientPageComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(IngredientPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts new file mode 100644 index 00000000..0c9a7741 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { IngredientListModel } from '../api/models'; +import { IngredientService } from '../api/services'; + +@Component({ + selector: 'app-ingredient-page', + templateUrl: './ingredient-page.component.html', + styleUrls: ['./ingredient-page.component.less'] +}) +export class IngredientPageComponent implements OnInit { + + constructor(private ingredientService: IngredientService) { } + ingredients: Observable> | undefined; + + ngOnInit(): void { + this.ingredients = this.ingredientService.ingredientGetAll(); + } + +} From 3b844639cd59f76a6663101f743db5f33c8a4b7c Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 19:14:48 +0100 Subject: [PATCH 13/76] Fixed api url --- Lectures/Lecture_11/CookBook/src/app/app.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 504bf18e..d0ce089b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -20,7 +20,7 @@ import { HomeComponent } from './home/home.component'; BrowserModule, AppRoutingModule, HttpClientModule, - ApiModule.forRoot({ rootUrl: 'https://localhost:44378//api' }) + ApiModule.forRoot({ rootUrl: 'https://localhost:44378' }) ], providers: [], bootstrap: [AppComponent] From dc1f856127f43e46411b957bdca1a9463a97d09d Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 19:15:23 +0100 Subject: [PATCH 14/76] Added ingredients list loading --- .../app/ingredient-page/ingredient-page.component.html | 9 ++++++++- .../src/app/ingredient-page/ingredient-page.component.ts | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html index 17149710..fd32d4c3 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -1 +1,8 @@ -

ingredient-page works!

+ + + + + + + +
Name
{{ingredient.name}}
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts index 0c9a7741..5988f5c3 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts @@ -11,10 +11,10 @@ import { IngredientService } from '../api/services'; export class IngredientPageComponent implements OnInit { constructor(private ingredientService: IngredientService) { } - ingredients: Observable> | undefined; + ingredients: Array | undefined; ngOnInit(): void { - this.ingredients = this.ingredientService.ingredientGetAll(); + this.ingredientService.ingredientGetAll().subscribe(loadedIngredients => this.ingredients = loadedIngredients); } } From 7ba00643f91b8da4b1ca91e7f9c7d2b5482e688b Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 19:23:06 +0100 Subject: [PATCH 15/76] Name of ingredient acts like link to it's page --- .../src/app/ingredient-page/ingredient-page.component.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html index fd32d4c3..5c6714b9 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -2,7 +2,9 @@ Name - - {{ingredient.name}} + + + {{ingredient.name}} + \ No newline at end of file From 8fa62d1ae269af21f967a42e935d8177443657a2 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 19:23:59 +0100 Subject: [PATCH 16/76] routing path for ingredients now accepts ingredient id --- Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts index 212420be..ff24cfad 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -7,7 +7,7 @@ import { HomeComponent } from './home/home.component'; const routes: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, - { path: 'ingredient/*', component: IngredientComponent }, + { path: 'ingredient/:id', component: IngredientComponent }, { path: 'ingredients', component: IngredientPageComponent } ]; From eec8d41990976fee8f7b87656f030c3bd27e1c01 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 19:27:56 +0100 Subject: [PATCH 17/76] Added routing to Go to recipes button --- Lectures/Lecture_11/CookBook/src/app/home/home.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.html b/Lectures/Lecture_11/CookBook/src/app/home/home.component.html index 02bf3b59..8b6e1878 100644 --- a/Lectures/Lecture_11/CookBook/src/app/home/home.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.html @@ -1,3 +1,3 @@

Hello, world!

At this project you can make your own recipes, so don't hesitate and show the world, what you can cook!

- \ No newline at end of file + \ No newline at end of file From 752859604b8ade92752ad383b715a19ec5144974 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 30 Nov 2020 19:56:02 +0100 Subject: [PATCH 18/76] Added stub html for ingredint Loaded ingredient id from route --- .../app/ingredient/ingredient.component.html | 19 ++++++++++++++++++- .../app/ingredient/ingredient.component.ts | 11 +++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index 4e6797b6..7a3f980a 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -1 +1,18 @@ -

ingredient works!

+ +

Ingredient

+ +
+
+ + + {{errorMessage}} +
+
+ + +
+ + + + +
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 1a9de457..9183f55a 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -1,4 +1,7 @@ import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { IngredientDetailModel } from '../api/models'; +import { IngredientService } from '../api/services'; @Component({ selector: 'app-ingredient', @@ -7,9 +10,13 @@ import { Component, OnInit } from '@angular/core'; }) export class IngredientComponent implements OnInit { - constructor() { } + constructor(private ingredientService: IngredientService, private route: ActivatedRoute) { } + + errorMessage = ''; + ingredient: IngredientDetailModel | undefined; + id: string = "0"; ngOnInit(): void { + this.id = this.route.snapshot.params.id; } - } From 6872bfc6817f510cdad5033b31e8eb43aab4809b Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Tue, 1 Dec 2020 19:44:07 +0100 Subject: [PATCH 19/76] Added ingredient loading with some error handling --- .../src/app/ingredient/ingredient.component.html | 8 +++++--- .../CookBook/src/app/ingredient/ingredient.component.ts | 9 +++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index 7a3f980a..7ce81cc5 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -1,14 +1,16 @@

Ingredient

-
+

Unable to load given ingredient

+ +
- + {{errorMessage}}
- +
diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 9183f55a..391ce3f6 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -12,11 +12,16 @@ export class IngredientComponent implements OnInit { constructor(private ingredientService: IngredientService, private route: ActivatedRoute) { } + loadIngredientError = ''; errorMessage = ''; ingredient: IngredientDetailModel | undefined; - id: string = "0"; ngOnInit(): void { - this.id = this.route.snapshot.params.id; + const id = this.route.snapshot.params.id; + const request = { id }; + + this.ingredientService.ingredientGetById(request).subscribe( + providedIngredient => this.ingredient = providedIngredient, + error => this.loadIngredientError = 'Unable to load given ingredient'); } } From dd88308f82ddff98b0592ed9f33d769044bb2b41 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Tue, 1 Dec 2020 20:47:01 +0100 Subject: [PATCH 20/76] Ingredient form rebuilded --- .../Lecture_11/CookBook/src/app/app.module.ts | 2 ++ .../app/ingredient/ingredient.component.html | 22 ++++++------ .../app/ingredient/ingredient.component.ts | 36 ++++++++++++++++--- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index d0ce089b..406db73c 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -8,6 +8,7 @@ import { ApiModule } from './api/api.module'; import { IngredientPageComponent } from './ingredient-page/ingredient-page.component'; import { HttpClientModule } from '@angular/common/http'; import { HomeComponent } from './home/home.component'; +import { FormsModule } from '@angular/forms'; @NgModule({ declarations: [ @@ -20,6 +21,7 @@ import { HomeComponent } from './home/home.component'; BrowserModule, AppRoutingModule, HttpClientModule, + FormsModule, ApiModule.forRoot({ rootUrl: 'https://localhost:44378' }) ], providers: [], diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index 7ce81cc5..dd65f696 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -3,18 +3,20 @@

Ingredient

Unable to load given ingredient

- +
- - - {{errorMessage}} -
-
- - + + +
+ Name is required +
- - +
+ + +
+ + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 391ce3f6..8fbc53ee 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -10,18 +10,44 @@ import { IngredientService } from '../api/services'; }) export class IngredientComponent implements OnInit { - constructor(private ingredientService: IngredientService, private route: ActivatedRoute) { } + constructor( + private ingredientService: IngredientService, + private route: ActivatedRoute + ) { } - loadIngredientError = ''; + loadIngredientError = false; errorMessage = ''; - ingredient: IngredientDetailModel | undefined; + model: IngredientDetailModel | undefined; ngOnInit(): void { const id = this.route.snapshot.params.id; const request = { id }; this.ingredientService.ingredientGetById(request).subscribe( - providedIngredient => this.ingredient = providedIngredient, - error => this.loadIngredientError = 'Unable to load given ingredient'); + providedIngredient => this.model = providedIngredient, + error => this.loadIngredientError = true); + } + + onSave(): void { + if (this.model !== undefined) { + const model = this.model; + const request = { body: model }; + + if (model.id !== undefined) { + this.ingredientService.ingredientUpdate(request); + } + else { + this.ingredientService.ingredientCreate(request); + } + } + } + + onDelete(): void { + if (this.model?.id !== undefined) { + const id: string = this.model.id; + const request = { id }; + + this.ingredientService.ingredientDelete(request); + } } } From 737ef65839b8b461be0943ef2ee2ae5fddcfd34c Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Wed, 2 Dec 2020 21:18:59 +0100 Subject: [PATCH 21/76] Fixed missing subsribe proventing http calls being executed --- .../CookBook/src/app/ingredient/ingredient.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 8fbc53ee..9ac91041 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -34,10 +34,10 @@ export class IngredientComponent implements OnInit { const request = { body: model }; if (model.id !== undefined) { - this.ingredientService.ingredientUpdate(request); + this.ingredientService.ingredientUpdate(request).subscribe(); } else { - this.ingredientService.ingredientCreate(request); + this.ingredientService.ingredientCreate(request).subscribe(); } } } @@ -47,7 +47,7 @@ export class IngredientComponent implements OnInit { const id: string = this.model.id; const request = { id }; - this.ingredientService.ingredientDelete(request); + this.ingredientService.ingredientDelete(request).subscribe(); } } } From 39fcd5a0a2d5e2ea1dd30182c70d21d807c90381 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Wed, 2 Dec 2020 21:23:57 +0100 Subject: [PATCH 22/76] Generated page for recipe list --- .../Lecture_11/CookBook/src/app/app.module.ts | 4 ++- .../recipe-page/recipe-page.component.html | 1 + .../recipe-page/recipe-page.component.less | 0 .../recipe-page/recipe-page.component.spec.ts | 25 +++++++++++++++++++ .../app/recipe-page/recipe-page.component.ts | 15 +++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.less create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 406db73c..630fbc71 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -9,13 +9,15 @@ import { IngredientPageComponent } from './ingredient-page/ingredient-page.compo import { HttpClientModule } from '@angular/common/http'; import { HomeComponent } from './home/home.component'; import { FormsModule } from '@angular/forms'; +import { RecipePageComponent } from './recipe-page/recipe-page.component'; @NgModule({ declarations: [ AppComponent, IngredientComponent, IngredientPageComponent, - HomeComponent + HomeComponent, + RecipePageComponent ], imports: [ BrowserModule, diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html new file mode 100644 index 00000000..93d10339 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html @@ -0,0 +1 @@ +

recipe-page works!

diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.less b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.less new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts new file mode 100644 index 00000000..ba5858fb --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RecipePageComponent } from './recipe-page.component'; + +describe('RecipePageComponent', () => { + let component: RecipePageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RecipePageComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RecipePageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts new file mode 100644 index 00000000..322cb61a --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-recipe-page', + templateUrl: './recipe-page.component.html', + styleUrls: ['./recipe-page.component.less'] +}) +export class RecipePageComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} From ca8ae8c3b1f8b3006fbb7a5a738476d4d3014fcc Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Wed, 2 Dec 2020 21:37:35 +0100 Subject: [PATCH 23/76] Added stub face to recipe-page Added loading of recipes --- .../app/recipe-page/recipe-page.component.html | 17 ++++++++++++++++- .../app/recipe-page/recipe-page.component.ts | 6 +++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html index 93d10339..40d5ddc0 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.html @@ -1 +1,16 @@ -

recipe-page works!

+

Recipes

+ + + + + + + + + + +
NameFood type
+ {{recipe.name}} + {{recipe.foodTypeText}}
+ + diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts index 322cb61a..f60db96a 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.ts @@ -1,4 +1,6 @@ import { Component, OnInit } from '@angular/core'; +import { RecipeListModel } from '../api/models'; +import { RecipeService } from '../api/services'; @Component({ selector: 'app-recipe-page', @@ -7,9 +9,11 @@ import { Component, OnInit } from '@angular/core'; }) export class RecipePageComponent implements OnInit { - constructor() { } + constructor(private recipeService: RecipeService) { } + recipes: Array | undefined; ngOnInit(): void { + this.recipeService.recipeGetAll().subscribe(loadedRecipes => this.recipes = loadedRecipes); } } From f7f84de08dc3b486e0011e4f8b5cc86000e6afab Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Wed, 2 Dec 2020 21:37:51 +0100 Subject: [PATCH 24/76] Added routing to recipes --- Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts index ff24cfad..bee86a4b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -3,12 +3,14 @@ import { Routes, RouterModule } from '@angular/router'; import { IngredientComponent } from './ingredient/ingredient.component'; import { IngredientPageComponent } from './ingredient-page/ingredient-page.component'; import { HomeComponent } from './home/home.component'; +import { RecipePageComponent } from './recipe-page/recipe-page.component'; const routes: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, { path: 'ingredient/:id', component: IngredientComponent }, - { path: 'ingredients', component: IngredientPageComponent } + { path: 'ingredients', component: IngredientPageComponent }, + { path: 'recipes', component: RecipePageComponent } ]; @NgModule({ From 1982031a63e1d2fd34c77b226ec87158abb6d45c Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Wed, 2 Dec 2020 21:38:41 +0100 Subject: [PATCH 25/76] Removed unused import --- .../src/app/ingredient-page/ingredient-page.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts index 5988f5c3..3578934e 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts @@ -1,5 +1,4 @@ import { Component, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; import { IngredientListModel } from '../api/models'; import { IngredientService } from '../api/services'; From 7f775ace567cd34dd474e28b577dc76811d47d01 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 21:21:29 +0100 Subject: [PATCH 26/76] Fixed problem with undefined IngredientDetailModel by providing empty one --- .../CookBook/src/app/ingredient/ingredient.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 9ac91041..8d15291e 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -17,7 +17,7 @@ export class IngredientComponent implements OnInit { loadIngredientError = false; errorMessage = ''; - model: IngredientDetailModel | undefined; + model: IngredientDetailModel = {description: '', name: ''} ; ngOnInit(): void { const id = this.route.snapshot.params.id; From bdb214e200eaad9320a51ba221cfaa5b8d6f72fc Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 22:36:39 +0100 Subject: [PATCH 27/76] Updated ingredient component to be usable for creation --- .../app/ingredient/ingredient.component.html | 4 ++-- .../src/app/ingredient/ingredient.component.ts | 17 +++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index dd65f696..1e526b80 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -17,6 +17,6 @@

Ingredient

- - + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 8d15291e..5528848e 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -14,18 +14,22 @@ export class IngredientComponent implements OnInit { private ingredientService: IngredientService, private route: ActivatedRoute ) { } - loadIngredientError = false; + editingAvailable = false; errorMessage = ''; - model: IngredientDetailModel = {description: '', name: ''} ; + model: IngredientDetailModel = { description: '', name: '' }; ngOnInit(): void { const id = this.route.snapshot.params.id; - const request = { id }; + if (id !== undefined) { + const request = { id }; - this.ingredientService.ingredientGetById(request).subscribe( - providedIngredient => this.model = providedIngredient, - error => this.loadIngredientError = true); + this.ingredientService.ingredientGetById(request).subscribe( + providedIngredient => this.model = providedIngredient, + error => this.loadIngredientError = true); + + this.editingAvailable = true; + } } onSave(): void { @@ -38,6 +42,7 @@ export class IngredientComponent implements OnInit { } else { this.ingredientService.ingredientCreate(request).subscribe(); + this.model = { description: '', name: '' }; } } } From a1c07a782cc5e7682af22c86ee15919222d118f5 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 22:36:47 +0100 Subject: [PATCH 28/76] Added igredient component to ingredient page --- .../src/app/ingredient-page/ingredient-page.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html index 5c6714b9..e24604fa 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -1,3 +1,5 @@ + + From 1eec6d1b6caef6a275465b4ec8f24f87801410e4 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 22:53:11 +0100 Subject: [PATCH 29/76] Ingredient List refresh is requested when new ingredient is created --- .../app/ingredient-page/ingredient-page.component.html | 2 +- .../src/app/ingredient-page/ingredient-page.component.ts | 9 ++++++++- .../CookBook/src/app/ingredient/ingredient.component.ts | 6 +++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html index e24604fa..5c18ee16 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -1,4 +1,4 @@ - +
Name
diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts index 3578934e..726e612f 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.ts @@ -13,7 +13,14 @@ export class IngredientPageComponent implements OnInit { ingredients: Array | undefined; ngOnInit(): void { - this.ingredientService.ingredientGetAll().subscribe(loadedIngredients => this.ingredients = loadedIngredients); + this.refreshIngredients(); + } + + onNewIngredientCreated(): void { + this.refreshIngredients(); } + refreshIngredients(): void { + this.ingredientService.ingredientGetAll().subscribe(loadedIngredients => this.ingredients = loadedIngredients); + } } diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 5528848e..8c18e880 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, EventEmitter, OnInit, Output } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { IngredientDetailModel } from '../api/models'; import { IngredientService } from '../api/services'; @@ -14,6 +14,9 @@ export class IngredientComponent implements OnInit { private ingredientService: IngredientService, private route: ActivatedRoute ) { } + + @Output() newIngredientCreated = new EventEmitter(); + loadIngredientError = false; editingAvailable = false; errorMessage = ''; @@ -43,6 +46,7 @@ export class IngredientComponent implements OnInit { else { this.ingredientService.ingredientCreate(request).subscribe(); this.model = { description: '', name: '' }; + this.newIngredientCreated.emit(); } } } From 86a188ef34b1c020e8a27df9e673e75174349591 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 22:57:50 +0100 Subject: [PATCH 30/76] Fixed emmiter for adding new ingredient being called too early --- .../src/app/ingredient/ingredient.component.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 8c18e880..dcd57cd6 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -44,9 +44,13 @@ export class IngredientComponent implements OnInit { this.ingredientService.ingredientUpdate(request).subscribe(); } else { - this.ingredientService.ingredientCreate(request).subscribe(); - this.model = { description: '', name: '' }; - this.newIngredientCreated.emit(); + this.ingredientService.ingredientCreate(request).subscribe( + complete => { + this.model = { description: '', name: '' }; + this.newIngredientCreated.emit(); + } + ); + } } } From 401dbe42a8bc161e494f75e85cf95ec03ce232bf Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 23:32:03 +0100 Subject: [PATCH 31/76] Added header to ingredient page --- .../src/app/ingredient-page/ingredient-page.component.html | 1 + 1 file changed, 1 insertion(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html index 5c18ee16..bc06682b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -1,3 +1,4 @@ +

Ingredients

From 628e891db67d434c74ed0864bcb09a747de6a78f Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 23:32:43 +0100 Subject: [PATCH 32/76] Show header on ingredient component if it is in editMode --- .../CookBook/src/app/ingredient/ingredient.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index 1e526b80..5131f553 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -1,5 +1,5 @@ -

Ingredient

+

Ingredient

Unable to load given ingredient

From bb94949d039ddab849e26f6474b1855d935c39eb Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 23:33:59 +0100 Subject: [PATCH 33/76] Ingredient form is correctly reset when ingredient is created --- .../CookBook/src/app/ingredient/ingredient.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index dcd57cd6..34f844cf 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { IngredientDetailModel } from '../api/models'; import { IngredientService } from '../api/services'; @@ -16,6 +16,7 @@ export class IngredientComponent implements OnInit { ) { } @Output() newIngredientCreated = new EventEmitter(); + @ViewChild('ingredientComponent') form: any; loadIngredientError = false; editingAvailable = false; @@ -47,6 +48,7 @@ export class IngredientComponent implements OnInit { this.ingredientService.ingredientCreate(request).subscribe( complete => { this.model = { description: '', name: '' }; + this.form.reset(); this.newIngredientCreated.emit(); } ); From e81b36b0a9bb65d3e32b47e6e94a5563697b800c Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 23:34:58 +0100 Subject: [PATCH 34/76] Validation of ingredient reworked to be more expresive --- .../app/ingredient/ingredient.component.html | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index 5131f553..e58e2e96 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -6,17 +6,30 @@

Ingredient

- -
- Name is required + +
+
+ Name is required +
- + +
+
+ Description is required +
+
+ Description must be at least 10 characters long +
+
- - + + \ No newline at end of file From e93f484200ae62b4968e993b773e2c446f934900 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 23:36:46 +0100 Subject: [PATCH 35/76] Ingredient component editingAvailable renamed to editMode --- .../CookBook/src/app/ingredient/ingredient.component.html | 6 +++--- .../CookBook/src/app/ingredient/ingredient.component.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index e58e2e96..65549746 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -1,5 +1,5 @@ -

Ingredient

+

Ingredient

Unable to load given ingredient

@@ -30,6 +30,6 @@

Ingredient

- + {{editMode ? "Save" : "Create"}} + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 34f844cf..9639a9a7 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -19,7 +19,7 @@ export class IngredientComponent implements OnInit { @ViewChild('ingredientComponent') form: any; loadIngredientError = false; - editingAvailable = false; + editMode = false; errorMessage = ''; model: IngredientDetailModel = { description: '', name: '' }; @@ -32,7 +32,7 @@ export class IngredientComponent implements OnInit { providedIngredient => this.model = providedIngredient, error => this.loadIngredientError = true); - this.editingAvailable = true; + this.editMode = true; } } From 2777d02010259671b4b1d0d8611741a1a73bb3e8 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Thu, 3 Dec 2020 23:43:20 +0100 Subject: [PATCH 36/76] Fixed after deleting ingredient user was not returned to ingredients page --- .../CookBook/src/app/ingredient/ingredient.component.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts index 9639a9a7..2888c325 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { IngredientDetailModel } from '../api/models'; import { IngredientService } from '../api/services'; @@ -12,6 +12,7 @@ export class IngredientComponent implements OnInit { constructor( private ingredientService: IngredientService, + private router: Router, private route: ActivatedRoute ) { } @@ -62,7 +63,7 @@ export class IngredientComponent implements OnInit { const id: string = this.model.id; const request = { id }; - this.ingredientService.ingredientDelete(request).subscribe(); + this.ingredientService.ingredientDelete(request).subscribe(complete => this.router.navigate(['/ingredients'])); } } } From 0f3e33130fa8facd31ad0db61eaf83f814443a6e Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 16:53:17 +0100 Subject: [PATCH 37/76] Navigation styled --- .../CookBook/src/app/app.component.less | 20 +++++++++++++++++++ Lectures/Lecture_11/CookBook/src/styles.less | 3 +++ 2 files changed, 23 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/app.component.less b/Lectures/Lecture_11/CookBook/src/app/app.component.less index e69de29b..2d398bb2 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/app.component.less @@ -0,0 +1,20 @@ +nav { + background-color: #343a40; + + ul { + list-style-type : none; + margin-top : 0px; + height : 40px; + padding : 5px; + display : flex; + + li { + margin: 1%; + + a { + color : white; + text-decoration: none; + } + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index 90d4ee00..c6ef3a30 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -1 +1,4 @@ /* You can add global styles to this file, and also import other style files */ +body { + margin: 0px; +} \ No newline at end of file From 1dd024d093a3b5fbf8331c31604eec631cb72792 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 17:08:05 +0100 Subject: [PATCH 38/76] Home styled --- .../CookBook/src/app/home/home.component.html | 1 + .../CookBook/src/app/home/home.component.less | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.html b/Lectures/Lecture_11/CookBook/src/app/home/home.component.html index 8b6e1878..0342084b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/home/home.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.html @@ -1,3 +1,4 @@

Hello, world!

At this project you can make your own recipes, so don't hesitate and show the world, what you can cook!

+

Now with Angular Frontend!

\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.less b/Lectures/Lecture_11/CookBook/src/app/home/home.component.less index e69de29b..5b70c85b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/home/home.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.less @@ -0,0 +1,22 @@ +h1 { + margin-left : 20px; + font-size : 2.5rem; + margin-bottom: .5rem; + line-height : 1.2; + font-weight : bold; +} + +p { + margin-left: 10px; + +} + +button { + margin-left : 20px; + font-weight : bold; + text-align : center; + vertical-align : middle; + text-decoration: none; + border : 1px solid black; + padding : 10px 18px; +} \ No newline at end of file From 91d21f6ecce353b69ad295f552f578acd7ee979c Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 17:38:12 +0100 Subject: [PATCH 39/76] Made some styles global --- .../CookBook/src/app/home/home.component.less | 13 ------------- Lectures/Lecture_11/CookBook/src/styles.less | 13 +++++++++++++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.less b/Lectures/Lecture_11/CookBook/src/app/home/home.component.less index 5b70c85b..3deb0bf4 100644 --- a/Lectures/Lecture_11/CookBook/src/app/home/home.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.less @@ -1,16 +1,3 @@ -h1 { - margin-left : 20px; - font-size : 2.5rem; - margin-bottom: .5rem; - line-height : 1.2; - font-weight : bold; -} - -p { - margin-left: 10px; - -} - button { margin-left : 20px; font-weight : bold; diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index c6ef3a30..766644be 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -1,4 +1,17 @@ /* You can add global styles to this file, and also import other style files */ body { margin: 0px; +} + +h1 { + margin-left : 20px; + font-size : 2.5rem; + margin-bottom: .5rem; + line-height : 1.2; + font-weight : bold; +} + +p { + margin-left: 10px; + } \ No newline at end of file From c5ee78cd7c0f31c5488e7d29bd18b309d5deb3d8 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 17:38:29 +0100 Subject: [PATCH 40/76] Ingredient page styled --- .../ingredient-page.component.html | 25 ++++++------ .../ingredient-page.component.less | 38 +++++++++++++++++++ 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html index bc06682b..6f10d895 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -1,13 +1,14 @@

Ingredients

- - -
- - - - - - -
Name
- {{ingredient.name}} -
\ No newline at end of file +
+ + + + + + + + +
Name
+ {{ingredient.name}} +
+
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less index e69de29b..bb75961f 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less @@ -0,0 +1,38 @@ +.flex-wrapper { + display: flex; + padding: 15px; +} + +.flex-block { + flex-basis: 0; + flex-grow : 1; +} + +td, +th { + border : 1px solid #ddd; + padding: 8px; +} + +td { + border-collapse: collapse; + width : 100%; +} + +th { + padding-top : 12px; + padding-bottom : 12px; + text-align : left; + background-color: gray; + color : black; +} + +tr { + a { + text-decoration: none; + } +} + +tr:nth-child(even) { + background-color: #f2f2f2; +} \ No newline at end of file From 56d608931de6879245a6355317975935391c4f3e Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 18:07:44 +0100 Subject: [PATCH 41/76] Button style made global --- .../Lecture_11/CookBook/src/app/home/home.component.less | 6 ------ Lectures/Lecture_11/CookBook/src/styles.less | 9 +++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/home/home.component.less b/Lectures/Lecture_11/CookBook/src/app/home/home.component.less index 3deb0bf4..dad65268 100644 --- a/Lectures/Lecture_11/CookBook/src/app/home/home.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/home/home.component.less @@ -1,9 +1,3 @@ button { margin-left : 20px; - font-weight : bold; - text-align : center; - vertical-align : middle; - text-decoration: none; - border : 1px solid black; - padding : 10px 18px; } \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index 766644be..dfea9441 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -14,4 +14,13 @@ h1 { p { margin-left: 10px; +} + +button { + font-weight : bold; + text-align : center; + vertical-align : middle; + text-decoration: none; + border : 1px solid black; + padding : 10px 18px; } \ No newline at end of file From a4e4bc7b5e462037b689d29602cdae8e8a973c20 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 18:13:51 +0100 Subject: [PATCH 42/76] Ingredint component styled --- .../app/ingredient/ingredient.component.html | 6 ++-- .../app/ingredient/ingredient.component.less | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index 65549746..0fe0c892 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -1,11 +1,11 @@

Ingredient

-

Unable to load given ingredient

+

Unable to load given ingredient

- +
@@ -16,7 +16,7 @@

Ingredient

- +
diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less index e69de29b..982250e2 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less @@ -0,0 +1,34 @@ +form { + margin: 15px; + + .form-group { + padding-bottom: 20px; + + label { + display : block; + padding-bottom: 5px; + font-weight : bold; + } + } +} + +.alert { + padding-left: 8px; +} + +.alert-danger { + color: red; +} + +.btn{ + color:black; + margin-right: 4px; +} + +.btn-success{ + background-color: green; +} + +.btn-default{ + background-color: darkred; +} \ No newline at end of file From f636f89285ae01627b3aa5735c272a56b3fa256b Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 18:17:33 +0100 Subject: [PATCH 43/76] Fixed extensive padding on ingredient page --- .../src/app/ingredient-page/ingredient-page.component.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less index bb75961f..8776a9bb 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less @@ -1,6 +1,5 @@ .flex-wrapper { display: flex; - padding: 15px; } .flex-block { @@ -15,6 +14,7 @@ th { } td { + padding : 15px; border-collapse: collapse; width : 100%; } From 06b6efc8c9103a6d9efceb7f1d74d725189a987c Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 19:01:21 +0100 Subject: [PATCH 44/76] Table styles made global --- .../ingredient-page.component.html | 2 +- .../ingredient-page.component.less | 30 ++----------------- Lectures/Lecture_11/CookBook/src/styles.less | 29 ++++++++++++++++++ 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html index 6f10d895..50f3dc1e 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.html @@ -1,7 +1,7 @@

Ingredients

- +
diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less index 8776a9bb..91325fd5 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less @@ -7,32 +7,6 @@ flex-grow : 1; } -td, -th { - border : 1px solid #ddd; - padding: 8px; -} - -td { - padding : 15px; - border-collapse: collapse; - width : 100%; -} - -th { - padding-top : 12px; - padding-bottom : 12px; - text-align : left; - background-color: gray; - color : black; -} - -tr { - a { - text-decoration: none; - } -} - -tr:nth-child(even) { - background-color: #f2f2f2; +.padding-fix { + padding: 15px; } \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index dfea9441..ab26eb6a 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -23,4 +23,33 @@ button { text-decoration: none; border : 1px solid black; padding : 10px 18px; +} + +td, +th { + border : 1px solid #ddd; + padding: 8px; +} + +td { + border-collapse: collapse; + width : 100%; +} + +th { + padding-top : 12px; + padding-bottom : 12px; + text-align : left; + background-color: gray; + color : black; +} + +tr { + a { + text-decoration: none; + } +} + +tr:nth-child(even) { + background-color: #f2f2f2; } \ No newline at end of file From 3000a6d89ee919063d9b7a58f352e610693aedbb Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sat, 5 Dec 2020 19:02:15 +0100 Subject: [PATCH 45/76] Recipes page styled --- .../recipe-page/recipe-page.component.less | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.less b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.less index e69de29b..2398112c 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.less @@ -0,0 +1,21 @@ +table { + width : 100%; + padding: 15px; +} + +th:nth-child(1), +td:nth-child(1) { + width: 70%; +} + +th:nth-child(2), +td:nth-child(2) { + width: 30%; +} + +button { + margin-top: 20px; + left : 50%; + position : absolute; + transform : translate(-50%, -50%); +} \ No newline at end of file From b929813acf70fe3848884ab9ad3a21c28afe4c3c Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 10:22:32 +0100 Subject: [PATCH 46/76] Generate recipe page --- .../Lecture_11/CookBook/src/app/app.module.ts | 4 ++- .../src/app/recipe/recipe.component.html | 1 + .../src/app/recipe/recipe.component.less | 0 .../src/app/recipe/recipe.component.spec.ts | 25 +++++++++++++++++++ .../src/app/recipe/recipe.component.ts | 15 +++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 630fbc71..856b1b01 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -10,6 +10,7 @@ import { HttpClientModule } from '@angular/common/http'; import { HomeComponent } from './home/home.component'; import { FormsModule } from '@angular/forms'; import { RecipePageComponent } from './recipe-page/recipe-page.component'; +import { RecipeComponent } from './recipe/recipe.component'; @NgModule({ declarations: [ @@ -17,7 +18,8 @@ import { RecipePageComponent } from './recipe-page/recipe-page.component'; IngredientComponent, IngredientPageComponent, HomeComponent, - RecipePageComponent + RecipePageComponent, + RecipeComponent ], imports: [ BrowserModule, diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html new file mode 100644 index 00000000..8cab4a79 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -0,0 +1 @@ +

recipe works!

diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts new file mode 100644 index 00000000..7c71a472 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RecipeComponent } from './recipe.component'; + +describe('RecipeComponent', () => { + let component: RecipeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RecipeComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RecipeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts new file mode 100644 index 00000000..bd3f9af2 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-recipe', + templateUrl: './recipe.component.html', + styleUrls: ['./recipe.component.less'] +}) +export class RecipeComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} From 79eb21b920f86332109f6fdf490d866183eb96d2 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 10:25:16 +0100 Subject: [PATCH 47/76] Routing for recipe component added --- Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts index bee86a4b..36b9004f 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -4,13 +4,15 @@ import { IngredientComponent } from './ingredient/ingredient.component'; import { IngredientPageComponent } from './ingredient-page/ingredient-page.component'; import { HomeComponent } from './home/home.component'; import { RecipePageComponent } from './recipe-page/recipe-page.component'; +import { RecipeComponent } from './recipe/recipe.component'; const routes: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, { path: 'ingredient/:id', component: IngredientComponent }, { path: 'ingredients', component: IngredientPageComponent }, - { path: 'recipes', component: RecipePageComponent } + { path: 'recipes', component: RecipePageComponent }, + { path: 'recipe/:id', component: RecipeComponent }, ]; @NgModule({ From 4e33c39e7363b7a9ecdcf5c9833633eddb48feed Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 11:02:11 +0100 Subject: [PATCH 48/76] Added loading of recipe on recipe component page --- .../src/app/recipe/recipe.component.html | 4 +++- .../src/app/recipe/recipe.component.ts | 23 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 8cab4a79..e0c593dc 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -1 +1,3 @@ -

recipe works!

+

Recipe

+ +

Unable to load given recipe

diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index bd3f9af2..777c6170 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -1,4 +1,7 @@ import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { RecipeDetailModel } from '../api/models'; +import { RecipeService } from '../api/services'; @Component({ selector: 'app-recipe', @@ -7,9 +10,27 @@ import { Component, OnInit } from '@angular/core'; }) export class RecipeComponent implements OnInit { - constructor() { } + constructor( + private recipeService: RecipeService, + private router: Router, + private route: ActivatedRoute, + ) { } + + loadIngredientError = false; + editMode = false; + model: RecipeDetailModel = {}; ngOnInit(): void { + const id = this.route.snapshot.params.id; + if (id !== undefined && id !== 'create') { + const request = { id }; + + this.recipeService.recipeGetById(request).subscribe( + providedRecipe => this.model = providedRecipe, + error => this.loadIngredientError = true); + + this.editMode = true; + } } } From 1e9eed1641202329047b544a44b4e6def423d0de Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 11:02:29 +0100 Subject: [PATCH 49/76] Made alert styles global --- .../CookBook/src/app/ingredient/ingredient.component.less | 8 -------- Lectures/Lecture_11/CookBook/src/styles.less | 8 ++++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less index 982250e2..d7769c50 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less @@ -12,14 +12,6 @@ form { } } -.alert { - padding-left: 8px; -} - -.alert-danger { - color: red; -} - .btn{ color:black; margin-right: 4px; diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index ab26eb6a..c4887743 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -52,4 +52,12 @@ tr { tr:nth-child(even) { background-color: #f2f2f2; +} + +.alert { + padding-left: 8px; +} + +.alert-danger { + color: red; } \ No newline at end of file From 22d82cc01c4e7eaff6519f367a985962fbae1704 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 11:21:57 +0100 Subject: [PATCH 50/76] colored buttons styles made global --- .../src/app/ingredient/ingredient.component.less | 12 ++---------- Lectures/Lecture_11/CookBook/src/styles.less | 8 ++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less index d7769c50..2abca2aa 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less @@ -12,15 +12,7 @@ form { } } -.btn{ - color:black; +.btn { + color : black; margin-right: 4px; -} - -.btn-success{ - background-color: green; -} - -.btn-default{ - background-color: darkred; } \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index c4887743..459add5e 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -25,6 +25,14 @@ button { padding : 10px 18px; } +.btn-success { + background-color: green; +} + +.btn-default { + background-color: darkred; +} + td, th { border : 1px solid #ddd; From 748387213c6797f130ac72ab4637a145704fddb7 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 11:22:46 +0100 Subject: [PATCH 51/76] Stub recipe page with working delete --- .../src/app/recipe/recipe.component.html | 30 +++++++++++++++++++ .../src/app/recipe/recipe.component.ts | 12 ++++++++ 2 files changed, 42 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index e0c593dc..763c5195 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -1,3 +1,33 @@

Recipe

Unable to load given recipe

+ +
+
+ +
+ + +
+
+ Name is required +
+
+
+ +
+ + +
+ + + + +
+
+ +
+
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index 777c6170..da8d2e6d 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -33,4 +33,16 @@ export class RecipeComponent implements OnInit { } } + onSave(): void{ + } + + onDelete(): void { + if (this.model?.id !== undefined) { + const id: string = this.model.id; + const request = { id }; + + this.recipeService.recipeDelete(request).subscribe(complete => this.router.navigate(['/recipes'])); + } + } + } From b49edefa0db9fb630c03a6bb6197b4d8055389e0 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 11:24:00 +0100 Subject: [PATCH 52/76] Renamed some copy value --- .../Lecture_11/CookBook/src/app/recipe/recipe.component.html | 4 ++-- .../Lecture_11/CookBook/src/app/recipe/recipe.component.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 763c5195..6410bea8 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -1,8 +1,8 @@

Recipe

-

Unable to load given recipe

+

Unable to load given recipe

-
+
diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index da8d2e6d..fa488ddc 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -16,7 +16,7 @@ export class RecipeComponent implements OnInit { private route: ActivatedRoute, ) { } - loadIngredientError = false; + loadRecipeError = false; editMode = false; model: RecipeDetailModel = {}; @@ -27,7 +27,7 @@ export class RecipeComponent implements OnInit { this.recipeService.recipeGetById(request).subscribe( providedRecipe => this.model = providedRecipe, - error => this.loadIngredientError = true); + error => this.loadRecipeError = true); this.editMode = true; } From 6394daf351e48d9397076a53c650e627c23b147e Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 11:34:48 +0100 Subject: [PATCH 53/76] Added duration to recipe form --- .../Lecture_11/CookBook/src/app/recipe/recipe.component.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 6410bea8..d72a2a20 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -22,6 +22,11 @@

Recipe

[(ngModel)]="model!.description" name="description">
+
+ + +
+ From 4b2d4b77fca1b714e7e618bebc660a42dbdc21af Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 12:59:53 +0100 Subject: [PATCH 54/76] Added Food Type to recipe --- .../Lecture_11/CookBook/src/app/app.module.ts | 4 +++- .../CookBook/src/app/enum-to-array.pipe.ts | 18 ++++++++++++++++++ .../src/app/recipe/recipe.component.html | 7 +++++++ .../src/app/recipe/recipe.component.ts | 4 +++- 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 Lectures/Lecture_11/CookBook/src/app/enum-to-array.pipe.ts diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 856b1b01..5c1c325a 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -11,6 +11,7 @@ import { HomeComponent } from './home/home.component'; import { FormsModule } from '@angular/forms'; import { RecipePageComponent } from './recipe-page/recipe-page.component'; import { RecipeComponent } from './recipe/recipe.component'; +import { EnumToArrayPipe } from './enum-to-array.pipe'; @NgModule({ declarations: [ @@ -19,7 +20,8 @@ import { RecipeComponent } from './recipe/recipe.component'; IngredientPageComponent, HomeComponent, RecipePageComponent, - RecipeComponent + RecipeComponent, + EnumToArrayPipe, ], imports: [ BrowserModule, diff --git a/Lectures/Lecture_11/CookBook/src/app/enum-to-array.pipe.ts b/Lectures/Lecture_11/CookBook/src/app/enum-to-array.pipe.ts new file mode 100644 index 00000000..beff42a0 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/enum-to-array.pipe.ts @@ -0,0 +1,18 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'enumToArray' }) +export class EnumToArrayPipe implements PipeTransform { + transform(value: any): any { + const items: any[] = []; + + // tslint:disable-next-line: forin + for (const record in value) { + const key = parseInt(record, 10); + if (!Number.isNaN(key)) { + items.push({ key, value: value[key] }); + } + } + + return items; + } +} diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index d72a2a20..2bf05965 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -27,6 +27,13 @@

Recipe

+
+ + +
+ diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index fa488ddc..9c3b914d 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { RecipeDetailModel } from '../api/models'; +import { FoodType, RecipeDetailModel } from '../api/models'; import { RecipeService } from '../api/services'; @Component({ @@ -16,6 +16,8 @@ export class RecipeComponent implements OnInit { private route: ActivatedRoute, ) { } + public foodTypes = FoodType; + loadRecipeError = false; editMode = false; model: RecipeDetailModel = {}; From 4cf93d3243ee47836b057a8076f1d54fe3df5b68 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 16:25:03 +0100 Subject: [PATCH 55/76] Flex styles made gloval --- .../app/ingredient-page/ingredient-page.component.less | 9 --------- Lectures/Lecture_11/CookBook/src/styles.less | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less index 91325fd5..b6237b39 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.less @@ -1,12 +1,3 @@ -.flex-wrapper { - display: flex; -} - -.flex-block { - flex-basis: 0; - flex-grow : 1; -} - .padding-fix { padding: 15px; } \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index 459add5e..dc2bdcc9 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -68,4 +68,13 @@ tr:nth-child(even) { .alert-danger { color: red; +} + +.flex-wrapper { + display: flex; +} + +.flex-block { + flex-basis: 0; + flex-grow : 1; } \ No newline at end of file From 2dd00e3c7dee3dd68976dfb7cd4484f4332cdacd Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 16:25:39 +0100 Subject: [PATCH 56/76] Added used ingredients to recipe --- .../CookBook/src/app/recipe/recipe.component.html | 15 ++++++++++++++- .../CookBook/src/app/recipe/recipe.component.ts | 11 ++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 2bf05965..f940220c 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -40,6 +40,19 @@

Recipe

- +
Name
+ + + + + + + + +
Name
+ {{usedIngredient!.ingredient!.name}} {{usedIngredient!.amount}} {{usedIngredient!.unitText}} + + +
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index 9c3b914d..33f76220 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { FoodType, RecipeDetailModel } from '../api/models'; +import { FoodType, RecipeDetailModel, RecipeListIngredientModel } from '../api/models'; import { RecipeService } from '../api/services'; @Component({ @@ -35,7 +35,7 @@ export class RecipeComponent implements OnInit { } } - onSave(): void{ + onSave(): void { } onDelete(): void { @@ -46,5 +46,10 @@ export class RecipeComponent implements OnInit { this.recipeService.recipeDelete(request).subscribe(complete => this.router.navigate(['/recipes'])); } } - + ingredientRemoved(ingredient: RecipeListIngredientModel): void { + if (this.model.ingredients != null) { + const index = this.model.ingredients.indexOf(ingredient); + this.model.ingredients.splice(index, 1); + } + } } From 1e99011d79d2989c5d879e3a7149eec553f6f8de Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 16:30:15 +0100 Subject: [PATCH 57/76] Form styles made global --- .../app/ingredient/ingredient.component.less | 18 ------------------ Lectures/Lecture_11/CookBook/src/styles.less | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less index 2abca2aa..e69de29b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.less @@ -1,18 +0,0 @@ -form { - margin: 15px; - - .form-group { - padding-bottom: 20px; - - label { - display : block; - padding-bottom: 5px; - font-weight : bold; - } - } -} - -.btn { - color : black; - margin-right: 4px; -} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index dc2bdcc9..8edcdb1f 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -77,4 +77,23 @@ tr:nth-child(even) { .flex-block { flex-basis: 0; flex-grow : 1; +} + +form { + margin: 15px; + + .form-group { + padding-bottom: 20px; + + label { + display : block; + padding-bottom: 5px; + font-weight : bold; + } + } + + .btn { + color : black; + margin-right: 4px; + } } \ No newline at end of file From 7726b356b4cabbf2b80da200ea270e1921e88d31 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 16:30:38 +0100 Subject: [PATCH 58/76] Fixed right margin in recipe --- .../Lecture_11/CookBook/src/app/recipe/recipe.component.html | 2 +- .../Lecture_11/CookBook/src/app/recipe/recipe.component.less | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index f940220c..85870028 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -39,7 +39,7 @@

Recipe

-
+
diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less index e69de29b..807ba822 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less @@ -0,0 +1,3 @@ +.fix-right-margin{ + margin-right: 15px; +} \ No newline at end of file From 9a53b6e923c59a63bfd3eeacd2aff09651116425 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 16:38:06 +0100 Subject: [PATCH 59/76] Added some texts to recipe page --- .../Lecture_11/CookBook/src/app/recipe/recipe.component.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 85870028..44a8e64f 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -40,6 +40,7 @@

Recipe

+

Ingredients:

Name
@@ -54,5 +55,8 @@

Recipe

Name
+

Add new ingredient:

+
+
\ No newline at end of file From d61dcdf888531897b0a5eb65d6fbc3592936be35 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 19:22:18 +0100 Subject: [PATCH 60/76] Added possibility to add aditional ingrediences to recipe --- .../Lecture_11/CookBook/src/app/app.module.ts | 2 + .../recipe-add-ingredient.component.html | 13 +++++++ .../recipe-add-ingredient.component.less | 0 .../recipe-add-ingredient.component.spec.ts | 25 +++++++++++++ .../recipe-add-ingredient.component.ts | 37 +++++++++++++++++++ .../src/app/recipe/recipe.component.html | 3 +- .../src/app/recipe/recipe.component.ts | 6 ++- 7 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.html create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.less create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts create mode 100644 Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.ts diff --git a/Lectures/Lecture_11/CookBook/src/app/app.module.ts b/Lectures/Lecture_11/CookBook/src/app/app.module.ts index 5c1c325a..6652477a 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.module.ts @@ -12,6 +12,7 @@ import { FormsModule } from '@angular/forms'; import { RecipePageComponent } from './recipe-page/recipe-page.component'; import { RecipeComponent } from './recipe/recipe.component'; import { EnumToArrayPipe } from './enum-to-array.pipe'; +import { RecipeAddIngredientComponent } from './recipe-add-ingredient/recipe-add-ingredient.component'; @NgModule({ declarations: [ @@ -22,6 +23,7 @@ import { EnumToArrayPipe } from './enum-to-array.pipe'; RecipePageComponent, RecipeComponent, EnumToArrayPipe, + RecipeAddIngredientComponent, ], imports: [ BrowserModule, diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.html new file mode 100644 index 00000000..816244cb --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.html @@ -0,0 +1,13 @@ +
+ + + + + + + +
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.less b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.less new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts new file mode 100644 index 00000000..f5e48ad1 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RecipeAddIngredientComponent } from './recipe-add-ingredient.component'; + +describe('RecipeAddIngredientComponent', () => { + let component: RecipeAddIngredientComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RecipeAddIngredientComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RecipeAddIngredientComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.ts new file mode 100644 index 00000000..654a1d91 --- /dev/null +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.ts @@ -0,0 +1,37 @@ +import { Component, EventEmitter, OnInit, Output } from '@angular/core'; +import { IngredientListModel, RecipeListIngredientModel, Unit } from '../api/models'; +import { IngredientService } from '../api/services'; + +@Component({ + selector: 'app-recipe-add-ingredient', + templateUrl: './recipe-add-ingredient.component.html', + styleUrls: ['./recipe-add-ingredient.component.less'] +}) +export class RecipeAddIngredientComponent implements OnInit { + + constructor( + private ingredientService: IngredientService, + ) { } + + amount = 0; + selectedUnit = Unit.Unknown; + selectedIngredient: IngredientListModel = {}; + public units = Unit; + ingredients: IngredientListModel[] = []; + + @Output() addIngredient = new EventEmitter(); + + ngOnInit(): void { + this.ingredientService.ingredientGetAll().subscribe( + loadedIngredients => { + this.ingredients = loadedIngredients, this.selectedIngredient = this.ingredients[0]; + } + ); + } + + onAdd(): void { + const ingredientModel: RecipeListIngredientModel = + { ingredient: this.selectedIngredient, amount: this.amount, unit: this.selectedUnit, unitText: Unit[this.selectedUnit] }; + this.addIngredient.emit(ingredientModel); + } +} diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 44a8e64f..6ba99630 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -56,7 +56,6 @@

Ingredients:

Add new ingredient:

- +
- \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index 33f76220..54d7c0f8 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { FoodType, RecipeDetailModel, RecipeListIngredientModel } from '../api/models'; +import { FoodType, RecipeDetailModel, RecipeListIngredientModel, RecipeListModel } from '../api/models'; import { RecipeService } from '../api/services'; @Component({ @@ -52,4 +52,8 @@ export class RecipeComponent implements OnInit { this.model.ingredients.splice(index, 1); } } + + addIngredient(ingredient: RecipeListIngredientModel): void { + this.model.ingredients?.push(ingredient); + } } From 48a6c6b65a4273896eaecbb30260fb8ef38dba3b Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 19:36:25 +0100 Subject: [PATCH 61/76] Added creation and update of recipes --- .../CookBook/src/app/recipe/recipe.component.html | 2 +- .../CookBook/src/app/recipe/recipe.component.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 6ba99630..613efe9a 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -18,7 +18,7 @@

Recipe

-
diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index 54d7c0f8..c18aefbc 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -36,6 +36,15 @@ export class RecipeComponent implements OnInit { } onSave(): void { + const model = this.model; + const request = { body: model }; + + if (model.id !== undefined) { + this.recipeService.recipeUpdate(request).subscribe(); + } else { + this.recipeService.recipeCreate(request).subscribe( + complete => this.router.navigate(['/recipes'])); + } } onDelete(): void { From c4b54f92e9d6d76cfebb93b5566ac7a4b55b9ebb Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 19:37:16 +0100 Subject: [PATCH 62/76] Fixed how recipe ingredients look when there are none --- .../src/app/recipe/recipe.component.less | 16 +++++++++++++++- .../CookBook/src/app/recipe/recipe.component.ts | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less index 807ba822..d1446132 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.less @@ -1,3 +1,17 @@ -.fix-right-margin{ +.fix-right-margin { margin-right: 15px; +} + +table { + width: 100%; +} + +th:nth-child(1), +td:nth-child(1) { + width: 70%; +} + +th:nth-child(2), +td:nth-child(2) { + width: 30%; } \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index c18aefbc..38dba2bf 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -20,7 +20,7 @@ export class RecipeComponent implements OnInit { loadRecipeError = false; editMode = false; - model: RecipeDetailModel = {}; + model: RecipeDetailModel = { ingredients: []}; ngOnInit(): void { const id = this.route.snapshot.params.id; From f7031e30dd3dd7d1e1807292e0f14575a4c4ff1d Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 20:32:07 +0100 Subject: [PATCH 63/76] Updated style for headers on right side of recipe page --- .../CookBook/src/app/recipe/recipe.component.html | 4 ++-- Lectures/Lecture_11/CookBook/src/styles.less | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html index 613efe9a..a673ffb8 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.html @@ -40,7 +40,7 @@

Recipe

-

Ingredients:

+

Ingredients:

@@ -55,7 +55,7 @@

Ingredients:

Name
-

Add new ingredient:

+

Add new ingredient:

\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook/src/styles.less b/Lectures/Lecture_11/CookBook/src/styles.less index 8edcdb1f..935058fa 100644 --- a/Lectures/Lecture_11/CookBook/src/styles.less +++ b/Lectures/Lecture_11/CookBook/src/styles.less @@ -11,6 +11,14 @@ h1 { font-weight : bold; } +h2 { + margin-left : 20px; + font-size : 2rem; + margin-bottom: .3rem; + line-height : 1.1; + font-weight : bold; +} + p { margin-left: 10px; From 0361df5cc4b9197535cd50678b3e70fe539e2677 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 20:35:58 +0100 Subject: [PATCH 64/76] Fixed missing preselection of FoodType on creating new recipe --- Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts index 38dba2bf..edc6a787 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.ts @@ -20,7 +20,7 @@ export class RecipeComponent implements OnInit { loadRecipeError = false; editMode = false; - model: RecipeDetailModel = { ingredients: []}; + model: RecipeDetailModel = { ingredients: [], foodType: FoodType.Unknown }; ngOnInit(): void { const id = this.route.snapshot.params.id; From 11bd0f155a351aa8e61c870c32f537ea3e1cdd17 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 22:31:33 +0100 Subject: [PATCH 65/76] Removed some old routing handler --- .../CookBook/src/app/ingredient/ingredient.component.html | 1 - 1 file changed, 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html index 0fe0c892..5dface42 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.html @@ -1,4 +1,3 @@ -

Ingredient

Unable to load given ingredient

From 4e0ae9814093d67ad17cc68881442280ab60db0e Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 22:32:03 +0100 Subject: [PATCH 66/76] Removed test for title as there is none right now --- Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts index ee57cb69..6a7c7bc9 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app.component.spec.ts @@ -25,11 +25,4 @@ describe('AppComponent', () => { const app = fixture.componentInstance; expect(app.title).toEqual('CookBook'); }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement; - expect(compiled.querySelector('.content span').textContent).toContain('CookBook app is running!'); - }); }); From b563486cdecfaa0d90450cfdcf2764cfcefbb18f Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 22:32:42 +0100 Subject: [PATCH 67/76] Routes are being exported so thay can be used in tests --- Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts index 36b9004f..ba113760 100644 --- a/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts +++ b/Lectures/Lecture_11/CookBook/src/app/app-routing.module.ts @@ -6,7 +6,7 @@ import { HomeComponent } from './home/home.component'; import { RecipePageComponent } from './recipe-page/recipe-page.component'; import { RecipeComponent } from './recipe/recipe.component'; -const routes: Routes = [ +export const routes: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, { path: 'ingredient/:id', component: IngredientComponent }, From 9efdce03c8eb7a14f4dee9e62b50543649dc75e2 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Sun, 6 Dec 2020 22:33:03 +0100 Subject: [PATCH 68/76] Fixed test not working at all --- .../ingredient-page.component.spec.ts | 20 +++++++++-- .../ingredient/ingredient.component.spec.ts | 34 +++++++++++++++++-- .../recipe-add-ingredient.component.spec.ts | 23 +++++++++++-- .../recipe-page/recipe-page.component.spec.ts | 20 +++++++++-- .../src/app/recipe/recipe.component.spec.ts | 14 ++++++-- 5 files changed, 100 insertions(+), 11 deletions(-) diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts index 942cddc9..49f95631 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient-page/ingredient-page.component.spec.ts @@ -1,4 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Observable, of } from 'rxjs'; +import { IngredientDetailModel, IngredientListModel } from '../api/models'; +import { IngredientService } from '../api/services'; import { IngredientPageComponent } from './ingredient-page.component'; @@ -6,11 +9,24 @@ describe('IngredientPageComponent', () => { let component: IngredientPageComponent; let fixture: ComponentFixture; + const ingredientService = jasmine.createSpyObj('IngredientService', ['ingredientGetAll']); + let getAllSpy: jasmine.Spy; + + const ingredient1: IngredientDetailModel = { id: 'df935095-8709-4040-a2bb-b6f97cb416dc', name: 'Vejce', description: 'Popis vajec' }; + const ingredient2: IngredientDetailModel = { id: '23b3902d-7d4f-4213-9cf0-112348f56238', name: 'Cibule', description: 'Popis cibule' }; + const ingredientsArray: IngredientDetailModel[] = [ingredient1, ingredient2]; + const ingredientsObservable: Observable> = of(ingredientsArray); + beforeEach(async () => { + getAllSpy = ingredientService.ingredientGetAll.and.callFake((_: any) => ingredientsObservable); + await TestBed.configureTestingModule({ - declarations: [ IngredientPageComponent ] + declarations: [IngredientPageComponent], + providers: [ + { provide: IngredientService, useValue: ingredientService }, + ] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { diff --git a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts index 9db07894..02b2b71b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts +++ b/Lectures/Lecture_11/CookBook/src/app/ingredient/ingredient.component.spec.ts @@ -1,21 +1,49 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { RouterTestingModule } from '@angular/router/testing'; +import { Router } from '@angular/router'; +import { Observable, of } from 'rxjs'; +import { IngredientDetailModel, IngredientListModel } from '../api/models'; +import { IngredientService } from '../api/services'; import { IngredientComponent } from './ingredient.component'; +import { routes } from '../app-routing.module'; +import { FormsModule } from '@angular/forms'; describe('IngredientComponent', () => { let component: IngredientComponent; let fixture: ComponentFixture; + const ingredient1: IngredientDetailModel = { id: 'df935095-8709-4040-a2bb-b6f97cb416dc', name: 'Vejce', description: 'Popis vajec' }; + const ingredient2: IngredientDetailModel = { id: '23b3902d-7d4f-4213-9cf0-112348f56238', name: 'Cibule', description: 'Popis cibule' }; + const ingredientsArray: IngredientDetailModel[] = [ingredient1, ingredient2]; + const ingredientsObservable: Observable> = of(ingredientsArray); + + const ingredientService = jasmine.createSpyObj('IngredientService', ['ingredientGetById']); + + let getAllSpy: jasmine.Spy; + let router: Router; + beforeEach(async () => { + getAllSpy = ingredientService.ingredientGetById.and.callFake((_id: any) => ingredient1); + await TestBed.configureTestingModule({ - declarations: [ IngredientComponent ] + imports: [ + RouterTestingModule.withRoutes(routes), + FormsModule, + ], + declarations: [IngredientComponent], + providers: [ + { provide: IngredientService, useValue: ingredientService }, + ] }) - .compileComponents(); + .compileComponents(); + + router = TestBed.inject(Router); }); beforeEach(() => { fixture = TestBed.createComponent(IngredientComponent); component = fixture.componentInstance; + router.initialNavigation(); fixture.detectChanges(); }); diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts index f5e48ad1..3bc35d5b 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-add-ingredient/recipe-add-ingredient.component.spec.ts @@ -1,4 +1,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { Observable, of } from 'rxjs'; +import { IngredientDetailModel, IngredientListModel } from '../api/models'; +import { IngredientService } from '../api/services'; +import { EnumToArrayPipe } from '../enum-to-array.pipe'; import { RecipeAddIngredientComponent } from './recipe-add-ingredient.component'; @@ -6,11 +11,25 @@ describe('RecipeAddIngredientComponent', () => { let component: RecipeAddIngredientComponent; let fixture: ComponentFixture; + const ingredientService = jasmine.createSpyObj('IngredientService', ['ingredientGetAll']); + let getAllSpy: jasmine.Spy; + + const ingredient1: IngredientDetailModel = { id: 'df935095-8709-4040-a2bb-b6f97cb416dc', name: 'Vejce', description: 'Popis vajec' }; + const ingredient2: IngredientDetailModel = { id: '23b3902d-7d4f-4213-9cf0-112348f56238', name: 'Cibule', description: 'Popis cibule' }; + const ingredientsArray: IngredientDetailModel[] = [ingredient1, ingredient2]; + const ingredientsObservable: Observable> = of(ingredientsArray); + beforeEach(async () => { + getAllSpy = ingredientService.ingredientGetAll.and.callFake((_x: any) => ingredientsObservable); + await TestBed.configureTestingModule({ - declarations: [ RecipeAddIngredientComponent ] + imports: [FormsModule], + declarations: [RecipeAddIngredientComponent, EnumToArrayPipe], + providers: [ + { provide: IngredientService, useValue: ingredientService }, + ] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts index ba5858fb..9b969f42 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe-page/recipe-page.component.spec.ts @@ -1,4 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Observable, of } from 'rxjs'; +import { FoodType, RecipeListModel } from '../api/models'; +import { RecipeService } from '../api/services'; import { RecipePageComponent } from './recipe-page.component'; @@ -6,11 +9,24 @@ describe('RecipePageComponent', () => { let component: RecipePageComponent; let fixture: ComponentFixture; + const recipe1: RecipeListModel = + { id: 'fabde0cd-eefe-443f-baf6-3d96cc2cbf2e', duration: '00:15:00', foodType: FoodType.MainDish, foodTypeText: 'Hlavní chod', name: 'Míchaná vejce' }; + const recipesArray: Array = [recipe1]; + const recipesObservable: Observable> = of(recipesArray); + + const recipeService = jasmine.createSpyObj('RecipeService', ['recipeGetAll']); + let getAllSpy: jasmine.Spy; + beforeEach(async () => { + getAllSpy = recipeService.recipeGetAll.and.callFake((_x: any) => recipesObservable); + await TestBed.configureTestingModule({ - declarations: [ RecipePageComponent ] + declarations: [RecipePageComponent], + providers: [ + { provide: RecipeService, useValue: recipeService }, + ] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { diff --git a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts index 7c71a472..2406b868 100644 --- a/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts +++ b/Lectures/Lecture_11/CookBook/src/app/recipe/recipe.component.spec.ts @@ -1,4 +1,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; +import { RecipeService } from '../api/services'; +import { EnumToArrayPipe } from '../enum-to-array.pipe'; import { RecipeComponent } from './recipe.component'; @@ -6,11 +10,17 @@ describe('RecipeComponent', () => { let component: RecipeComponent; let fixture: ComponentFixture; + const recipeService = jasmine.createSpyObj('RecipeService', ['recipeGetById']); + beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ RecipeComponent ] + imports: [RouterTestingModule, FormsModule], + declarations: [RecipeComponent, EnumToArrayPipe], + providers: [ + { provide: RecipeService, useValue: recipeService }, + ] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { From 473217f029c84fa65eff62ac9cb7696347d71eba Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 7 Dec 2020 09:16:13 +0100 Subject: [PATCH 69/76] Slides updated --- Lectures/Lecture_11/Slides.pptx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/Slides.pptx b/Lectures/Lecture_11/Slides.pptx index d0d01549..a76f75e3 100644 --- a/Lectures/Lecture_11/Slides.pptx +++ b/Lectures/Lecture_11/Slides.pptx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d209b2a7891fde227f030d0200de239e2c798605d504523597ea82cc4d21b1a8 -size 4920798 +oid sha256:cff83a283354276b1a8ba12d9c1ee182c0d9327898b22882d8ebd221960f8396 +size 4922291 From c7e8883fb75dc757bd038ca8f5e96f2052fc7f5b Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 7 Dec 2020 18:16:04 +0100 Subject: [PATCH 70/76] Added command for generating api from swagger --- Lectures/Lecture_11/CookBook/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lectures/Lecture_11/CookBook/package.json b/Lectures/Lecture_11/CookBook/package.json index 24004b9d..78836bad 100644 --- a/Lectures/Lecture_11/CookBook/package.json +++ b/Lectures/Lecture_11/CookBook/package.json @@ -7,7 +7,8 @@ "build": "ng build", "test": "ng test", "lint": "ng lint", - "e2e": "ng e2e" + "e2e": "ng e2e", + "generate-api": "ng-openapi-gen --input src/app/api/swagger.json" }, "private": true, "dependencies": { From 4c04b53b6736dd3496f89cd26a508ca229c132fb Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Mon, 7 Dec 2020 18:27:58 +0100 Subject: [PATCH 71/76] Updated presentation --- Lectures/Lecture_11/Slides.pptx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/Slides.pptx b/Lectures/Lecture_11/Slides.pptx index a76f75e3..eca98907 100644 --- a/Lectures/Lecture_11/Slides.pptx +++ b/Lectures/Lecture_11/Slides.pptx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cff83a283354276b1a8ba12d9c1ee182c0d9327898b22882d8ebd221960f8396 -size 4922291 +oid sha256:aec97ec646cdce497d9f995489e37afbec6f7f96201441e3bebc46d2bffe5445 +size 4919726 From 963eec6072fcf8d6a341f89b6685b5ac5d22076f Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Tue, 8 Dec 2020 07:37:46 +0100 Subject: [PATCH 72/76] Updated slides for testing --- Lectures/Lecture_11/Slides.pptx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lectures/Lecture_11/Slides.pptx b/Lectures/Lecture_11/Slides.pptx index eca98907..0035b8ee 100644 --- a/Lectures/Lecture_11/Slides.pptx +++ b/Lectures/Lecture_11/Slides.pptx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aec97ec646cdce497d9f995489e37afbec6f7f96201441e3bebc46d2bffe5445 -size 4919726 +oid sha256:fc0ff701eb67379a1f701c6b167c3cf11501dbff8126acfee8b4f8642ba69b41 +size 4920026 From 764c10cc2d656d4422e5cc6578517cdc8f7182c3 Mon Sep 17 00:00:00 2001 From: Erik Machacek Date: Tue, 8 Dec 2020 12:09:54 +0100 Subject: [PATCH 73/76] Added backend copy for compatibility reasons --- .../NSwagStudio/CookBook.nswag | 98 + .../Controllers/v1/IngredientController.cs | 41 + .../Controllers/v2/IngredientController.cs | 36 + .../Controllers/v3/IngredientController.cs | 72 + .../Controllers/v3/LoggingController.cs | 29 + .../Controllers/v3/RecipeController.cs | 59 + .../sln/CookBook.Api/CookBook.Api.csproj | 24 + .../ApplicationBuilderExtensions.cs | 13 + .../Middlewares/RequestCultureMiddleware.cs | 29 + .../RequestCultureOperationProcessor.cs | 23 + .../sln/CookBook.Api/Program.cs | 28 + .../Properties/launchSettings.json | 28 + .../sln/CookBook.Api/Startup.cs | 130 + .../sln/CookBook.Api/appsettings.json | 4 + .../CookBook.BL.Api/CookBook.BL.Api.csproj | 24 + .../CookBook.BL.Api.csproj.DotSettings | 2 + .../Facades/IngredientFacade.cs | 52 + .../CookBook.BL.Api/Facades/RecipeFacade.cs | 125 + .../Installers/BLApiInstaller.cs | 18 + .../Mapping/AutoMapperExtensions.cs | 43 + .../Mapping/IngredientMappingProfile.cs | 18 + .../Mapping/RecipeMappingProfile.cs | 28 + .../CookBook.BL.Common.csproj | 16 + .../CookBook.BL.Common/Facades/IAppFacade.cs | 6 + .../Installers/BLCommonInstaller.cs | 18 + .../Services/IAppService.cs | 6 + .../Services/ISerializerService.cs | 10 + .../Services/SerializerService.cs | 26 + .../Api/Generated/ApiClient.cs | 1446 ++ .../CookBook.BL.Web.Blazor.csproj | 20 + .../CookBook.BL.Web.Blazor.csproj.DotSettings | 3 + .../Facades/FacadeBase.cs | 9 + .../Facades/IngredientsFacade.cs | 45 + .../Facades/Interfaces/IIngredientsFacade.cs | 15 + .../Facades/Interfaces/IRecipesFacade.cs | 15 + .../Facades/RecipesFacade.cs | 45 + .../Installers/BLWebBlazorInstaller.cs | 22 + .../Api/Custom/IngredientClient.cs | 15 + .../Api/Custom/RecipeClient.cs | 15 + .../Api/Generated/ApiClient.cs | 1570 ++ .../CookBook.BL.Web.MVC.csproj | 21 + .../CookBook.BL.Web.MVC.csproj.DotSettings | 2 + .../Facades/IngredientFacade.cs | 49 + .../Facades/RecipeFacade.cs | 52 + .../Installers/BLWebInstaller.cs | 26 + .../CookBook.BL.Web.MVC/Options/ApiOptions.cs | 8 + .../CookBook.BL.Web.MVC/Options/WebOptions.cs | 7 + .../CookBook.Common/CookBook.Common.csproj | 13 + .../Extensions/ServiceCollectionExtensions.cs | 15 + .../CookBook.Common/Installers/IInstaller.cs | 9 + .../sln/CookBook.DAL/CookBook.DAL.csproj | 17 + .../CookBook.DAL.csproj.DotSettings | 3 + .../sln/CookBook.DAL/Entities/EntityBase.cs | 9 + .../Entities/IngredientAmountEntity.cs | 26 + .../CookBook.DAL/Entities/IngredientEntity.cs | 18 + .../Entities/Interfaces/IEntity.cs | 9 + .../sln/CookBook.DAL/Entities/RecipeEntity.cs | 24 + .../CookBook.DAL/Installers/DALInstaller.cs | 22 + .../IngredientAmountRepository.cs | 66 + .../Repositories/IngredientRepository.cs | 56 + .../Repositories/Interfaces/IAppRepository.cs | 16 + .../Repositories/RecipeRepository.cs | 56 + .../sln/CookBook.DAL/Storage.cs | 87 + .../CookBook.Localization.csproj | 40 + .../IngredientControllerResources.Designer.cs | 72 + .../IngredientControllerResources.cs.resx | 123 + .../IngredientControllerResources.en.resx | 123 + .../IngredientControllerResources.resx | 123 + .../IngredientNewModelResources.Designer.cs | 99 + .../IngredientNewModelResources.cs.resx | 132 + .../IngredientNewModelResources.en.resx | 132 + .../IngredientNewModelResources.resx | 132 + .../RecipeNewModelResources.Designer.cs | 126 + .../Resources/RecipeNewModelResources.cs.resx | 138 + .../Resources/RecipeNewModelResources.en.resx | 138 + .../Resources/RecipeNewModelResources.resx | 141 + .../CookBook.Models/CookBook.Models.csproj | 17 + .../CookBook.Models.csproj.DotSettings | 4 + .../sln/CookBook.Models/Enums/FoodType.cs | 16 + .../sln/CookBook.Models/Enums/Unit.cs | 22 + .../Ingredient/IngredientDetailModel.cs | 16 + .../Ingredient/IngredientListModel.cs | 10 + .../Recipe/RecipeDetailModel.cs | 15 + .../Recipe/RecipeListIngredientModel.cs | 13 + .../CookBook.Models/Recipe/RecipeListModel.cs | 14 + .../sln/CookBook.Web.Blazor/App.razor | 12 + .../Components/IngredientForm.razor | 77 + .../CookBook.Web.Blazor.csproj | 20 + .../sln/CookBook.Web.Blazor/Pages/Index.razor | 14 + .../Pages/IngredientEdit.razor | 19 + .../Pages/IngredientList.razor | 50 + .../sln/CookBook.Web.Blazor/Pages/PageBase.cs | 10 + .../Pages/RecipeEdit.razor | 182 + .../Pages/RecipeList.razor | 41 + .../sln/CookBook.Web.Blazor/Program.cs | 25 + .../Properties/launchSettings.json | 27 + .../Shared/ListLayout.razor | 6 + .../Shared/MainLayout.razor | 7 + .../CookBook.Web.Blazor/Shared/NavMenu.razor | 30 + .../sln/CookBook.Web.Blazor/_Imports.razor | 12 + .../wwwroot/images/cook-book.svg | 1 + .../wwwroot/images/icon-144x144.png | Bin 0 -> 30273 bytes .../CookBook.Web.Blazor/wwwroot/index.html | 32 + .../CookBook.Web.Blazor/wwwroot/manifest.json | 17 + .../wwwroot/service-worker.js | 23 + .../Controllers/HomeController.cs | 27 + .../Controllers/IngredientController.cs | 66 + .../Controllers/RecipeController.cs | 132 + .../CookBook.Web.MVC/CookBook.Web.MVC.csproj | 20 + .../CookBook.Web.MVC/CustomCultureProvider.cs | 25 + .../Installers/WebMVCInstaller.cs | 12 + .../Models/RecipeNewValidationErrorsModel.cs | 13 + .../Models/ValidationErrorsModel.cs | 7 + .../sln/CookBook.Web.MVC/Program.cs | 17 + .../Properties/launchSettings.json | 25 + .../sln/CookBook.Web.MVC/Startup.cs | 84 + .../Ingredient/IngredientDetailViewModel.cs | 9 + .../Ingredient/IngredientListViewModel.cs | 10 + .../Ingredient/IngredientNewViewModel.cs | 9 + .../Recipe/RecipeDetailViewModel.cs | 9 + .../ViewModels/Recipe/RecipeListViewModel.cs | 10 + .../ViewModels/Recipe/RecipeNewViewModel.cs | 12 + .../CookBook.Web.MVC/Views/Home/Index.cshtml | 3 + .../Views/Home/Privacy.cshtml | 6 + .../Views/Ingredient/Detail.cshtml | 11 + .../Views/Ingredient/List.cshtml | 10 + .../Views/Ingredient/New.cshtml | 25 + .../Views/Recipe/Detail.cshtml | 28 + .../CookBook.Web.MVC/Views/Recipe/List.cshtml | 10 + .../CookBook.Web.MVC/Views/Recipe/New.cshtml | 72 + .../Views/Shared/_IngredientListItem.cshtml | 10 + .../Views/Shared/_Layout.cshtml | 44 + .../Views/Shared/_RecipeListItem.cshtml | 12 + .../Shared/_ValidationScriptsPartial.cshtml | 2 + .../Views/_ViewImports.cshtml | 7 + .../CookBook.Web.MVC/Views/_ViewStart.cshtml | 3 + .../sln/CookBook.Web.MVC/appsettings.json | 17 + .../sln/CookBook.Web.MVC/package-lock.json | 4320 ++++ .../sln/CookBook.Web.MVC/package.json | 21 + .../sln/CookBook.Web.MVC/webpack.config.js | 22 + .../sln/CookBook.Web.MVC/wwwroot/css/site.css | 97 + .../wwwroot/dist/site.entry.js | 20516 ++++++++++++++++ .../wwwroot/dist/site.entry.js.map | 1 + .../wwwroot/images/CookBook.jpg | Bin 0 -> 263598 bytes .../sln/CookBook.Web.MVC/wwwroot/js/site.js | 18 + .../CookBook_backend/sln/Exercise_06.sln | 106 + .../sln/Exercise_06.sln.startup.json | 26 + 147 files changed, 32962 insertions(+) create mode 100644 Lectures/Lecture_11/CookBook_backend/NSwagStudio/CookBook.nswag create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v1/IngredientController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v2/IngredientController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/IngredientController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/LoggingController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/RecipeController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/CookBook.Api.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Extensions/ApplicationBuilderExtensions.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Middlewares/RequestCultureMiddleware.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Processors/RequestCultureOperationProcessor.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Program.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Properties/launchSettings.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Startup.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/appsettings.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj.DotSettings create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/IngredientFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/RecipeFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Installers/BLApiInstaller.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/AutoMapperExtensions.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/IngredientMappingProfile.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/RecipeMappingProfile.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/CookBook.BL.Common.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Facades/IAppFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Installers/BLCommonInstaller.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/IAppService.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/ISerializerService.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/SerializerService.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Api/Generated/ApiClient.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj.DotSettings create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/FacadeBase.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/IngredientsFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IIngredientsFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IRecipesFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/RecipesFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Installers/BLWebBlazorInstaller.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/IngredientClient.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/RecipeClient.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Generated/ApiClient.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj.DotSettings create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/IngredientFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/RecipeFacade.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Installers/BLWebInstaller.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/ApiOptions.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/WebOptions.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/CookBook.Common.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Extensions/ServiceCollectionExtensions.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Installers/IInstaller.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj.DotSettings create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/EntityBase.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientAmountEntity.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientEntity.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/Interfaces/IEntity.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/RecipeEntity.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Installers/DALInstaller.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientAmountRepository.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientRepository.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/Interfaces/IAppRepository.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/RecipeRepository.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Storage.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/CookBook.Localization.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.Designer.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.cs.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.en.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.Designer.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.cs.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.en.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.Designer.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.cs.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.en.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.resx create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj.DotSettings create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/FoodType.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/Unit.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientDetailModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientListModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeDetailModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListIngredientModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/App.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Components/IngredientForm.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/CookBook.Web.Blazor.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/Index.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientEdit.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientList.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/PageBase.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeEdit.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeList.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Program.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Properties/launchSettings.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/ListLayout.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/MainLayout.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/NavMenu.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/_Imports.razor create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/images/cook-book.svg create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/images/icon-144x144.png create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/index.html create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/manifest.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/service-worker.js create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/HomeController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/IngredientController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/RecipeController.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CookBook.Web.MVC.csproj create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CustomCultureProvider.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Installers/WebMVCInstaller.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/RecipeNewValidationErrorsModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/ValidationErrorsModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Program.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Properties/launchSettings.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Startup.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientDetailViewModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientListViewModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientNewViewModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeDetailViewModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeListViewModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeNewViewModel.cs create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Index.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Privacy.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/Detail.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/List.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/New.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/Detail.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/List.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/New.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_IngredientListItem.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_Layout.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_RecipeListItem.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_ValidationScriptsPartial.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewImports.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewStart.cshtml create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/appsettings.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package-lock.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package.json create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/webpack.config.js create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/css/site.css create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/dist/site.entry.js create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/dist/site.entry.js.map create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/images/CookBook.jpg create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/js/site.js create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/Exercise_06.sln create mode 100644 Lectures/Lecture_11/CookBook_backend/sln/Exercise_06.sln.startup.json diff --git a/Lectures/Lecture_11/CookBook_backend/NSwagStudio/CookBook.nswag b/Lectures/Lecture_11/CookBook_backend/NSwagStudio/CookBook.nswag new file mode 100644 index 00000000..09e29dca --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/NSwagStudio/CookBook.nswag @@ -0,0 +1,98 @@ +{ + "runtime": "NetCore31", + "defaultVariables": null, + "documentGenerator": { + "fromDocument": { + "json": "{\r\n \"x-generator\": \"NSwag v13.2.2.0 (NJsonSchema v10.1.4.0 (Newtonsoft.Json v12.0.0.0))\",\r\n \"openapi\": \"3.0.0\",\r\n \"info\": {\r\n \"title\": \"My Title\",\r\n \"version\": \"1.0.0\"\r\n },\r\n \"servers\": [\r\n {\r\n \"url\": \"https://localhost:44378\"\r\n }\r\n ],\r\n \"paths\": {\r\n \"/api/Ingredient\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Ingredient\"\r\n ],\r\n \"operationId\": \"IngredientGetAll\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 1\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/IngredientListModel\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"post\": {\r\n \"tags\": [\r\n \"Ingredient\"\r\n ],\r\n \"operationId\": \"IngredientCreate\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"x-name\": \"ingredient\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/IngredientNewModel\"\r\n }\r\n }\r\n },\r\n \"required\": true,\r\n \"x-position\": 1\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"put\": {\r\n \"tags\": [\r\n \"Ingredient\"\r\n ],\r\n \"operationId\": \"IngredientUpdate\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"x-name\": \"ingredient\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/IngredientUpdateModel\"\r\n }\r\n }\r\n },\r\n \"required\": true,\r\n \"x-position\": 1\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/api/Ingredient/{id}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Ingredient\"\r\n ],\r\n \"operationId\": \"IngredientGetById\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"x-position\": 1\r\n },\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/IngredientDetailModel\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Ingredient\"\r\n ],\r\n \"operationId\": \"IngredientDelete\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"x-position\": 1\r\n },\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/octet-stream\": {\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"binary\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/api/Logging\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Logging\"\r\n ],\r\n \"operationId\": \"LoggingLogSomething\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 1\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\"\r\n }\r\n }\r\n }\r\n },\r\n \"/api/Recipe\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Recipe\"\r\n ],\r\n \"operationId\": \"RecipeGetAll\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 1\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/RecipeListModel\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"post\": {\r\n \"tags\": [\r\n \"Recipe\"\r\n ],\r\n \"operationId\": \"RecipeCreate\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"x-name\": \"recipe\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RecipeNewModel\"\r\n }\r\n }\r\n },\r\n \"required\": true,\r\n \"x-position\": 1\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"put\": {\r\n \"tags\": [\r\n \"Recipe\"\r\n ],\r\n \"operationId\": \"RecipeUpdate\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"x-name\": \"recipe\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RecipeUpdateModel\"\r\n }\r\n }\r\n },\r\n \"required\": true,\r\n \"x-position\": 1\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\",\r\n \"nullable\": true\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/api/Recipe/{id}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Recipe\"\r\n ],\r\n \"operationId\": \"RecipeGetById\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"x-position\": 1\r\n },\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RecipeDetailModel\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Recipe\"\r\n ],\r\n \"operationId\": \"RecipeDelete\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"x-position\": 1\r\n },\r\n {\r\n \"name\": \"version\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"x-position\": 2\r\n },\r\n {\r\n \"type\": \"string\",\r\n \"name\": \"culture\",\r\n \"in\": \"query\"\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"\",\r\n \"content\": {\r\n \"application/octet-stream\": {\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"binary\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"IngredientListModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n }\r\n },\r\n \"IngredientDetailModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"description\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n }\r\n },\r\n \"IngredientNewModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"required\": [\r\n \"name\",\r\n \"description\"\r\n ],\r\n \"properties\": {\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"maxLength\": 100,\r\n \"minLength\": 3\r\n },\r\n \"description\": {\r\n \"type\": \"string\",\r\n \"minLength\": 10\r\n }\r\n }\r\n },\r\n \"IngredientUpdateModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"description\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n }\r\n },\r\n \"RecipeListModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"duration\": {\r\n \"type\": \"string\",\r\n \"format\": \"time-span\"\r\n },\r\n \"foodType\": {\r\n \"$ref\": \"#/components/schemas/FoodType\"\r\n },\r\n \"foodTypeText\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n }\r\n },\r\n \"FoodType\": {\r\n \"type\": \"integer\",\r\n \"description\": \"\",\r\n \"x-enumNames\": [\r\n \"Unknown\",\r\n \"MainDish\",\r\n \"Soup\",\r\n \"Dessert\"\r\n ],\r\n \"enum\": [\r\n 0,\r\n 1,\r\n 2,\r\n 3\r\n ]\r\n },\r\n \"RecipeDetailModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"description\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"duration\": {\r\n \"type\": \"string\",\r\n \"format\": \"time-span\"\r\n },\r\n \"foodType\": {\r\n \"$ref\": \"#/components/schemas/FoodType\"\r\n },\r\n \"ingredients\": {\r\n \"type\": \"array\",\r\n \"nullable\": true,\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/RecipeDetailIngredientModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"RecipeDetailIngredientModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"ingredientId\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"amount\": {\r\n \"type\": \"number\",\r\n \"format\": \"double\"\r\n },\r\n \"unit\": {\r\n \"$ref\": \"#/components/schemas/Unit\"\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"unitText\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n }\r\n },\r\n \"Unit\": {\r\n \"type\": \"integer\",\r\n \"description\": \"\",\r\n \"x-enumNames\": [\r\n \"Unknown\",\r\n \"Kg\",\r\n \"L\",\r\n \"Ml\",\r\n \"G\",\r\n \"Pieces\",\r\n \"Spoon\"\r\n ],\r\n \"enum\": [\r\n 0,\r\n 1,\r\n 2,\r\n 3,\r\n 4,\r\n 5,\r\n 6\r\n ]\r\n },\r\n \"RecipeNewModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"description\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"duration\": {\r\n \"type\": \"string\",\r\n \"format\": \"time-span\"\r\n },\r\n \"foodType\": {\r\n \"$ref\": \"#/components/schemas/FoodType\"\r\n },\r\n \"ingredients\": {\r\n \"type\": \"array\",\r\n \"nullable\": true,\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/RecipeNewIngredientModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"RecipeNewIngredientModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"ingredientId\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"amount\": {\r\n \"type\": \"number\",\r\n \"format\": \"double\"\r\n },\r\n \"unit\": {\r\n \"$ref\": \"#/components/schemas/Unit\"\r\n }\r\n }\r\n },\r\n \"RecipeUpdateModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"description\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"duration\": {\r\n \"type\": \"string\",\r\n \"format\": \"time-span\"\r\n },\r\n \"foodType\": {\r\n \"$ref\": \"#/components/schemas/FoodType\"\r\n },\r\n \"ingredients\": {\r\n \"type\": \"array\",\r\n \"nullable\": true,\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/RecipeUpdateIngredientModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"RecipeUpdateIngredientModel\": {\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"ingredientId\": {\r\n \"type\": \"string\",\r\n \"format\": \"guid\"\r\n },\r\n \"amount\": {\r\n \"type\": \"number\",\r\n \"format\": \"double\"\r\n },\r\n \"unit\": {\r\n \"$ref\": \"#/components/schemas/Unit\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}", + "url": "https://localhost:44378/swagger/v3/swagger.json", + "output": null, + "newLineBehavior": "Auto" + } + }, + "codeGenerators": { + "openApiToCSharpClient": { + "clientBaseClass": null, + "configurationClass": null, + "generateClientClasses": true, + "generateClientInterfaces": true, + "clientBaseInterface": null, + "injectHttpClient": true, + "disposeHttpClient": true, + "protectedMethods": [], + "generateExceptionClasses": true, + "exceptionClass": "ApiException", + "wrapDtoExceptions": true, + "useHttpClientCreationMethod": false, + "httpClientType": "System.Net.Http.HttpClient", + "useHttpRequestMessageCreationMethod": false, + "useBaseUrl": true, + "generateBaseUrlProperty": true, + "generateSyncMethods": false, + "exposeJsonSerializerSettings": false, + "clientClassAccessModifier": "public", + "typeAccessModifier": "public", + "generateContractsOutput": false, + "contractsNamespace": null, + "contractsOutputFilePath": null, + "parameterDateTimeFormat": "s", + "parameterDateFormat": "yyyy-MM-dd", + "generateUpdateJsonSerializerSettingsMethod": true, + "useRequestAndResponseSerializationSettings": false, + "serializeTypeInformation": false, + "queryNullValue": "", + "className": "{controller}Client", + "operationGenerationMode": "MultipleClientsFromFirstTagAndPathSegments", + "additionalNamespaceUsages": [], + "additionalContractNamespaceUsages": [], + "generateOptionalParameters": false, + "generateJsonMethods": false, + "enforceFlagEnums": false, + "parameterArrayType": "System.Collections.Generic.IEnumerable", + "parameterDictionaryType": "System.Collections.Generic.IDictionary", + "responseArrayType": "System.Collections.Generic.IList", + "responseDictionaryType": "System.Collections.Generic.IDictionary", + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "namespace": "CookBook.BL.Web.Blazor.Api", + "requiredPropertiesMustBeDefined": true, + "dateType": "System.DateTimeOffset", + "jsonConverters": null, + "anyType": "object", + "dateTimeType": "System.DateTimeOffset", + "timeType": "System.TimeSpan", + "timeSpanType": "System.TimeSpan", + "arrayType": "System.Collections.Generic.IList", + "arrayInstanceType": "System.Collections.ObjectModel.Collection", + "dictionaryType": "System.Collections.Generic.IDictionary", + "dictionaryInstanceType": "System.Collections.Generic.Dictionary", + "arrayBaseType": "System.Collections.ObjectModel.Collection", + "dictionaryBaseType": "System.Collections.Generic.Dictionary", + "classStyle": "Poco", + "generateDefaultValues": true, + "generateDataAnnotations": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateImmutableArrayProperties": false, + "generateImmutableDictionaryProperties": false, + "jsonSerializerSettingsTransformationMethod": null, + "inlineNamedArrays": false, + "inlineNamedDictionaries": false, + "inlineNamedTuples": true, + "inlineNamedAny": false, + "generateDtoTypes": true, + "generateOptionalPropertiesAsNullable": false, + "generateNullableReferenceTypes": false, + "templateDirectory": null, + "typeNameGeneratorType": null, + "propertyNameGeneratorType": null, + "enumNameGeneratorType": null, + "serviceHost": null, + "serviceSchemes": null, + "output": "../sln/CookBook.BL.Web.Blazor/Api/Generated/ApiClient.cs", + "newLineBehavior": "Auto" + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v1/IngredientController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v1/IngredientController.cs new file mode 100644 index 00000000..2063afa9 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v1/IngredientController.cs @@ -0,0 +1,41 @@ +using Microsoft.AspNetCore.Mvc; +using NSwag.Annotations; +using System; + +namespace CookBook.Api.Controllers.v1 +{ + [ApiController] + [Route("api/[controller]")] + [ApiVersion("1.0")] + public class IngredientController : ControllerBase + { + [HttpGet] + [OpenApiOperation("Ingredient" + nameof(GetAll))] + public IActionResult GetAll() + { + var ingredients = new[] + { + new { Id = new Guid("df935095-8709-4040-a2bb-b6f97cb416dc"), Name = "Vejce", Description = "Popis vajec" }, + new { Id = new Guid("23b3902d-7d4f-4213-9cf0-112348f56238"), Name = "Name 2", Description = "Description 2" } + }; + return Ok(ingredients); + } + + [HttpGet("{id}")] + public IActionResult GetById(Guid id) + { + if (id == new Guid("df935095-8709-4040-a2bb-b6f97cb416dc")) + { + return Ok(new + { + Id = new Guid("df935095-8709-4040-a2bb-b6f97cb416dc"), + Name = "Vejce" + }); + } + else + { + return NotFound(); + } + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v2/IngredientController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v2/IngredientController.cs new file mode 100644 index 00000000..ebacc512 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v2/IngredientController.cs @@ -0,0 +1,36 @@ +using CookBook.DAL.Entities; +using CookBook.DAL.Repositories; +using Microsoft.AspNetCore.Mvc; +using NSwag.Annotations; +using System; +using System.Collections.Generic; + +namespace CookBook.Api.Controllers.v2 +{ + [ApiController] + [Route("api/[controller]")] + [ApiVersion("2.0")] + public class IngredientController : ControllerBase + { + private readonly IngredientRepository ingredientRepository; + + public IngredientController(IngredientRepository ingredientRepository) + { + this.ingredientRepository = ingredientRepository; + } + + [HttpGet] + [OpenApiOperation("Ingredient" + nameof(GetAll))] + public IList GetAll() + { + return ingredientRepository.GetAll(); + } + + [HttpGet("{id}")] + [OpenApiOperation("Ingredient" + nameof(GetById))] + public IngredientEntity GetById(Guid id) + { + return ingredientRepository.GetById(id); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/IngredientController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/IngredientController.cs new file mode 100644 index 00000000..f945c5f6 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/IngredientController.cs @@ -0,0 +1,72 @@ +using CookBook.BL.Api.Facades; +using CookBook.Localization.Resources; +using CookBook.Models; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; +using NSwag.Annotations; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CookBook.Api.Controllers.v3 +{ + [ApiController] + [Route("api/[controller]")] + [ApiVersion("3.0")] + public class IngredientController : ControllerBase + { + private const string ApiOperationBaseName = "Ingredient"; + private readonly IngredientFacade ingredientFacade; + private readonly IStringLocalizer ingredientControllerLocalizer; + + public IngredientController( + IngredientFacade ingredientFacade, + IStringLocalizer ingredientControllerLocalizer) + { + this.ingredientFacade = ingredientFacade; + this.ingredientControllerLocalizer = ingredientControllerLocalizer; + } + + [HttpGet] + [OpenApiOperation(ApiOperationBaseName + nameof(GetAll))] + public ActionResult> GetAll() + { + return ingredientFacade.GetAll().ToList(); + } + + [HttpGet("{id}")] + [OpenApiOperation(ApiOperationBaseName + nameof(GetById))] + public ActionResult GetById(Guid id) + { + var ingredient = ingredientFacade.GetById(id); + if (ingredient == null) + { + return NotFound(ingredientControllerLocalizer[nameof(IngredientControllerResources.GetById_NotFound), id].Value); + } + + return ingredient; + } + + [HttpPost] + [OpenApiOperation(ApiOperationBaseName + nameof(Create))] + public ActionResult Create(IngredientDetailModel ingredient) + { + return ingredientFacade.Create(ingredient); + } + + [HttpPut] + [OpenApiOperation(ApiOperationBaseName + nameof(Update))] + public ActionResult Update(IngredientDetailModel ingredient) + { + return ingredientFacade.Update(ingredient); + } + + [HttpDelete("{id}")] + [OpenApiOperation(ApiOperationBaseName + nameof(Delete))] + public IActionResult Delete(Guid id) + { + ingredientFacade.Delete(id); + return Ok(); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/LoggingController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/LoggingController.cs new file mode 100644 index 00000000..10d04a48 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/LoggingController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using NSwag.Annotations; +using System; + +namespace CookBook.Api.Controllers.v3 +{ + [ApiController] + [Route("api/[controller]")] + [ApiVersion("3.0")] + public class LoggingController : ControllerBase + { + private const string ApiOperationBaseName = "Logging"; + private readonly ILogger logger; + + public LoggingController(ILogger logger) + { + this.logger = logger; + } + + [HttpGet] + [OpenApiOperation(ApiOperationBaseName + nameof(LogSomething))] + public void LogSomething() + { + logger.LogInformation("Something"); + logger.LogWarning("Log something called in {0}", DateTime.Now); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/RecipeController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/RecipeController.cs new file mode 100644 index 00000000..078206e2 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Controllers/v3/RecipeController.cs @@ -0,0 +1,59 @@ +using CookBook.BL.Api.Facades; +using CookBook.Models; +using Microsoft.AspNetCore.Mvc; +using NSwag.Annotations; +using System; +using System.Collections.Generic; + +namespace CookBook.Api.Controllers.v3 +{ + [ApiController] + [Route("api/[controller]")] + [ApiVersion("3.0")] + public class RecipeController : ControllerBase + { + private const string ApiOperationBaseName = "Recipe"; + private readonly RecipeFacade recipeFacade; + + public RecipeController(RecipeFacade recipeFacade) + { + this.recipeFacade = recipeFacade; + } + + [HttpGet] + [OpenApiOperation(ApiOperationBaseName + nameof(GetAll))] + public ActionResult> GetAll() + { + return recipeFacade.GetAll(); + } + + [HttpGet("{id}")] + [OpenApiOperation(ApiOperationBaseName + nameof(GetById))] + public ActionResult GetById(Guid id) + { + return recipeFacade.GetById(id); + } + + [HttpPost] + [OpenApiOperation(ApiOperationBaseName + nameof(Create))] + public ActionResult Create(RecipeDetailModel recipe) + { + return recipeFacade.Create(recipe); + } + + [HttpPut] + [OpenApiOperation(ApiOperationBaseName + nameof(Update))] + public ActionResult Update(RecipeDetailModel recipe) + { + return recipeFacade.Update(recipe); + } + + [HttpDelete("{id}")] + [OpenApiOperation(ApiOperationBaseName + nameof(Delete))] + public IActionResult Delete(Guid id) + { + recipeFacade.Delete(id); + return Ok(); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/CookBook.Api.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/CookBook.Api.csproj new file mode 100644 index 00000000..99c78b1b --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/CookBook.Api.csproj @@ -0,0 +1,24 @@ + + + + netcoreapp3.1 + 70e22f70-c609-4d6a-9be8-b462915b90e5 + + + + + + + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Extensions/ApplicationBuilderExtensions.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Extensions/ApplicationBuilderExtensions.cs new file mode 100644 index 00000000..91449927 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Extensions/ApplicationBuilderExtensions.cs @@ -0,0 +1,13 @@ +using CookBook.Api.Middlewares; +using Microsoft.AspNetCore.Builder; + +namespace CookBook.Api.Extensions +{ + public static class ApplicationBuilderExtensions + { + public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Middlewares/RequestCultureMiddleware.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Middlewares/RequestCultureMiddleware.cs new file mode 100644 index 00000000..31f676a0 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Middlewares/RequestCultureMiddleware.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Http; +using System.Globalization; +using System.Threading.Tasks; + +namespace CookBook.Api.Middlewares +{ + public class RequestCultureMiddleware + { + private readonly RequestDelegate next; + + public RequestCultureMiddleware(RequestDelegate next) + { + this.next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + var culture = context.Request.Query["culture"]; + if (!string.IsNullOrWhiteSpace(culture)) + { + var cultureInfo = new CultureInfo(culture); + CultureInfo.CurrentCulture = cultureInfo; + CultureInfo.CurrentUICulture = cultureInfo; + } + + await next(context); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Processors/RequestCultureOperationProcessor.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Processors/RequestCultureOperationProcessor.cs new file mode 100644 index 00000000..59f1d854 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Processors/RequestCultureOperationProcessor.cs @@ -0,0 +1,23 @@ +using NJsonSchema; +using NSwag; +using NSwag.Generation.Processors; +using NSwag.Generation.Processors.Contexts; + +namespace CookBook.Api.Processors +{ + public class RequestCultureOperationProcessor : IOperationProcessor + { + public bool Process(OperationProcessorContext context) + { + context.OperationDescription.Operation.Parameters.Add(new OpenApiParameter + { + Name = "culture", + Kind = OpenApiParameterKind.Query, + Type = JsonObjectType.String, + IsRequired = false + }); + + return true; + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Program.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Program.cs new file mode 100644 index 00000000..c56ad126 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Program.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace CookBook.Api +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureLogging(builder => + { + builder.ClearProviders() + .AddConsole() + .AddFilter("System", LogLevel.Debug) + .SetMinimumLevel(LogLevel.Warning); + }) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Properties/launchSettings.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Properties/launchSettings.json new file mode 100644 index 00000000..34879ae5 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Properties/launchSettings.json @@ -0,0 +1,28 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:61245", + "sslPort": 44378 + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "CookBook.Api": { + "commandName": "Project", + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Startup.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Startup.cs new file mode 100644 index 00000000..cebf87af --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/Startup.cs @@ -0,0 +1,130 @@ +using AutoMapper; +using CookBook.Api.Extensions; +using CookBook.Api.Processors; +using CookBook.BL.Api.Installers; +using CookBook.BL.Common.Installers; +using CookBook.Common.Extensions; +using CookBook.DAL.Installers; +using FluentValidation.AspNetCore; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Versioning; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using NSwag.AspNetCore; +using System.Collections.Generic; +using System.Globalization; + +namespace CookBook.Api +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + public void ConfigureServices(IServiceCollection services) + { + services.AddApiVersioning(options => + { + options.ApiVersionReader = new QueryStringApiVersionReader("version"); + options.DefaultApiVersion = new ApiVersion(3, 0); + options.ReportApiVersions = true; + options.AssumeDefaultVersionWhenUnspecified = true; + }); + + services.AddControllers() + .AddNewtonsoftJson() + .AddFluentValidation(configuration => configuration.RegisterValidatorsFromAssemblyContaining()); + + services.AddLocalization(options => options.ResourcesPath = string.Empty); + + services.AddVersionedApiExplorer(options => + { + options.AddApiVersionParametersWhenVersionNeutral = true; + }); + + services.AddOpenApiDocument(document => + { + document.DocumentName = "v1"; + document.ApiGroupNames = new[] { "1.0" }; + }); + + services.AddOpenApiDocument(document => + { + document.DocumentName = "v2"; + document.ApiGroupNames = new[] { "2.0" }; + }); + + services.AddOpenApiDocument(document => + { + document.DocumentName = "v3"; + document.ApiGroupNames = new[] { "3.0" }; + document.OperationProcessors.Add(new RequestCultureOperationProcessor()); + }); + + services.AddInstaller(); + services.AddInstaller(); + services.AddInstaller(); + + services.AddAutoMapper(typeof(DALInstaller), typeof(BLApiInstaller)); + + services.AddCors(options => + { + options.AddDefaultPolicy(builder => + builder.AllowAnyOrigin() + .AllowAnyHeader() + .AllowAnyMethod()); + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IMapper mapper) + { + mapper.ConfigurationProvider.AssertConfigurationIsValid(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseCors(); + + app.UseHttpsRedirection(); + + app.UseRequestLocalization(new RequestLocalizationOptions + { + DefaultRequestCulture = new RequestCulture(new CultureInfo("en")), + SupportedCultures = new List + { + new CultureInfo("en"), + new CultureInfo("cs") + } + }); + + app.UseRequestCulture(); + + app.UseRouting(); + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + + app.UseOpenApi(); + app.UseSwaggerUi3(settings => + { + settings.SwaggerRoutes.Add(new SwaggerUi3Route("v3.0", "/swagger/v3/swagger.json")); + settings.SwaggerRoutes.Add(new SwaggerUi3Route("v2.0", "/swagger/v2/swagger.json")); + settings.SwaggerRoutes.Add(new SwaggerUi3Route("v1.0", "/swagger/v1/swagger.json")); + }); + + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/appsettings.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/appsettings.json new file mode 100644 index 00000000..72177675 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Api/appsettings.json @@ -0,0 +1,4 @@ +{ + "AllowedHosts": "*", + "ServerName:Name": "Karel" +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj new file mode 100644 index 00000000..7b59a3ee --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj @@ -0,0 +1,24 @@ + + + + netstandard2.0 + + + + + + + + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj.DotSettings b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj.DotSettings new file mode 100644 index 00000000..2804edb9 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/CookBook.BL.Api.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/IngredientFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/IngredientFacade.cs new file mode 100644 index 00000000..6d635a8a --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/IngredientFacade.cs @@ -0,0 +1,52 @@ +using AutoMapper; +using CookBook.BL.Common.Facades; +using CookBook.DAL.Entities; +using CookBook.DAL.Repositories; +using CookBook.Models; +using System; +using System.Collections.Generic; + +namespace CookBook.BL.Api.Facades +{ + public class IngredientFacade : IAppFacade + { + private readonly IngredientRepository ingredientRepository; + private readonly IMapper mapper; + + public IngredientFacade( + IngredientRepository ingredientRepository, + IMapper mapper) + { + this.ingredientRepository = ingredientRepository; + this.mapper = mapper; + } + + public List GetAll() + { + return mapper.Map>(ingredientRepository.GetAll()); + } + + public IngredientDetailModel GetById(Guid id) + { + return mapper.Map(ingredientRepository.GetById(id)); + } + + public Guid Create(IngredientDetailModel ingredient) + { + var ingredientEntity = mapper.Map(ingredient); + ingredientEntity.Id = Guid.NewGuid(); + return ingredientRepository.Insert(ingredientEntity); + } + + public Guid? Update(IngredientDetailModel ingredient) + { + var ingredientEntity = mapper.Map(ingredient); + return ingredientRepository.Update(ingredientEntity); + } + + public void Delete(Guid id) + { + ingredientRepository.Remove(id); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/RecipeFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/RecipeFacade.cs new file mode 100644 index 00000000..7a0270cd --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Facades/RecipeFacade.cs @@ -0,0 +1,125 @@ +using AutoMapper; +using CookBook.BL.Common.Facades; +using CookBook.DAL.Entities; +using CookBook.DAL.Repositories; +using CookBook.Models; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CookBook.BL.Api.Facades +{ + public class RecipeFacade : IAppFacade + { + private readonly RecipeRepository recipeRepository; + private readonly IngredientAmountRepository ingredientAmountRepository; + private readonly IngredientRepository ingredientRepository; + private readonly IMapper mapper; + + public RecipeFacade( + RecipeRepository recipeRepository, + IngredientAmountRepository ingredientAmountRepository, + IngredientRepository ingredientRepository, + IMapper mapper) + { + this.recipeRepository = recipeRepository; + this.ingredientAmountRepository = ingredientAmountRepository; + this.ingredientRepository = ingredientRepository; + this.mapper = mapper; + } + + public List GetAll() + { + var recipeEntities = recipeRepository.GetAll(); + return mapper.Map>(recipeEntities); + } + + public RecipeDetailModel GetById(Guid id) + { + var recipeEntity = recipeRepository.GetById(id); + recipeEntity.IngredientAmounts = ingredientAmountRepository.GetByRecipeId(id); + foreach (var ingredientAmount in recipeEntity.IngredientAmounts) + { + ingredientAmount.Ingredient = ingredientRepository.GetById(ingredientAmount.IngredientId); + } + + return mapper.Map(recipeEntity); + } + + public Guid Create(RecipeDetailModel recipe) + { + var recipeEntity = mapper.Map(recipe); + recipeEntity.Id = Guid.NewGuid(); + recipeRepository.Insert(recipeEntity); + + foreach (var ingredientAmount in recipeEntity.IngredientAmounts) + { + ingredientAmount.RecipeId = recipeEntity.Id; + ingredientAmountRepository.Insert(ingredientAmount); + } + + return recipeEntity.Id; + } + + public Guid? Update(RecipeDetailModel recipe) + { + var recipeEntityExisting = recipeRepository.GetById(recipe.Id); + recipeEntityExisting.IngredientAmounts = ingredientAmountRepository.GetByRecipeId(recipe.Id); + UpdateIngredientAmounts(recipe, recipeEntityExisting); + + var recipeEntityUpdated = mapper.Map(recipe); + return recipeRepository.Update(recipeEntityUpdated); + } + + private void UpdateIngredientAmounts(RecipeDetailModel recipeModel, RecipeEntity recipeEntity) + { + var ingredientAmountsToDelete = recipeEntity.IngredientAmounts.Where( + ingredientAmount => + !recipeModel.Ingredients.Any(ingredient => ingredient.Ingredient.Id == ingredientAmount.IngredientId)); + DeleteIngredientAmounts(ingredientAmountsToDelete); + + var recipeUpdateIngredientModelsToInsert = recipeModel.Ingredients.Where( + ingredient => !recipeEntity.IngredientAmounts.Any(ingredientAmount => ingredientAmount.IngredientId == ingredient.Ingredient.Id)); + InsertIngredientAmounts(recipeEntity, recipeUpdateIngredientModelsToInsert); + + var recipeUpdateIngredientModelsToUpdate = recipeModel.Ingredients.Where( + ingredient => recipeEntity.IngredientAmounts.Any(ingredientAmount => ingredientAmount.IngredientId == ingredient.Ingredient.Id)); + UpdateIngredientAmounts(recipeEntity, recipeUpdateIngredientModelsToUpdate); + } + + private void UpdateIngredientAmounts(RecipeEntity recipeEntity, IEnumerable recipeUpdateIngredientModelsToUpdate) + { + foreach (var recipeUpdateIngredientModel in recipeUpdateIngredientModelsToUpdate) + { + var ingredientAmountEntity = + ingredientAmountRepository.GetByRecipeIdAndIngredientId(recipeEntity.Id, + recipeUpdateIngredientModel.Ingredient.Id); + mapper.Map(recipeUpdateIngredientModel, ingredientAmountEntity); + ingredientAmountRepository.Update(ingredientAmountEntity); + } + } + + private void InsertIngredientAmounts(RecipeEntity recipeEntity, IEnumerable recipeUpdateIngredientModelsToInsert) + { + foreach (var recipeUpdateIngredientModel in recipeUpdateIngredientModelsToInsert) + { + var ingredientAmountEntity = mapper.Map(recipeUpdateIngredientModel); + ingredientAmountEntity.RecipeId = recipeEntity.Id; + ingredientAmountRepository.Insert(ingredientAmountEntity); + } + } + + private void DeleteIngredientAmounts(IEnumerable ingredientAmountsToDelete) + { + foreach (var ingredientAmountEntity in ingredientAmountsToDelete) + { + ingredientAmountRepository.Remove(ingredientAmountEntity.Id); + } + } + + public void Delete(Guid id) + { + recipeRepository.Remove(id); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Installers/BLApiInstaller.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Installers/BLApiInstaller.cs new file mode 100644 index 00000000..1ed165d9 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Installers/BLApiInstaller.cs @@ -0,0 +1,18 @@ +using CookBook.BL.Common.Facades; +using CookBook.Common.Installers; +using Microsoft.Extensions.DependencyInjection; + +namespace CookBook.BL.Api.Installers +{ + public class BLApiInstaller : IInstaller + { + public void Install(IServiceCollection serviceCollection) + { + serviceCollection.Scan(selector => + selector.FromCallingAssembly() + .AddClasses(classes => classes.AssignableTo()) + .AsSelfWithInterfaces() + .WithTransientLifetime()); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/AutoMapperExtensions.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/AutoMapperExtensions.cs new file mode 100644 index 00000000..8d69a502 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/AutoMapperExtensions.cs @@ -0,0 +1,43 @@ +using System; +using System.Linq.Expressions; +using AutoMapper; + +namespace CookBook.BL.Api.Mapping +{ + public static class AutoMapperExtensions + { + public static IMappingExpression MapMember( + this IMappingExpression map, + Expression> dstSelector, + Expression> srcSelector) + { + map.ForMember(dstSelector, config => config.MapFrom(srcSelector)); + return map; + } + + public static IMappingExpression UseValue( + this IMappingExpression map, + Expression> dstSelector, + TValue value) + { + map.ForMember(dstSelector, config => config.MapFrom(src => value)); + return map; + } + + public static IMappingExpression Ignore( + this IMappingExpression map, + Expression> selector) + { + map.ForMember(selector, opt => opt.Ignore()); + return map; + } + + public static IMappingExpression IgnoreSource( + this IMappingExpression map, + Expression> selector) + { + map.ForSourceMember(selector, opt => opt.DoNotValidate()); + return map; + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/IngredientMappingProfile.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/IngredientMappingProfile.cs new file mode 100644 index 00000000..405b6064 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/IngredientMappingProfile.cs @@ -0,0 +1,18 @@ +using AutoMapper; +using CookBook.DAL.Entities; +using CookBook.Models; + +namespace CookBook.BL.Api.Mapping +{ + public class IngredientMappingProfile : Profile + { + public IngredientMappingProfile() + { + CreateMap(); + + CreateMap(); + + CreateMap(); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/RecipeMappingProfile.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/RecipeMappingProfile.cs new file mode 100644 index 00000000..b5cf4263 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Api/Mapping/RecipeMappingProfile.cs @@ -0,0 +1,28 @@ +using AutoMapper; +using CookBook.DAL.Entities; +using CookBook.Models; + +namespace CookBook.BL.Api.Mapping +{ + public class RecipeMappingProfile : Profile + { + public RecipeMappingProfile() + { + CreateMap() + .MapMember(dst => dst.Ingredients, src => src.IngredientAmounts); + + CreateMap() + .MapMember(dst => dst.IngredientAmounts, src => src.Ingredients); + + CreateMap(); + + CreateMap() + .Ignore(dst => dst.Id) + .Ignore(dst => dst.RecipeId) + .Ignore(dst => dst.Recipe) + .Ignore(dst => dst.Ingredient); + + CreateMap(); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/CookBook.BL.Common.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/CookBook.BL.Common.csproj new file mode 100644 index 00000000..8d122199 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/CookBook.BL.Common.csproj @@ -0,0 +1,16 @@ + + + + netstandard2.0 + latest + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Facades/IAppFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Facades/IAppFacade.cs new file mode 100644 index 00000000..b40988fc --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Facades/IAppFacade.cs @@ -0,0 +1,6 @@ +namespace CookBook.BL.Common.Facades +{ + public interface IAppFacade + { + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Installers/BLCommonInstaller.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Installers/BLCommonInstaller.cs new file mode 100644 index 00000000..8b612aea --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Installers/BLCommonInstaller.cs @@ -0,0 +1,18 @@ +using CookBook.BL.Common.Services; +using CookBook.Common.Installers; +using Microsoft.Extensions.DependencyInjection; + +namespace CookBook.BL.Common.Installers +{ + public class BLCommonInstaller : IInstaller + { + public void Install(IServiceCollection serviceCollection) + { + serviceCollection.Scan(scan => + scan.FromAssemblyOf() + .AddClasses(classes => classes.AssignableTo()) + .AsMatchingInterface() + .WithSingletonLifetime()); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/IAppService.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/IAppService.cs new file mode 100644 index 00000000..fbdcb59f --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/IAppService.cs @@ -0,0 +1,6 @@ +namespace CookBook.BL.Common.Services +{ + public interface IAppService + { + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/ISerializerService.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/ISerializerService.cs new file mode 100644 index 00000000..d7372dbe --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/ISerializerService.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace CookBook.BL.Common.Services +{ + public interface ISerializerService : IAppService + { + string Serialize(object value, JsonSerializerSettings settings = null); + T Deserialize(string value, JsonSerializerSettings settings = null); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/SerializerService.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/SerializerService.cs new file mode 100644 index 00000000..1099e765 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Common/Services/SerializerService.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json; + +namespace CookBook.BL.Common.Services +{ + public class SerializerService : ISerializerService + { + private readonly JsonSerializerSettings defaultJsonSerializerSettings; + + public SerializerService() + { + defaultJsonSerializerSettings = new JsonSerializerSettings(); + } + + public string Serialize(object value, JsonSerializerSettings settings = null) + { + settings ??= defaultJsonSerializerSettings; + return JsonConvert.SerializeObject(value, settings); + } + + public T Deserialize(string value, JsonSerializerSettings settings = null) + { + settings ??= defaultJsonSerializerSettings; + return JsonConvert.DeserializeObject(value, settings); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Api/Generated/ApiClient.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Api/Generated/ApiClient.cs new file mode 100644 index 00000000..d00e0d6d --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Api/Generated/ApiClient.cs @@ -0,0 +1,1446 @@ +//---------------------- +// +// Generated using the NSwag toolchain v13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0)) (http://NSwag.org) +// +//---------------------- + +using CookBook.Models; + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." + +namespace CookBook.BL.Web.Blazor.Api +{ + using System = global::System; + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial interface IIngredientClient + { + /// A server side error occurred. + System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class IngredientClient : IIngredientClient + { + private string _baseUrl = "https://localhost:44378"; + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public IngredientClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set { _baseUrl = value; } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// A server side error occurred. + public System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture) + { + return IngredientGetAsync(version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient) + { + return IngredientPostAsync(version, culture, ingredient, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken) + { + if (ingredient == null) + throw new System.ArgumentNullException("ingredient"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(ingredient, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient) + { + return IngredientPutAsync(version, culture, ingredient, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken) + { + if (ingredient == null) + throw new System.ArgumentNullException("ingredient"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(ingredient, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture) + { + return IngredientGetAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture) + { + return IngredientDeleteAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/octet-stream")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200 || status_ == 206) + { + var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); + client_ = null; response_ = null; // response and client are disposed by FileResponse + return fileResponse_; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return null; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return (result is null) ? string.Empty : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial interface ILoggingClient + { + /// A server side error occurred. + System.Threading.Tasks.Task LoggingAsync(string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task LoggingAsync(string version, string culture, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class LoggingClient : ILoggingClient + { + private string _baseUrl = "https://localhost:44378"; + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public LoggingClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set { _baseUrl = value; } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// A server side error occurred. + public System.Threading.Tasks.Task LoggingAsync(string version, string culture) + { + return LoggingAsync(version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task LoggingAsync(string version, string culture, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Logging?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return null; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return (result is null) ? string.Empty : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial interface IRecipeClient + { + /// A server side error occurred. + System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class RecipeClient : IRecipeClient + { + private string _baseUrl = "https://localhost:44378"; + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public RecipeClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set { _baseUrl = value; } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// A server side error occurred. + public System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture) + { + return RecipeGetAsync(version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe) + { + return RecipePostAsync(version, culture, recipe, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken) + { + if (recipe == null) + throw new System.ArgumentNullException("recipe"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(recipe, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe) + { + return RecipePutAsync(version, culture, recipe, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken) + { + if (recipe == null) + throw new System.ArgumentNullException("recipe"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(recipe, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture) + { + return RecipeGetAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture) + { + return RecipeDeleteAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/octet-stream")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200 || status_ == 206) + { + var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); + client_ = null; response_ = null; // response and client are disposed by FileResponse + return fileResponse_; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return null; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return (result is null) ? string.Empty : result; + } + } + + + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class FileResponse : System.IDisposable + { + private System.IDisposable _client; + private System.IDisposable _response; + + public int StatusCode { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public System.IO.Stream Stream { get; private set; } + + public bool IsPartial + { + get { return StatusCode == 206; } + } + + public FileResponse(int statusCode, System.Collections.Generic.IReadOnlyDictionary> headers, System.IO.Stream stream, System.IDisposable client, System.IDisposable response) + { + StatusCode = statusCode; + Headers = headers; + Stream = stream; + _client = client; + _response = response; + } + + public void Dispose() + { + Stream.Dispose(); + if (_response != null) + _response.Dispose(); + if (_client != null) + _client.Dispose(); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class ApiException : System.Exception + { + public int StatusCode { get; private set; } + + public string Response { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception innerException) + : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) + { + StatusCode = statusCode; + Response = response; + Headers = headers; + } + + public override string ToString() + { + return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class ApiException : ApiException + { + public TResult Result { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception innerException) + : base(message, statusCode, response, headers, innerException) + { + Result = result; + } + } + +} + +#pragma warning restore 1591 +#pragma warning restore 1573 +#pragma warning restore 472 +#pragma warning restore 114 +#pragma warning restore 108 \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj new file mode 100644 index 00000000..dc76c6bf --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.1 + + + + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj.DotSettings b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj.DotSettings new file mode 100644 index 00000000..1a86bdfb --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/CookBook.BL.Web.Blazor.csproj.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/FacadeBase.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/FacadeBase.cs new file mode 100644 index 00000000..d7337de6 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/FacadeBase.cs @@ -0,0 +1,9 @@ +using CookBook.BL.Common.Facades; + +namespace CookBook.BL.Web.Blazor.Facades +{ + public class FacadeBase : IAppFacade + { + protected virtual string apiVersion => "3"; + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/IngredientsFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/IngredientsFacade.cs new file mode 100644 index 00000000..d53ec743 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/IngredientsFacade.cs @@ -0,0 +1,45 @@ +using CookBook.BL.Web.Blazor.Api; +using CookBook.Models; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace CookBook.BL.Web.Blazor.Facades +{ + public class IngredientsFacade : FacadeBase, IIngredientsFacade + { + private readonly IIngredientClient ingredientClient; + + public IngredientsFacade(IIngredientClient ingredientClient) + { + this.ingredientClient = ingredientClient; + } + + public async Task> IngredientsGetAsync(string culture) + { + return await ingredientClient.IngredientGetAsync(apiVersion, culture); + } + + public async Task IngredientGetAsync(Guid id, string culture) + { + return await ingredientClient.IngredientGetAsync(id, apiVersion, culture); + } + + public async Task SaveAsync(IngredientDetailModel data,string culture) + { + if (data.Id == Guid.Empty) + { + return await ingredientClient.IngredientPostAsync(apiVersion, culture, data); + } + else + { + return await ingredientClient.IngredientPutAsync(apiVersion, culture, data); + } + } + + public async Task DeleteAsync(Guid id,string culture) + { + await ingredientClient.IngredientDeleteAsync(id, apiVersion, culture); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IIngredientsFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IIngredientsFacade.cs new file mode 100644 index 00000000..1864bfa7 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IIngredientsFacade.cs @@ -0,0 +1,15 @@ +using CookBook.Models; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace CookBook.BL.Web.Blazor.Facades +{ + public interface IIngredientsFacade + { + Task> IngredientsGetAsync(string culture); + Task IngredientGetAsync(Guid id,string culture); + Task SaveAsync(IngredientDetailModel data,string culture); + Task DeleteAsync(Guid id,string culture); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IRecipesFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IRecipesFacade.cs new file mode 100644 index 00000000..2b9f5ef1 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/Interfaces/IRecipesFacade.cs @@ -0,0 +1,15 @@ +using System; +using CookBook.Models; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace CookBook.BL.Web.Blazor.Facades +{ + public interface IRecipesFacade + { + Task> RecipesGetAsync(string culture); + Task RecipeGetAsync(Guid id, string culture); + Task SaveAsync(RecipeDetailModel data, string culture); + Task DeleteAsync(Guid id, string culture); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/RecipesFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/RecipesFacade.cs new file mode 100644 index 00000000..f370bb3e --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Facades/RecipesFacade.cs @@ -0,0 +1,45 @@ +using System; +using CookBook.BL.Web.Blazor.Api; +using CookBook.Models; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace CookBook.BL.Web.Blazor.Facades +{ + public class RecipesFacade : FacadeBase, IRecipesFacade + { + private readonly IRecipeClient recipeClient; + + public RecipesFacade(IRecipeClient recipeClient) + { + this.recipeClient = recipeClient; + } + + public async Task> RecipesGetAsync(string culture) + { + return await recipeClient.RecipeGetAsync("3", culture); + } + public async Task RecipeGetAsync(Guid id, string culture) + { + return await recipeClient.RecipeGetAsync(id, apiVersion, culture); + } + + public async Task SaveAsync(RecipeDetailModel data, string culture) + { + if (data.Id == Guid.Empty) + { + return await recipeClient.RecipePostAsync(apiVersion, culture, data); + } + else + { + var recipePutAsync = await recipeClient.RecipePutAsync(apiVersion, culture, data); + return recipePutAsync ?? Guid.Empty; + } + } + + public async Task DeleteAsync(Guid id, string culture) + { + await recipeClient.RecipeDeleteAsync(id, apiVersion, culture); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Installers/BLWebBlazorInstaller.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Installers/BLWebBlazorInstaller.cs new file mode 100644 index 00000000..8a769c4c --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.Blazor/Installers/BLWebBlazorInstaller.cs @@ -0,0 +1,22 @@ +using CookBook.BL.Common.Facades; +using CookBook.BL.Web.Blazor.Api; +using CookBook.Common.Installers; +using Microsoft.Extensions.DependencyInjection; + +namespace CookBook.BL.Web.Blazor.Installers +{ + public class BLWebBlazorInstaller : IInstaller + { + public void Install(IServiceCollection serviceCollection) + { + serviceCollection.AddScoped(); + serviceCollection.AddScoped(); + serviceCollection.AddScoped(); + + serviceCollection.Scan(scan => + scan.FromAssemblyOf() + .AddClasses(classes => classes.AssignableTo()) + .AsMatchingInterface()); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/IngredientClient.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/IngredientClient.cs new file mode 100644 index 00000000..8d22f7fa --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/IngredientClient.cs @@ -0,0 +1,15 @@ +using CookBook.BL.Web.MVC.Options; +using Microsoft.Extensions.Options; +using System.Net.Http; + +namespace CookBook.BL.Web.MVC.Api +{ + public partial class IngredientClient + { + public IngredientClient(IOptions apiOptions, HttpClient httpClient) + : this(httpClient) + { + BaseUrl = apiOptions.Value.BaseUrl; + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/RecipeClient.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/RecipeClient.cs new file mode 100644 index 00000000..49336473 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Custom/RecipeClient.cs @@ -0,0 +1,15 @@ +using CookBook.BL.Web.MVC.Options; +using Microsoft.Extensions.Options; +using System.Net.Http; + +namespace CookBook.BL.Web.MVC.Api +{ + public partial class RecipeClient + { + public RecipeClient(IOptions apiOptions, HttpClient httpClient) + : this(httpClient) + { + BaseUrl = apiOptions.Value.BaseUrl; + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Generated/ApiClient.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Generated/ApiClient.cs new file mode 100644 index 00000000..729253c3 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Api/Generated/ApiClient.cs @@ -0,0 +1,1570 @@ +//---------------------- +// +// Generated using the NSwag toolchain v13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0)) (http://NSwag.org) +// +//---------------------- + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." + +namespace CookBook.BL.Web.MVC.Api +{ + using System = global::System; + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial interface IIngredientClient + { + /// A server side error occurred. + System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class IngredientClient : IIngredientClient + { + private string _baseUrl = "https://localhost:44378"; + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public IngredientClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set { _baseUrl = value; } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// A server side error occurred. + public System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture) + { + return IngredientGetAsync(version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task> IngredientGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient) + { + return IngredientPostAsync(version, culture, ingredient, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientPostAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken) + { + if (ingredient == null) + throw new System.ArgumentNullException("ingredient"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(ingredient, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient) + { + return IngredientPutAsync(version, culture, ingredient, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientPutAsync(string version, string culture, IngredientDetailModel ingredient, System.Threading.CancellationToken cancellationToken) + { + if (ingredient == null) + throw new System.ArgumentNullException("ingredient"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(ingredient, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture) + { + return IngredientGetAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture) + { + return IngredientDeleteAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task IngredientDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Ingredient/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/octet-stream")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200 || status_ == 206) + { + var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); + client_ = null; response_ = null; // response and client are disposed by FileResponse + return fileResponse_; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return null; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return (result is null) ? string.Empty : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial interface ILoggingClient + { + /// A server side error occurred. + System.Threading.Tasks.Task LoggingAsync(string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task LoggingAsync(string version, string culture, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class LoggingClient : ILoggingClient + { + private string _baseUrl = "https://localhost:44378"; + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public LoggingClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set { _baseUrl = value; } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// A server side error occurred. + public System.Threading.Tasks.Task LoggingAsync(string version, string culture) + { + return LoggingAsync(version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task LoggingAsync(string version, string culture, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Logging?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return null; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return (result is null) ? string.Empty : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial interface IRecipeClient + { + /// A server side error occurred. + System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + /// A server side error occurred. + System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class RecipeClient : IRecipeClient + { + private string _baseUrl = "https://localhost:44378"; + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public RecipeClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set { _baseUrl = value; } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// A server side error occurred. + public System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture) + { + return RecipeGetAsync(version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task> RecipeGetAsync(string version, string culture, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe) + { + return RecipePostAsync(version, culture, recipe, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipePostAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken) + { + if (recipe == null) + throw new System.ArgumentNullException("recipe"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(recipe, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe) + { + return RecipePutAsync(version, culture, recipe, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipePutAsync(string version, string culture, RecipeDetailModel recipe, System.Threading.CancellationToken cancellationToken) + { + if (recipe == null) + throw new System.ArgumentNullException("recipe"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe?"); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(recipe, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture) + { + return RecipeGetAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipeGetAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// A server side error occurred. + public System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture) + { + return RecipeDeleteAsync(id, version, culture, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A server side error occurred. + public async System.Threading.Tasks.Task RecipeDeleteAsync(System.Guid id, string version, string culture, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Recipe/{id}?"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + if (version != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("version") + "=").Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (culture != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("culture") + "=").Append(System.Uri.EscapeDataString(ConvertToString(culture, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/octet-stream")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200 || status_ == 206) + { + var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); + client_ = null; response_ = null; // response and client are disposed by FileResponse + return fileResponse_; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return null; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return (result is null) ? string.Empty : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.24.0 (Newtonsoft.Json v12.0.0.0)")] + public partial class IngredientListModel + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.24.0 (Newtonsoft.Json v12.0.0.0)")] + public partial class IngredientDetailModel + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(int.MaxValue, MinimumLength = 10)] + public string Description { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.24.0 (Newtonsoft.Json v12.0.0.0)")] + public partial class RecipeListModel + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("duration", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.TimeSpan Duration { get; set; } + + [Newtonsoft.Json.JsonProperty("foodType", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FoodType FoodType { get; set; } + + [Newtonsoft.Json.JsonProperty("foodTypeText", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FoodTypeText { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.24.0 (Newtonsoft.Json v12.0.0.0)")] + public enum FoodType + { + Unknown = 0, + + MainDish = 1, + + Soup = 2, + + Dessert = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.24.0 (Newtonsoft.Json v12.0.0.0)")] + public partial class RecipeDetailModel + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Description { get; set; } + + [Newtonsoft.Json.JsonProperty("duration", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.TimeSpan Duration { get; set; } + + [Newtonsoft.Json.JsonProperty("foodType", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FoodType FoodType { get; set; } + + [Newtonsoft.Json.JsonProperty("ingredients", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IList Ingredients { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.24.0 (Newtonsoft.Json v12.0.0.0)")] + public partial class RecipeListIngredientModel + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("ingredientId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid IngredientId { get; set; } + + [Newtonsoft.Json.JsonProperty("amount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public double Amount { get; set; } + + [Newtonsoft.Json.JsonProperty("unit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Unit Unit { get; set; } + + [Newtonsoft.Json.JsonProperty("unitText", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string UnitText { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.24.0 (Newtonsoft.Json v12.0.0.0)")] + public enum Unit + { + Unknown = 0, + + Kg = 1, + + L = 2, + + Ml = 3, + + G = 4, + + Pieces = 5, + + Spoon = 6, + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class FileResponse : System.IDisposable + { + private System.IDisposable _client; + private System.IDisposable _response; + + public int StatusCode { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public System.IO.Stream Stream { get; private set; } + + public bool IsPartial + { + get { return StatusCode == 206; } + } + + public FileResponse(int statusCode, System.Collections.Generic.IReadOnlyDictionary> headers, System.IO.Stream stream, System.IDisposable client, System.IDisposable response) + { + StatusCode = statusCode; + Headers = headers; + Stream = stream; + _client = client; + _response = response; + } + + public void Dispose() + { + Stream.Dispose(); + if (_response != null) + _response.Dispose(); + if (_client != null) + _client.Dispose(); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class ApiException : System.Exception + { + public int StatusCode { get; private set; } + + public string Response { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception innerException) + : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) + { + StatusCode = statusCode; + Response = response; + Headers = headers; + } + + public override string ToString() + { + return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.7.0.0 (NJsonSchema v10.1.24.0 (Newtonsoft.Json v12.0.0.0))")] + public partial class ApiException : ApiException + { + public TResult Result { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception innerException) + : base(message, statusCode, response, headers, innerException) + { + Result = result; + } + } + +} + +#pragma warning restore 1591 +#pragma warning restore 1573 +#pragma warning restore 472 +#pragma warning restore 114 +#pragma warning restore 108 \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj new file mode 100644 index 00000000..26ae8739 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj @@ -0,0 +1,21 @@ + + + + netstandard2.0 + latest + + + + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj.DotSettings b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj.DotSettings new file mode 100644 index 00000000..fe342886 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/CookBook.BL.Web.MVC.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/IngredientFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/IngredientFacade.cs new file mode 100644 index 00000000..955f08ba --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/IngredientFacade.cs @@ -0,0 +1,49 @@ +using CookBook.BL.Common.Facades; +using CookBook.BL.Web.MVC.Api; +using CookBook.BL.Web.MVC.Options; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace CookBook.BL.Web.MVC.Facades +{ + public class IngredientFacade : IAppFacade + { + private readonly IIngredientClient _ingredientClient; + private readonly IOptions apiOptions; + private readonly IOptions webOptions; + + public IngredientFacade(IIngredientClient ingredientClient, + IOptions apiOptions, + IOptions webOptions) + { + _ingredientClient = ingredientClient; + this.apiOptions = apiOptions; + this.webOptions = webOptions; + } + + public async Task> GetAllAsync() + { + return (await _ingredientClient.IngredientGetAsync("3", "cs")).ToList(); + } + + public async Task GetByIdAsync(Guid id) + { + return await _ingredientClient.IngredientGetAsync(id, "3", "cs"); + } + + public async Task InsertAsync(IngredientDetailModel ingredient) + { + return await _ingredientClient.IngredientPostAsync("3", "cs", ingredient); + } + + public async Task DeleteAsync(Guid id, string version = null, string culture = null) + { + version ??= apiOptions.Value.Version; + culture ??= webOptions.Value.DefaultCulture; + await _ingredientClient.IngredientDeleteAsync(id, version, culture); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/RecipeFacade.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/RecipeFacade.cs new file mode 100644 index 00000000..bc01d180 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Facades/RecipeFacade.cs @@ -0,0 +1,52 @@ +using CookBook.BL.Common.Facades; +using CookBook.BL.Web.MVC.Api; +using CookBook.BL.Web.MVC.Options; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace CookBook.BL.Web.MVC.Facades +{ + public class RecipeFacade : IAppFacade + { + private readonly IRecipeClient _recipeClient; + private readonly IOptions apiOptions; + private readonly IOptions webOptions; + + public RecipeFacade( + IRecipeClient recipeClient, + IOptions apiOptions, + IOptions webOptions) + { + _recipeClient = recipeClient; + this.apiOptions = apiOptions; + this.webOptions = webOptions; + } + + public async Task> GetAllAsync() + { + return (await _recipeClient.RecipeGetAsync("3", "cs")).ToList(); + } + + public async Task GetByIdAsync(Guid id) + { + return await _recipeClient.RecipeGetAsync(id, "3", "cs"); + } + + public async Task InsertAsync(RecipeDetailModel recipeNewModel, string version = null, string culture = null) + { + version ??= apiOptions.Value.Version; + culture ??= webOptions.Value.DefaultCulture; + return await _recipeClient.RecipePostAsync(version, culture, recipeNewModel); + } + + public async Task DeleteAsync(Guid id, string version = null, string culture = null) + { + version ??= apiOptions.Value.Version; + culture ??= webOptions.Value.DefaultCulture; + await _recipeClient.RecipeDeleteAsync(id, version, culture); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Installers/BLWebInstaller.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Installers/BLWebInstaller.cs new file mode 100644 index 00000000..9742f358 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Installers/BLWebInstaller.cs @@ -0,0 +1,26 @@ +using CookBook.BL.Common.Facades; +using CookBook.BL.Web.MVC.Api; +using CookBook.Common.Installers; +using Microsoft.Extensions.DependencyInjection; +using System.Net.Http; +using IngredientClient = CookBook.BL.Web.MVC.Api.IngredientClient; +using RecipeClient = CookBook.BL.Web.MVC.Api.RecipeClient; + +namespace CookBook.BL.Web.MVC.Installers +{ + public class BLWebInstaller : IInstaller + { + public void Install(IServiceCollection serviceCollection) + { + serviceCollection.AddScoped(); + serviceCollection.AddScoped(); + serviceCollection.AddScoped(); + + serviceCollection.Scan(selector => + selector.FromAssemblyOf() + .AddClasses(classes => classes.AssignableTo(typeof(IAppFacade))) + .AsSelf() + .WithTransientLifetime()); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/ApiOptions.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/ApiOptions.cs new file mode 100644 index 00000000..ec058ac0 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/ApiOptions.cs @@ -0,0 +1,8 @@ +namespace CookBook.BL.Web.MVC.Options +{ + public class ApiOptions + { + public string BaseUrl { get; set; } + public string Version { get; set; } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/WebOptions.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/WebOptions.cs new file mode 100644 index 00000000..d762a31d --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.BL.Web.MVC/Options/WebOptions.cs @@ -0,0 +1,7 @@ +namespace CookBook.BL.Web.MVC.Options +{ + public class WebOptions + { + public string DefaultCulture { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/CookBook.Common.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/CookBook.Common.csproj new file mode 100644 index 00000000..46baa6d5 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/CookBook.Common.csproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Extensions/ServiceCollectionExtensions.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 00000000..a35cd77a --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,15 @@ +using CookBook.Common.Installers; +using Microsoft.Extensions.DependencyInjection; + +namespace CookBook.Common.Extensions +{ + public static class ServiceCollectionExtensions + { + public static void AddInstaller(this IServiceCollection serviceCollection) + where TInstaller : IInstaller, new() + { + var installer = new TInstaller(); + installer.Install(serviceCollection); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Installers/IInstaller.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Installers/IInstaller.cs new file mode 100644 index 00000000..9ec43234 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Common/Installers/IInstaller.cs @@ -0,0 +1,9 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace CookBook.Common.Installers +{ + public interface IInstaller + { + void Install(IServiceCollection serviceCollection); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj new file mode 100644 index 00000000..c2c01d23 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj @@ -0,0 +1,17 @@ + + + + netstandard2.0 + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj.DotSettings b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj.DotSettings new file mode 100644 index 00000000..f699b85d --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/CookBook.DAL.csproj.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/EntityBase.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/EntityBase.cs new file mode 100644 index 00000000..f00f9365 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/EntityBase.cs @@ -0,0 +1,9 @@ +using System; + +namespace CookBook.DAL.Entities +{ + public abstract class EntityBase : IEntity + { + public Guid Id { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientAmountEntity.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientAmountEntity.cs new file mode 100644 index 00000000..5b64e38c --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientAmountEntity.cs @@ -0,0 +1,26 @@ +using AutoMapper; +using System; +using CookBook.Models; + +namespace CookBook.DAL.Entities +{ + public class IngredientAmountEntity : EntityBase + { + public double Amount { get; set; } + public Unit Unit { get; set; } + + public Guid RecipeId { get; set; } + public RecipeEntity Recipe { get; set; } + + public Guid IngredientId { get; set; } + public IngredientEntity Ingredient { get; set; } + } + + public class IngredientAmountEntityMapperProfile : Profile + { + public IngredientAmountEntityMapperProfile() + { + CreateMap(); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientEntity.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientEntity.cs new file mode 100644 index 00000000..d7af28c0 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/IngredientEntity.cs @@ -0,0 +1,18 @@ +using AutoMapper; + +namespace CookBook.DAL.Entities +{ + public class IngredientEntity : EntityBase + { + public string Name { get; set; } + public string Description { get; set; } + } + + public class IngredientEntityMapperProfile : Profile + { + public IngredientEntityMapperProfile() + { + CreateMap(); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/Interfaces/IEntity.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/Interfaces/IEntity.cs new file mode 100644 index 00000000..b50ec337 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/Interfaces/IEntity.cs @@ -0,0 +1,9 @@ +using System; + +namespace CookBook.DAL.Entities +{ + public interface IEntity + { + Guid Id { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/RecipeEntity.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/RecipeEntity.cs new file mode 100644 index 00000000..81fb05ea --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Entities/RecipeEntity.cs @@ -0,0 +1,24 @@ +using AutoMapper; +using System; +using System.Collections.Generic; +using CookBook.Models; + +namespace CookBook.DAL.Entities +{ + public class RecipeEntity : EntityBase + { + public string Name { get; set; } + public string Description { get; set; } + public TimeSpan Duration { get; set; } + public FoodType FoodType { get; set; } + public ICollection IngredientAmounts { get; set; } = new List(); + } + + public class RecipeEntityMapperProfile : Profile + { + public RecipeEntityMapperProfile() + { + CreateMap(); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Installers/DALInstaller.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Installers/DALInstaller.cs new file mode 100644 index 00000000..39ece8d4 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Installers/DALInstaller.cs @@ -0,0 +1,22 @@ +using CookBook.Common.Installers; +using CookBook.DAL.Repositories; +using Microsoft.Extensions.DependencyInjection; + +namespace CookBook.DAL.Installers +{ + public class DALInstaller : IInstaller + { + public void Install(IServiceCollection serviceCollection) + { + serviceCollection.Scan(selector => + selector.FromCallingAssembly() + .AddClasses(classes => classes.AssignableTo(typeof(IAppRepository<>))) + .AsSelfWithInterfaces() + .WithTransientLifetime() + .AddClasses(classes => classes.AssignableTo()) + .AsSelf() + .WithSingletonLifetime() + ); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientAmountRepository.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientAmountRepository.cs new file mode 100644 index 00000000..9eab3ab7 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientAmountRepository.cs @@ -0,0 +1,66 @@ +using AutoMapper; +using CookBook.DAL.Entities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CookBook.DAL.Repositories +{ + public class IngredientAmountRepository : IAppRepository + { + private readonly IList ingredientAmounts; + private readonly IMapper mapper; + + public IngredientAmountRepository( + Storage storage, + IMapper mapper) + { + ingredientAmounts = storage.IngredientAmounts; + this.mapper = mapper; + } + + public IList GetAll() + { + return ingredientAmounts; + } + + public IList GetByRecipeId(Guid recipeId) + { + return ingredientAmounts.Where(ingredientAmount => ingredientAmount.RecipeId == recipeId).ToList(); + } + + public IngredientAmountEntity GetByRecipeIdAndIngredientId(Guid recipeId, Guid ingredientId) + { + return ingredientAmounts.SingleOrDefault(ingredientAmount => ingredientAmount.RecipeId == recipeId && ingredientAmount.IngredientId == ingredientId); + } + + public IngredientAmountEntity GetById(Guid id) + { + return ingredientAmounts.SingleOrDefault(ingredientAmount => ingredientAmount.Id == id); + } + + public Guid Insert(IngredientAmountEntity ingredientAmount) + { + ingredientAmount.Id = Guid.NewGuid(); + ingredientAmounts.Add(ingredientAmount); + return ingredientAmount.Id; + } + + public Guid? Update(IngredientAmountEntity ingredientAmoungUpdated) + { + var ingredientAmountExisting = ingredientAmounts.SingleOrDefault(ingredientAmountInStorage => ingredientAmountInStorage.Id == ingredientAmoungUpdated.Id); + if (ingredientAmountExisting != null) + { + mapper.Map(ingredientAmoungUpdated, ingredientAmountExisting); + } + + return ingredientAmountExisting?.Id; + } + + public void Remove(Guid id) + { + var ingredientAmountToRemove = ingredientAmounts.Single(ingredientAmount => ingredientAmount.Id.Equals(id)); + ingredientAmounts.Remove(ingredientAmountToRemove); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientRepository.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientRepository.cs new file mode 100644 index 00000000..f8c60cdc --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/IngredientRepository.cs @@ -0,0 +1,56 @@ +using AutoMapper; +using CookBook.DAL.Entities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CookBook.DAL.Repositories +{ + public class IngredientRepository : IAppRepository + { + private readonly IList ingredients; + private readonly IMapper mapper; + + public IngredientRepository( + Storage storage, + IMapper mapper) + { + ingredients = storage.Ingredients; + this.mapper = mapper; + } + + public IList GetAll() + { + return ingredients; + } + + public IngredientEntity GetById(Guid id) + { + return ingredients.SingleOrDefault(entity => entity.Id == id); + } + + public Guid Insert(IngredientEntity ingredient) + { + ingredient.Id = Guid.NewGuid(); + ingredients.Add(ingredient); + return ingredient.Id; + } + + public Guid? Update(IngredientEntity ingredientUpdated) + { + var ingredientExisting = ingredients.SingleOrDefault(ingredientInStorage => ingredientInStorage.Id == ingredientUpdated.Id); + if (ingredientExisting != null) + { + mapper.Map(ingredientUpdated, ingredientExisting); + } + + return ingredientExisting?.Id; + } + + public void Remove(Guid id) + { + var ingredientToRemove = ingredients.Single(ingredient => ingredient.Id.Equals(id)); + ingredients.Remove(ingredientToRemove); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/Interfaces/IAppRepository.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/Interfaces/IAppRepository.cs new file mode 100644 index 00000000..4227f611 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/Interfaces/IAppRepository.cs @@ -0,0 +1,16 @@ +using CookBook.DAL.Entities; +using System; +using System.Collections.Generic; + +namespace CookBook.DAL.Repositories +{ + public interface IAppRepository + where TEntity : IEntity + { + IList GetAll(); + TEntity GetById(Guid id); + Guid Insert(TEntity entity); + Guid? Update(TEntity entity); + void Remove(Guid id); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/RecipeRepository.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/RecipeRepository.cs new file mode 100644 index 00000000..6f79708b --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Repositories/RecipeRepository.cs @@ -0,0 +1,56 @@ +using AutoMapper; +using CookBook.DAL.Entities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CookBook.DAL.Repositories +{ + public class RecipeRepository : IAppRepository + { + private readonly IList recipes; + private readonly IMapper mapper; + + public RecipeRepository( + Storage storage, + IMapper mapper) + { + this.recipes = storage.Recipes; + this.mapper = mapper; + } + + public IList GetAll() + { + return recipes; + } + + public RecipeEntity GetById(Guid id) + { + return recipes.SingleOrDefault(recipe => recipe.Id == id); + } + + public Guid Insert(RecipeEntity recipe) + { + recipe.Id = Guid.NewGuid(); + recipes.Add(recipe); + return recipe.Id; + } + + public Guid? Update(RecipeEntity recipeUpdated) + { + var recipeExisting = recipes.SingleOrDefault(recipe => recipe.Id == recipeUpdated.Id); + if (recipeExisting != null) + { + mapper.Map(recipeUpdated, recipeExisting); + } + + return recipeExisting?.Id; + } + + public void Remove(Guid id) + { + var recipeToRemove = recipes.Single(recipe => recipe.Id.Equals(id)); + recipes.Remove(recipeToRemove); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Storage.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Storage.cs new file mode 100644 index 00000000..62589413 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.DAL/Storage.cs @@ -0,0 +1,87 @@ +using CookBook.DAL.Entities; +using CookBook.Models; +using System; +using System.Collections.Generic; + +namespace CookBook.DAL +{ + public class Storage + { + private readonly IList ingredientGuids = new List + { + new Guid("df935095-8709-4040-a2bb-b6f97cb416dc"), + new Guid("23b3902d-7d4f-4213-9cf0-112348f56238") + }; + + private readonly IList ingredientAmountGuids = new List + { + new Guid("0d4fa150-ad80-4d46-a511-4c666166ec5e"), + new Guid("87833e66-05ba-4d6b-900b-fe5ace88dbd8") + }; + + private readonly IList recipeGuids = new List + { + new Guid("fabde0cd-eefe-443f-baf6-3d96cc2cbf2e") + }; + + public IList Ingredients { get; } = new List(); + public IList IngredientAmounts { get; } = new List(); + public IList Recipes { get; } = new List(); + + public Storage() + { + SeedIngredients(); + SeedIngredientAmounts(); + SeedRecipes(); + } + + private void SeedIngredients() + { + Ingredients.Add(new IngredientEntity + { + Id = ingredientGuids[0], + Name = "Vejce", + Description = "Popis vajec" + }); + Ingredients.Add(new IngredientEntity + { + Id = ingredientGuids[1], + Name = "Cibule", + Description = "Popis cibule" + }); + } + + private void SeedIngredientAmounts() + { + IngredientAmounts.Add(new IngredientAmountEntity + { + Id = ingredientAmountGuids[0], + Amount = 4.0, + Unit = Unit.Pieces, + IngredientId = ingredientGuids[0], + RecipeId = recipeGuids[0] + }); + + IngredientAmounts.Add(new IngredientAmountEntity + { + Id = ingredientAmountGuids[1], + Amount = 1.0, + Unit = Unit.Pieces, + IngredientId = ingredientGuids[1], + RecipeId = recipeGuids[0] + }); + } + + private void SeedRecipes() + { + Recipes.Add(new RecipeEntity + { + Id = recipeGuids[0], + Name = "Míchaná vejce", + Description = "Popis míchaných vajec", + Duration = TimeSpan.FromMinutes(15), + FoodType = FoodType.MainDish + }); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/CookBook.Localization.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/CookBook.Localization.csproj new file mode 100644 index 00000000..bbfb9b92 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/CookBook.Localization.csproj @@ -0,0 +1,40 @@ + + + + netstandard2.0 + + + + + IngredientControllerResources.resx + True + True + + + IngredientNewModelResources.resx + True + True + + + RecipeNewModelResources.resx + True + True + + + + + + IngredientControllerResources.Designer.cs + PublicResXFileCodeGenerator + + + IngredientNewModelResources.Designer.cs + PublicResXFileCodeGenerator + + + RecipeNewModelResources.Designer.cs + PublicResXFileCodeGenerator + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.Designer.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.Designer.cs new file mode 100644 index 00000000..32c8b364 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CookBook.Localization.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class IngredientControllerResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal IngredientControllerResources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CookBook.Localization.Resources.IngredientControllerResources", typeof(IngredientControllerResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string GetById_NotFound { + get { + return ResourceManager.GetString("GetById_NotFound", resourceCulture); + } + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.cs.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.cs.resx new file mode 100644 index 00000000..2a4a9272 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.cs.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ingredience s id '{0}' nebyla nalezena + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.en.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.en.resx new file mode 100644 index 00000000..81de2254 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.en.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ingredient with id '{0}' was not found + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.resx new file mode 100644 index 00000000..36e44183 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientControllerResources.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.Designer.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.Designer.cs new file mode 100644 index 00000000..c80e6f64 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.Designer.cs @@ -0,0 +1,99 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CookBook.Localization.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class IngredientNewModelResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal IngredientNewModelResources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CookBook.Localization.Resources.IngredientNewModelResources", typeof(IngredientNewModelResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Description_MinLength { + get { + return ResourceManager.GetString("Description_MinLength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Description_Required { + get { + return ResourceManager.GetString("Description_Required", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Name_Required { + get { + return ResourceManager.GetString("Name_Required", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Name_StringLength { + get { + return ResourceManager.GetString("Name_StringLength", resourceCulture); + } + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.cs.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.cs.resx new file mode 100644 index 00000000..7902a4a2 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.cs.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Délka popisu ingredience musí být alespoň 10 znaků + + + Popis ingredience je povinný + + + Jméno ingredience je povinné + + + Délka jména ingredience musí být mezi 3 a 100 znaky + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.en.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.en.resx new file mode 100644 index 00000000..e001309a --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ingredient description length must be at least 10 characters + + + Ingredient description is required + + + Ingredient name is required + + + Ingredient name length must be between 3 and 100 characters + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.resx new file mode 100644 index 00000000..a77ba302 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/IngredientNewModelResources.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.Designer.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.Designer.cs new file mode 100644 index 00000000..b3e85070 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.Designer.cs @@ -0,0 +1,126 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CookBook.Localization.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class RecipeNewModelResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal RecipeNewModelResources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CookBook.Localization.Resources.RecipeNewModelResources", typeof(RecipeNewModelResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Description_ValidationMessage { + get { + return ResourceManager.GetString("Description_ValidationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Duration_ValidationMessage { + get { + return ResourceManager.GetString("Duration_ValidationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string FoodType_ValidationMessage { + get { + return ResourceManager.GetString("FoodType_ValidationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Ingredients_Amount_ValidationMessage { + get { + return ResourceManager.GetString("Ingredients_Amount_ValidationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Ingredients_Unit_ValidationMessage { + get { + return ResourceManager.GetString("Ingredients_Unit_ValidationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Ingredients_ValidationMessage { + get { + return ResourceManager.GetString("Ingredients_ValidationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + public static string Name_ValidationMessage { + get { + return ResourceManager.GetString("Name_ValidationMessage", resourceCulture); + } + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.cs.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.cs.resx new file mode 100644 index 00000000..69fc7e98 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.cs.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Popis recept musí mít délku nejméně {0} znaků + + + Délka trvání receptu musí být alespoň {0} minut + + + Musíte vybrat typ receptu jiný než '{0}' + + + Množství ingredience musí být více než {0} + + + Recept musí obsahovat nějaké ingredience + + + Název receptu musí mít délku nejméně {0} znaků + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.en.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.en.resx new file mode 100644 index 00000000..bcfa95fd --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.en.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Recipe description must be at least {0} characters long + + + Recipe duration must be at least {0} minutes + + + Choose different food type than '{0}' + + + Ingredient amount must be more than {0} + + + Recipe must contain some ingredients + + + Recipe name must be at least {0} characters long + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.resx b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.resx new file mode 100644 index 00000000..c8e8f5a7 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Localization/Resources/RecipeNewModelResources.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj new file mode 100644 index 00000000..3c4ba334 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj @@ -0,0 +1,17 @@ + + + + netstandard2.0 + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj.DotSettings b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj.DotSettings new file mode 100644 index 00000000..0bea2c16 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/CookBook.Models.csproj.DotSettings @@ -0,0 +1,4 @@ + + True + True + True \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/FoodType.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/FoodType.cs new file mode 100644 index 00000000..0ff01f94 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/FoodType.cs @@ -0,0 +1,16 @@ +using System.ComponentModel; + +namespace CookBook.Models +{ + public enum FoodType + { + [Description("Neznámý")] + Unknown = 0, + [Description("Hlavní chod")] + MainDish = 1, + [Description("Polévka")] + Soup = 2, + [Description("Dezert")] + Dessert = 3 + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/Unit.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/Unit.cs new file mode 100644 index 00000000..d358947f --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Enums/Unit.cs @@ -0,0 +1,22 @@ +using System.ComponentModel; + +namespace CookBook.Models +{ + public enum Unit + { + [Description("neznámý")] + Unknown = 0, + [Description("kg")] + Kg = 1, + [Description("l")] + L = 2, + [Description("ml")] + Ml = 3, + [Description("g")] + G = 4, + [Description("kusy")] + Pieces = 5, + [Description("lžíce")] + Spoon = 6 + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientDetailModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientDetailModel.cs new file mode 100644 index 00000000..6164b840 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientDetailModel.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace CookBook.Models +{ + public class IngredientDetailModel + { + public Guid Id { get; set; } + [Required] + public string Name { get; set; } + + [Required] + [MinLength(10)] + public string Description { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientListModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientListModel.cs new file mode 100644 index 00000000..e0c23033 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Ingredient/IngredientListModel.cs @@ -0,0 +1,10 @@ +using System; + +namespace CookBook.Models +{ + public class IngredientListModel + { + public Guid Id { get; set; } + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeDetailModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeDetailModel.cs new file mode 100644 index 00000000..8cc2e906 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeDetailModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace CookBook.Models +{ + public class RecipeDetailModel + { + public Guid Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public TimeSpan Duration { get; set; } + public FoodType FoodType { get; set; } + public IList Ingredients { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListIngredientModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListIngredientModel.cs new file mode 100644 index 00000000..be79a71f --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListIngredientModel.cs @@ -0,0 +1,13 @@ +using EnumsNET; +using System; + +namespace CookBook.Models +{ + public class RecipeListIngredientModel + { + public IngredientListModel Ingredient { get; set; } + public double Amount { get; set; } + public Unit Unit { get; set; } + public string UnitText => Unit.AsString(EnumFormat.Description); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListModel.cs new file mode 100644 index 00000000..c123eb35 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Models/Recipe/RecipeListModel.cs @@ -0,0 +1,14 @@ +using System; +using EnumsNET; + +namespace CookBook.Models +{ + public class RecipeListModel + { + public Guid Id { get; set; } + public string Name { get; set; } + public TimeSpan Duration { get; set; } + public FoodType FoodType { get; set; } + public string FoodTypeText => FoodType.AsString(EnumFormat.Description); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/App.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/App.razor new file mode 100644 index 00000000..0b560039 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/App.razor @@ -0,0 +1,12 @@ + + + + + + +
+ Sorry, there's nothing at this address. +
+
+
+
diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Components/IngredientForm.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Components/IngredientForm.razor new file mode 100644 index 00000000..d7bb49f4 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Components/IngredientForm.razor @@ -0,0 +1,77 @@ +@using CookBook.Models +@inherits CookBook.Web.Blazor.Pages.PageBase + + + + +
+ +
+ +
+ +
+ + + @if (Id != Guid.Empty) + { + + } +
+ + +@code { + [Parameter] + public Guid Id { get; set; } + + [Parameter] + public EventCallback OnModification { get; set; } + + public IngredientDetailModel Data { get; set; } + + [Inject] + protected IIngredientsFacade IngredientsFacade { get; set; } + + protected override async Task OnInitializedAsync() + { + if (Id == Guid.Empty) + { + Data = new IngredientDetailModel(); + } + else + { + Data = await IngredientsFacade.IngredientGetAsync(Id, Culture); + } + + await base.OnInitializedAsync(); + } + + public async Task Save() + { + var resultId = await IngredientsFacade.SaveAsync(Data,Culture); + if (OnModification.HasDelegate) + { + await OnModification.InvokeAsync(resultId); + } + Data=new IngredientDetailModel(); + } + + public async Task Delete() + { + await IngredientsFacade.DeleteAsync(Id,Culture); + + if (OnModification.HasDelegate) + { + await OnModification.InvokeAsync(null); + } + } + +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/CookBook.Web.Blazor.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/CookBook.Web.Blazor.csproj new file mode 100644 index 00000000..380fa01b --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/CookBook.Web.Blazor.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.1 + 3.0 + + + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/Index.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/Index.razor new file mode 100644 index 00000000..6f0f44e3 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/Index.razor @@ -0,0 +1,14 @@ +@page "/" + + +
+

Hello, world!

+
+

+ At this project you can make your own recipes, so don't hesitate and show the world, what you can cook! +

+ + Go to Recipes list + + +
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientEdit.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientEdit.razor new file mode 100644 index 00000000..f5a1ae12 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientEdit.razor @@ -0,0 +1,19 @@ +@page "/{Culture}/ingredients/create" +@page "/{Culture}/ingredients/{Id:guid}" +@inherits CookBook.Web.Blazor.Pages.PageBase + +

Ingredient

+ + +@code { + [Inject] + public NavigationManager NavigationManager { get; set; } + + [Parameter] + public Guid Id { get; set; } + + public void GoToList() + { + NavigationManager.NavigateTo($"/{Culture}/ingredients"); + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientList.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientList.razor new file mode 100644 index 00000000..2c03c1f8 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/IngredientList.razor @@ -0,0 +1,50 @@ +@page "/{Culture}/ingredients" +@layout ListLayout +@inherits PageBase + +

Ingredients

+ +
+
+ +
+
+ + + + + + + + @foreach (var ingredient in Ingredients) + { + + + + } + +
Name
+ @ingredient.Name +
+
+
+ +@code { + [Inject] + private IIngredientsFacade ingredientsFacade { get; set; } + + private IList Ingredients { get; set; } = new List(); + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + await LoadData(); + } + + public async Task LoadData() + { + Ingredients = await ingredientsFacade.IngredientsGetAsync(Culture); + } + +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/PageBase.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/PageBase.cs new file mode 100644 index 00000000..3afe92aa --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/PageBase.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Components; + +namespace CookBook.Web.Blazor.Pages +{ + public class PageBase : ComponentBase + { + [Parameter] + public string Culture { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeEdit.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeEdit.razor new file mode 100644 index 00000000..f96af412 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeEdit.razor @@ -0,0 +1,182 @@ +@page "/{Culture}/recipe/create" +@page "/{Culture}/recipe/{Id:guid}" +@inherits CookBook.Web.Blazor.Pages.PageBase + + + + + +

Edit Recipe

+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
:
+ +
+ + + +
+ +
+ +
+
+
+
+

Ingredients:

+
    + @foreach (var ingredient in Data.Ingredients) + { +
  • + @ingredient.Ingredient?.Name @ingredient.Amount @ingredient.UnitText + +
  • + } +
+ +

Add new ingredient:

+
+
+ + @foreach (var ingredient in Ingredients) + { + + } + +
+ + + @foreach (var unit in Enum.GetValues(typeof(Unit))) + { + + } + +
+ +
+
+ + + + +
+
+
+ + + +
+
+ + @if (Id != Guid.Empty) + { + + } +
+ +
+@code { + [Parameter] + public Guid Id { get; set; } + + public RecipeDetailModel Data { get; set; } + [Inject] + public NavigationManager NavigationManager { get; set; } + [Inject] + protected IRecipesFacade RecipesFacade { get; set; } + + [Inject] + protected IIngredientsFacade IngredientFacade { get; set; } + + public ICollection Ingredients { get; set; } = new List(); + + public int DurationHour { + get => (int) Data.Duration.Hours; + set => Data.Duration = new TimeSpan(value, DurationMinutes, 0); + } + public int DurationMinutes { + get => (int) Data.Duration.Minutes; + set => Data.Duration = new TimeSpan(DurationHour,value,0); + } + + public RecipeListIngredientModel NewIngredientModel { get; set; } = new RecipeListIngredientModel(); + + protected override async Task OnInitializedAsync() + { + if (Id == Guid.Empty) + { + Data = new RecipeDetailModel(); + } + else + { + Data = await RecipesFacade.RecipeGetAsync(Id, Culture); + } + + Ingredients = await IngredientFacade.IngredientsGetAsync(Culture); + await base.OnInitializedAsync(); + } + + + public async Task Save() + { + await RecipesFacade.SaveAsync(Data, Culture); + NavigationManager.NavigateTo($"{Culture}/recipes"); + + } + + public async Task Delete() + { + await RecipesFacade.DeleteAsync(Id, Culture); + NavigationManager.NavigateTo($"{Culture}/recipes"); + } + + public void DeleteIngredient(RecipeListIngredientModel ingredient) + { + var ingredientIndex = Data.Ingredients.IndexOf(ingredient); + Data.Ingredients.RemoveAt(ingredientIndex); + } + + public void AddIngredient() + { + Data.Ingredients.Add(NewIngredientModel); + NewIngredientModel = new RecipeListIngredientModel(); + } + +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeList.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeList.razor new file mode 100644 index 00000000..5b120ef7 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Pages/RecipeList.razor @@ -0,0 +1,41 @@ +@page "/{Culture}/recipes" +@layout ListLayout +@inherits PageBase + +

Recipes

+ + + + + + + + + + @foreach (var recipe in Recipes) + { + + + + + } + +
NameFood type
@recipe.Name@recipe.FoodTypeText
+ +
+ Create new recipe +
+ +@code { + [Inject] + private IRecipesFacade recipesFacade { get; set; } + + private IList Recipes { get; set; } = new List(); + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + Recipes = await recipesFacade.RecipesGetAsync(Culture); + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Program.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Program.cs new file mode 100644 index 00000000..05f82445 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Program.cs @@ -0,0 +1,25 @@ +using CookBook.BL.Web.Blazor.Installers; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Net.Http; +using System.Threading.Tasks; + +namespace CookBook.Web.Blazor +{ + public class Program + { + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("app"); + + builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); + + var blWebBlazorInstaller = new BLWebBlazorInstaller(); + blWebBlazorInstaller.Install(builder.Services); + + await builder.Build().RunAsync(); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Properties/launchSettings.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Properties/launchSettings.json new file mode 100644 index 00000000..44a6fc82 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60802", + "sslPort": 44380 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" + }, + "CookBook.Web.Blazor": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5002;http://localhost:5003", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/ListLayout.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/ListLayout.razor new file mode 100644 index 00000000..3c328cf0 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/ListLayout.razor @@ -0,0 +1,6 @@ +@inherits LayoutComponentBase +@layout MainLayout + +
+ @Body +
diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/MainLayout.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/MainLayout.razor new file mode 100644 index 00000000..c5968fa8 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/MainLayout.razor @@ -0,0 +1,7 @@ +@inherits LayoutComponentBase + + + +
+ @Body +
diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/NavMenu.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/NavMenu.razor new file mode 100644 index 00000000..f21f086b --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/Shared/NavMenu.razor @@ -0,0 +1,30 @@ + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/_Imports.razor b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/_Imports.razor new file mode 100644 index 00000000..ef49680f --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/_Imports.razor @@ -0,0 +1,12 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using CookBook.BL.Web.Blazor.Facades +@using CookBook.Models +@using CookBook.Web.Blazor +@using CookBook.Web.Blazor.Shared +@using CookBook.Web.Blazor.Components diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/images/cook-book.svg b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/images/cook-book.svg new file mode 100644 index 00000000..d2dd47c2 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/images/cook-book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/images/icon-144x144.png b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/images/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7dba042197e5bb2213c290f0e21e3fd9fa239f GIT binary patch literal 30273 zcmcG#byQVP^f)?~7AYkqBt!%RX^?I~q(Lc>P`Z(nx**+(k`mG>2-0-{N$GBo?(Vwp zTtDCU-|wyUd&OO>bIzQZz4z?dJ!e8xmF4hpDRBV+_|N5K)B!+)ZqWb^7IZms8@_-p zSjI2pWB?NNORLX`0l@j>xs0Ty+vHZgRy64<i7;Tm9tNNW zIsl#kfC04t1SWt(EdW#jKm@e_Kn?&j2o21m0STxDfY$&(LvR56_WwSRe?6hG|6zea zR}^pz=!${~Vfo(&_5Te$aG&4*Ct{uKjTS1MecxlY-9u+KE2M7hO{Zn-FV}}*bM@b3 zcVD+PS8|xp)3O^$PKgmMH6D9Odh5-a%_hweFV!wzH~NU$7wn%7q=ta20arN*zrayT>kVoyoV)48>rCeu@SLV~mp&slO-INz8? zNA!0;P?8n-mQrI^ZWv3F?iy$oJbSM?waEEG9tKHmT3Sr!v)E3RmM?mE)7d-ZUv(BZ z$~aRVDXmDTcDyf16gvX&zG2%vh*h7R~XAT+_c>J4IoU;fjY6W(hL)_6W4B zN1k<`$+6gd|0aDReE2k7ie*XS`+2|*O-}_R{};;M%A7TQ>0Rp3C;9dLLzg|16;I#1Y_U_~NDtmlZT+NQKe^ z8O2GO$G*h0uo%?DY5$Hi5%DV3&0PtU%&$~W71C#JkMKDiWR7#q%+)uBWwBHY3a!)iK)`~9T?`jBRwd8`b9N{sBjJ8^LQg!uBaJhTUR*8fzKEqh_? z(KR61>&#FJ^&!xd&~_kVLCeYu&*}PnZcn{*w0y`m;EA!33s8#Oz06Qut=h^J(7Tr& zZ5Ik>B2(7{E3CU6Is_am(!mBh7Jh{Ot|@mBl&HC9Rz5u~!yg- zAVo46;XTnc_$tsHHtRd=OFy=H3+hZ%?w4u`FYt;F*6`=8q*UQzrgYkxzWpJ^vl66# zHQ+E*ywgz>15iEb*{Vm!ZT+$J17tt$-gc%kfB0*c`3-Bd>}86OtW5w3X|(iTI%v%e zkNs#i#^kgI-J28MDUbr#^9Sa?hOsPo9wkV0WT55M;f#H<$H&G5+9#hE=-DP;2gQAf z@dM&t)n!0|b}RldRVvHXrQ@rr?BhiYIAp&{F@UArchWRB!|&Di%|pS6Arh{n_6vhR z18!litae57cw8Lcm;{VOHLe!z&Z!+@AvIVP9#S| zv2cw_=W7qI)a1WQ@)xpY>kt{|OwXqQ;QOTWj4Pe|Zh>?3n^(HS*f@P;FF$0&(cUe1 z51$<|mc^J)QzihzEh-xsh1F=eL%_YC^ zCE@%{Q$_8~f;Hvv^*KTsu z-y`rxc+N3;Yf4e3nvKM+KYgZ8=@aYt@^tw z6CLC1ex3VJbG`dEH@CMjJ{lRUGKz<}{aR=}-2Jcijh!mXB_^wit+9@{o#At>v7c*t zRyt>18R>S#CLvd2r9P7gR^^`L3xR`GtAO{-Gjg=u{yRE?l-I3o4VfCkQ>8wF+FG8M z-+r`hr)NJovfJi+03QvhS!)QH9KY#oJG(RbwN3uYhj6GkVk7;-+G%u6 zsmO+&fha%4Rj~!@{p7I~13{ztK2we6{U{-0@wsvGll?9(F#{j6-4X%PmN5H2Y!u8G z*e?Zv=E24y#-mj3l|BPiwaYR5%x|+J>h{OEZ&uyah7v9^Z3l^jo|-L04w@@TxayU@ zu))NR45t;d2^K8*DPZ0{_?)lLH;35qFZsc1(btYH55nrJBi-GKj0qWD#lJekT{&@l z_#WxZ;&C4G!8el7J27Is(v*35tDU`7pm*&E=4078oTC@hwh}&lCowmSYOUL;c*y@4 z-?MxzI^+$xIrgFfYhTSzRzexbM9R}1F$W7*RX;-9V!#{@kxGHwlpyFY`D9MIdj7G3 zBUwSHI-{uV*v~Y#yH>x))GpFgFFj|HSRc>5k%n7lOHZ_L_?IsSvVq6K7M|QAjtq*} zaz`lKi9jle9_TcQ5PH+qcHHhujWWGmAySY2as1`_Ljs@3H~R~MtX)(^5j)N6c$!=b#@lV7~grbl`z zaul1!i-xS_Hk>>Ld8FH-QU(0Cbh*A~OT9iIc$(YHu}uDPpL(fbL^@zhdCj3KjsPn$ z!*1hqkn}veF_u?_xFW|bT_XDQ}t_(KmqxjvZFC`XYZZ69-F;#3_3wfN$ zu%0wryg*CL^Mj%+3@uW3eg_Exn5OGFFW{>2sVi#|-nDVrg$ z-1U7v$?+&^HL##1YEvAq*TAZKg*hr6S~-`md$`sfH~g9SJGF8T=}GhVlkek(6-oHi z#KTu|z1$q$6Jr`%qMT{?rq`2n@x|0b7_G3LVH0|@5>(p5xXm6Z{HwZ_ekqYGz_Ux; zAjN}c1oy1N8cxz@r&q6|`hH9Lq&eJ09QRbu^2%;=@Wl{|uiR|iOVw*3 z(|l?8iHt+3927soZ{rASm~KefZ7venZSPN@0YsJ~z?muctXpe)KI2bcMQECDJ%Aw_ zI^B_H9{nbLB2~BHoNXk0NIdz+u>f9q$r>Z*W7T{U zmW96K|AYXjq_F9^l}$D95l1+j3S&DpS<^3K17`zX(e8`wJXBmP9qT_vOw zTE|Mby{Ik3+A9hK~TxlZk41>a~=HffpeKlGV@ckA~hFYjNjXD z8rIT@zn|@%9y94(6U^MD1#7!?Z_{}Y+nW!4f-aKo-gnY5z5?LbJe%Dj{c0bR9bXb1 z%zu6eWV}jE)1ItZ@>zu?1l-ZhaBB-H;~b6Y(YAxVz0L~9*K~Zz!=L$gkegqdM`ff9 zIos}IU_g(2FBtA@w%7O|;b){~4Gcf--V}ay z_}VCK(uRC;)gZN)N}N*0*6z9M>87E-r)0B~vxx-*Rn&ywYB|N;$;!;NZBdA#ij<*j zr)Tk5uK~Zbki$cS5o^D;nPayQTxXT||0v@LB}vbJFP;vtrcR8;X z;+ferN5l{U5LXX_<6hp4@);i0njgS;P^s!9ltbQ{hQX03Yw$|MvR|v)KsDjYL%!s) zZzgt0{gE}JlP06#>Vc~i;tyONy4DZA9$T+xQr>|15ZXWC7&{b`3U}k%pqYt>_7Et<7Pki z8@W^Nt_>TW#tjO;Q72j0>g4k_aH%8YRb@86{LCVkg+3bymt)G`&olPnBF>3MN&!{J z4e6K}5axm=Q-lt*-(9UgTcrKm!ox34sb%ADrywq0Rr+*!I^~tYr`7ieNf>AjNe!oc z@S%w7=IPt`R7EXijx2#Us>^M0G0B$Lxz3#1Q!11+11ls->u~n~-|UNhrR9Ak=X>!N zhuIBc05Lu7ouW8D87@zqg~yD`thOp~pe3x=8j6FEOuh#ya73^4uQ4fxtn?$rWfP|} zzNE)#XyxngsK{N!1adYYn{J5qc6R`PHf!5u!mj?4}K;EdX%($Th>;#+#Xq>m{Vm^x5&P zP}zHU%;iZ@qDAm!S!LzbIaM1WC`qp`ZhU>s@lY6!P)%?Zw!25|$P1=%bO}K8+pNaH z4NDo8;Uey53o`O|x*<>dRqX7IRqqYtR~29gyD9Zo+xyZ!cCBF(uJ^63o{HnrN3`C&xgAam46~U@g5vt?1ksj@T?yq?>DE3-F4n&M0IF6hztPmx zcN+sv&ssBcRpM#BIXDa$2i%11TPN^nA)XPX^?VE%Q`x+(pqO&}n}*wndm|(?u6JTw z(~f(H4d_no%GYEWC3WHIXidU#N(wOWq*&!DF%Ci@6$lwa7^w#!eNR4K<_I-2U*rLy1v*xqc0z?WZQ6W z9zQJ%FCGv|)xUnZ(_&14A}P<9Bro|QUN}a!5qV5M=5)g!ey3veitvzEQhR#rZ8jbS zFx>o{N-ZLsF8YzQqJl8CWak$WBj@V`-)pK9aRLjGu-TLaY*6xX%_%G{>^z;krXy9- zz*o+zKQb%k1P#9E8dtW}ZN;-f!3hwf3ys_&Jn3>v3N{ur-&SfmAACU4eAB`j3!dFI z^vT-H9EY@lQ{&5G+l$s_Wnbfg+ZgTmlJ%pCgujNb`b4z_-!gj%S^a<*ZvBNP{K{F| z3$ApDWmz4I@TGA&9tpTQ{V23c&7yn_zzbm*>z>q4)2Xx$7GEfV*gt!qCzOQ-59=FM zanZcgeFw3KDu9wI#HgD#87KC@WooLQrqH6&%Eb>Hj8CRaU!ua~)BQ0gf$d>R=S z;+)jS{D{TT!Em%Mbu0`YXiZltAB|$@S)-T@1AQU->97hL+QNC30Oajn>mXdDQL@S} zQAj}Hz7i+fcZp69nQt~Td(93n`O(443-J@=yJ1~)EI@~r_HDJ~cWj?!sB`uk*&MiL z&drBZ$X(R@id~$5hGX#V2@&wOkLc2RXV$bM31y>;>$es8rIwY zCO8S9VQ|96qYGk*YnD*JKC{-L03BBv>Q9tIOl|=9=>jA9>u!G(s6s_{+W~*yoyFtt zmZ|1B;YMBQvLO^KeH#8`=n3Cr`1#tn5=WhpZf}F?6Z~8dsTD%b)XM7vzzHnZD%`#% zBK7UYTc=xW_DX9~$VG_=xzumnw2-AtqLWG>>$|mf*T)CmbSlvE+73YqJX;~gD{n^lmtJi6wTk`K`MGxyGNnPGlBGHU(q=z%@G42SK}LQlT|zx#N(Bug z`n(p?^GOIa_up^uz68j_TjZEEe_a=TSz zK>7VGv7q$LM^?LyS8nR8kX*>$xz)idMW1pTJBqO4yo`Fa$j?Af6m*P0M*D>Mt|H&7 zy2UKxnupK*G{JKP)BsG_dfUd4WF`i+R;C_fm)R`<)#A}`4Cgx+^5ERi!+h!h{N^qk z-oo(y9C`$d8S7}~wIU=V7(O`DLhponU^dk>?;_>4vkh~?CY5=YLS z9B08I_6J_rj?c@No*rIa&B%4lmDE%kPo4*l4Vm~_QlX8K&05UCZvvG4pHL+>d35xT zaF_=^4r^YpiOE-ovYJG#6y^6DkD%}tfKsoiG~yldv;}Bi1xR%9O4`kC!t|NxezD<3 z+ui})&qoH}=Q-ZcbUP~~%@Tu|2BCZKZk8ea+gP5Tg5rIWpJaw&AeWnR?}rAYcArf% z?Mn~+IWGS|-9Y;`!&)cb=wF;NEFyZhvS&GymO%9-ui^K9U7c(}vgS7pIQ6zk*0cQO>W@c^7LNqA3ygoNrlB5x41 z@}t8UGGHs;E?^*f#sxQ5P~>^bClqp7{0CiLq6sCs*LQ?I0f{>U;04Oawp--$J7vyn zmNu+RU03A3IIBDN;un}?&z_Xi84>pbAt|6%CyI!H?)O<5Xj82cg~3DlVG3uBlOnx5sgky2+T+&2M+bgsLTDZTK=SUNKga0T2RNh&+ZQ2cNQes=_I->;O;0^6RSMx{xG9PH>6DKMEI z{(M~7d7sw$z&3s+$z(t#0*mb(WSQIZ&zlG-t@JM3eChtol_!4Po$GK4 zswfRy6xRNuRjV_#E?T%a{btnNmexwREC`8=(mCwZFT5Ei$QG^o`qH~0fpk}|y|l8} zu#;Ao@cxn4sqEY*6-Kz@x`MtC8iZ0JZ20zO#~W=5LO(MdFL@A4e)vHD8jBOl>bbZ1}Hbec{OK3+XBC`%!H1Fv)#h6NPly}Gf0W79qt&y5){@- zyt+R%!?A8cZuDKF+?WAmp+>y38AvPX(sqvlP+*P=F6N>vy19_U>@Rd?er~%6+z4o3 zTxyS=w9=>TT(Cr3wP78G_+FdfhJY_H0PX)0vp+A?qV3V`YKi|&2Y+dDQL^xkFqZiA zTUMaB@xJe=&aYh>vW0!}+m4OBo+)pPIB2hXr+1KDDYG{LqBZA3R5h;KBDL?AJtR+& zA{GS#08c{My^x~`8DW&4d<#}i0c|nwk z(M{%Ol~In1>sad9QN}6$KfN;NDpVO7SOD<^aH^8GAD!Q@ar_OiFC}n9YH+%7t5s9h zX-Ch0*!@hDAdlx@bYA>Afxj=xSyK+@6aH~8Nr@>UdNf{YOIhI33N>LSK7Cp-Q_J5R zq$4A=b1YPck6!K*__j8zDmEmmj(&_apZPH@7l8(3Fad7Z=~!FoWHX?bq1|zg5v@KB z%U7Bu6RkbGeS3u^h$N*ex9flmA@NcTJ&{<721B#|(H28|94nnfnn4Eg8Rl;?ROki_ zE6hiJ-YAuF`>1b!ic%bXeAGH?6U~Rw;rP_3G8b9IOmQx zEa^2E`ETWMYWhMy&**4aFejNSN!6n!U>ISZ5Sf?W=pt4nXA30eV)EQECu(2e_f@oY zcaVWxW>qqcR=+73*Zz>AXS_a%fra$lgD$XBYB{%mPusvFE#*S zg{MXMG+cc9#i1%|F-hlrEOwRa)nK{Zb>xo_Zhrz>*}cX0ERdBF1QJGGLILXW7npr! zEz!&0+XZ|~jX3P=DLk4eU-*saX+ZP=?Sj}%&`~MLDMsO?W}#+;-gazCA^n zn{;|OX(DtCAQTNA$iVStHcQ z6(%UyRXD4s8TnLL&Gv9b;F}#_`0Z9nQ%z4m zl30At>`%wcy+b7%Xg!Cmyw6^1xgKX`FHc~yXUWMc5jG5s>I>(6N51-CtmU;Im!y~9 zaIUG+Xr@5Un?9@7qze#wxQ?}~A?N)^qO8UlL&C}O>tAMyB8)X`I`awC2uIp)>)-vF zFe}CAix>#@oS!Ea20j{?)ugjq6y{Lq5bHlyF;e8XM;kDjY|4=Gu;r8G;+grP zgwfNx5%*8r+$M}ZeiEU*Y2$XUm(w$;N`FR;66Ubb;t74HtK#u(pZZ3x)@NR+C3#;c z`1PXcgKtiA`-n$9&L1b;>{JYS+!ODaqCvZfWZLt1u7)A@%Duk=CdsXU3B}mad`6qt zB4dh&hn*efZyI?>QlAS_CRkG7d}B@~n*Y$VQ%0J*7Bh*z`ND5pQH~Wg#n(Wd+sKlJ z;hxV}<>f>!Ez&*goTB^lv}+hr;6gNcZmZIWAMxhZ#rg-+{Bkv2B5m%1Mo&#EJ=QcL zK-W$JFK}l8u5kuBAC}(I*Ri|CsMeSYsrygdewcTkjeq_}NmWORGrFez^G_%XAmI)S zjiZ%=a5lX=uO7YqNXCCtDbqMchC|1fJl*N&TI5235$$+dxSjRz#i$p*!+|!149hKm zn9JwbGbX(Ga2j%WJ`=_!e3B4d8^k62O7pi|(j69SmG#)mu}qGqPOjB#ik_LvN)ReI z1E4cGT%ZC|GVw6Z4dk@-Vd_xsoW_6<#sLiu+WJ(i5`l?`U74+fYUm<1hBG6yf-qRq zj#faw7-@m*#q8bClaiZP4T+X2WRr9jRNwoC#2Jepru~TcOrpX+d4vn$h<3O$KbkcZ zMh^3~e&6deP=aJwhtK}Wktq;O3zoRIOOh55coGOKg{c+Xr>$q;X(CX(RE!>&IiRhP z&PnC#cy4>j@d68Nct&zF$ztjO1d>h|q!DizuZ-Ax2HE8JyxBARdEO@r^SmE6$1b7f zn=yq+G0z@N)ba~0xivjp)9A+dE{(dyLY)HwN#kFcPgwxB^X*5qi_aAm1NIfdixl`mj z4v9Q`RyB@EVeP0S+jhQ_9U3BG3JlM-*V3mznfsbv4-4SR68$yuPA{v(&|nt0}`)5Ke2ml({M=nb>VRtFmFyBk%iAjkzfMG z`~=RNk`j&!<&Vxp(dMrQ-x7kfV2A}!bf-u>OpaYz1^2k!8=U4V8M%fE@&FkrY1YG} zr{$wG(Fhu_p8GrwK#f#sN4R3*FM6B=bWf z|5J9OcbqnknG52&IpO>g0KNqz#&N3NwyqhQzWnKvVN(R>MH?R+61St(Oh2azLqFYr z;z!EVj@ifmOj-B3`k1Vv0h0(AHkQ}^qKrSm>p!Z^SEMyMexj6>5g-jkYXK%gzoO_m zu7zm*-^*&Zzj*MT#q)Y?Ma6Dywl2?o_^w>zv&Ogz(!oHH3y-zk7dVc0+U5sC7n)@R z{%#IFuX;h;8Ax@Plj0UCm{b7p!Imk?tU~m(pAE!ZzNSe?8EZNuPbw=JkjH9xHlaz9 zw%y7hlq4qHHSppU&}Q#yWC!r=KX&H7*pz-ge&NBQSentqeZ%pil)R30W;V>8O+W7i zTymah!$BI{xwv_uAu7m>v7h=FOOFU88FFDRvq{_qrg~#&K4k_JyH<|(h?1{JZExOp zjaRsN7_NutA6FC+L<&%rlYssts1El4sCsMndGuMlrAsdSIE^I1n^oJi+rD+{$LW(> zpF(~Uk;fvtUdH#!Q6ZU2VZ^8;g>lqL`nOwGcIz10&>ofADC}^*f%k6|>s6j?v^H(|ergH0J1=Hvql{g&YoD*kfc^IP@3x#Ys}W@rg>a zqa(FVBFoXu8uwo6%%V}ySweU~aN%^+*vXTc;XuOLb=6OTQ_`9u77HoLAqVHqSz%T; z!T8K_UQI{}1y_t-|6l+FUJtLoimJ&) zI{jwyW1}sy+~cG6Ff@sSAll%wdk6OyZ`2*Kk!m(DfUpK>C1S}^EQ;3)vkxgs6=mLE zwY-^~=REP_i^UK&Q9`YlVMQo`wJqO0%=wXRPS?X>H{;dxQ*P%!pYJ({OWRIg^DE2r zIo)`2(4M$(@Kh925MRH~-1ZucyqzsBw-^WmVfjBhk}#{^EN35lw02zJ*wKI2(DwsZ zHh|YL_TsQ}4L4?5M>eohRY#@BKjI<16g|!Hh6dMyy|f6GowBF&;pJ&3qg;}~t;Wg> zq0fAA0S9Pp64`%SY|XuFVa1a<#WB<;(XtoQcULe}UpC%Vr+qTUQKH&M)hxPE7@}#? zg`&2kgu-4al?5klq?*%hD1D?UY^ME6Wz_ZgfuK50V{wPnVex{`&eyfMut|{iy+2H} z&S*|bERkuoJ%X=o_Xnp_j>t?H-(EETa`iIxX!dTA967rLx>9?_Um1%#QRiRklA7rl zswL5!-}a0C=sq%j5P?b-;fF8@GX&{J7LYbw-t!*zO~Qg{6hkXz$}IZmFf-Fy8HIcgoE&kd{PSM%fAo-YR)KpWpN( z)xs?OXK8BeB@xk4+&)s@dW$-(B*))CPahCo(w;8ioj3Y1i2q)1~H6eP$apH{GW7UC2 z(iBpRvHn()NGS`NU%uHgw@~B5oo4eO-P-Fwg z_`eyT```+A?w6=oE!Jtpvr zWz|GX_pJ2s+o{l7FX+LC)O8>6YzO{BS6r~>|6C}hhF480Cy37(UBwn9Lv|JwqR-Sg zjt0=8dc(ILw;OJ(6kJ^PIrp01^g>mOalzeR=`JdhSm#F-?o)Iu|0*-k!rE|!dgQ5$ z1x1m1R^-vF*a~ggoo(li>h#P(`D>AnJnh;LgkI^CZf zuGhtKzv?c$$V`zxCWB0dXc~MdzD-;uqXW)S@`z2*+X$tC$#pI^%N zY~TRyW1h{YFu-v(z|gmIkTxVtX@#qGWgKjYq05SXGs@xs5+abZe7gM6>NdJRkyq82(sv2P9wxiZjTyrf zNBO^b;rVQKFgzkY0CKSa6IF{L2~>Ri4md|*tK4u>i}SO-BHo=y+K!pflxl_MKJne4 zxa+r5mj2GwNVQMqaXJ*lVxl2rq;bO0&;T(p#zB>!1;z2F9QyJz<>!4S#hH;RLN1r)o848y%oqtJV1>si4%Al zUT+xjut`}5DwRYFg76V61T!6gqoLe&SmlH$(ZMk1YZIAUS1AT2I$V9)8alzzDJX@Y z&R6?L`;QzPKp9r26TSJ;mQ}oi>Cw%?tnA9=R=%pH`~$N*@zn4ioSn%p-?`oXdOWN! zu6>t*WKgYGjPwD4!0)pCmEQuqjXtT0j=#>o?s*93KhSxv!^~lb_l{C*D{yp`Y%kyI zLa5V-P$#pG-AEa{Jbp}n{MYds?e=jU{d7ieqWsHjD5dAdh8ral{v!qhP~z5)w@{t1 zFJ)LbdQWS=z1qQ*cI_If*G4C_&`8niHL|&w{opi!#@p{CLaF?PY(HM5vz7&q;WHJZ zssPr^VwWNZ|6n{cLm*!)8A1L(Q2nNVC>V?JdPRkfuN^5rQWr8ADox0%c=s|WH)vxq z;7LfAq8R{!H1;oY#b;seZo z6fvS1Dve*j`uK*fJh{0O$9C~r&D0~GWm96IJyLjtQT3+m(i)TXBGaYi;xnBQF&#vN zVN5)l7MgUlMmBie^8!{?d(}1gfcExZo9ZP0gR%W=oHB9+by00=guao(C(%u;-1*N8 zs6+_veA`zy-G~g5SQt<>m@l92JzaI>DBT)2liIo8wxz9hht}p`!+ihD zaw+Hjr&s}$n5^ugn>Rl-gl7JQU&0S=cv>K3o@xlspUg8S+_YOR$UAxW9shI1oePm` z=>uJ~jY;O``|mQ8ilL!E5#1m96!seivm&~6NKhxM;#;MVW^0VD<=UA>wtG0LuGmF( z*)~y7Peg4HY~-Sa4U$|bm|-CoS$4kP|I#HP#Q8E?*#Jb2CZNcR@(;A~%9E z_&@!E>2r1uJ|E5sxho`Em`CO2h)Vsmb4g1`i{KEL5Fn8#TiiGlGAYXAmh^XMYQ^Sb z<`Hc0^na06BASzdkR1gU22f=N;lpn)X#Ld?06ZQs2>3@!9^ib36Yy68f(rk-kPOPU zwQ-?CU|(>66uluiE{q;}ftXANJ%2gzAx^16cJzhc`oHew!Z5#Yvz%f=hdvyv@vK1N z2jCnCPX?%?TW~3;%aRk|oP_RBJ5VL+UN3E-E0lnLN4@>m=D=VG?K(hzs&oJ+0G`Z@ z0WC5_9Nz#DiW>ls;DQ+TTb%d*^;Uj>g(_J?6)jajVHF&>FM)b^g^mvB%+TTV=&#VF zp=UULqD>e|&!CmS0K+f|)ZGU3A02~+(A<0+Pl(FgwR4Q>IZ$u@v4yV<;YkPGBPQL! z4^-nnB84E)fC#s_FYzLi?ae$-5tns*4&#TTo5K1wJyjo@v^}esyPhbKgAc;syhESx z(EU(jH+f%?=LQp>=ZM$!DeJ#!_pbYyJmcdK9N?d9R&61mqgNis221NB>If~{`MI_h zwsrm|W-IE_V?sbnpzJ|o;k(O*OAbH);7>hZi3^4jD1I6yWAUYgLc8Bb6X%2&AMx?d zQ!K(#4t4@5YSDo#n{hhF&nXqck_>V!ohu&1Zx|RguX=)p1+65+q5Oqvwn>-`3|@JB z9`JAr3IKFoZ5Z6nCj8C$PI~?Q%DP9O*YT84QlnY?Q-EMy_j4CE#8rgO_W@9-Pe@(J z3gU}Z8hoNe?M1s;4{7V~+$$N4#@_VPdAG!|we>Y3-8+@j0l-Jz`s#6!QT)%a!ee!I z&^^}q#|q={zFla^c(gEYgVYnBzDi^&;~bSDHGm%@{!PvG7}o+$F@lb`N`$?~PYA_h zDQ-NR_W69|;TM7q3P<26ghw0xwGN>>bR0A;hPZ|xqDAT^>z;tQm@Hr=mn7%bUAJ)|}SZTAwO)c^37G`7l zOZa`n?niNoP*uO_dKFui3t8~wQd=VnTag^liGz7cyEfbZ1pR|-Ns^@!1KpWNK?E|X zfEITM!>9rPL3Hp6aZRignC zY`{o@{%;YFTj5wfBZ-*!i(Do*G8z^AxL*$CJ;W*Iu?)A9Xeq!l}>iOdSat} z0MmCI6>xqit0ipthc?2+!qaT-8y>|DFV<1*Y3MNaoyV8=Wq(+D-z}?{eBff0;xpKA zbXHjWIqby`lL`tE*0w2Q52I0teQ;TJU!$)03$2wo?t_I7rn@1;c{E8U!}ijt7gOV{ zW16ekQ3dN(17qKQ;FZT;dUDjRYlb{7l%K~X7{z>DkILb{pvO6lRW)% z|80@Ksa@>ZY1;bb-_50vFXS(e>YJc_WMeeMU*SI<>zl7n-lQ0BSk?bIs=MoAx=f<4 zNM#*q{xSnbQ&V1teTu5TMN16z+&Q?ly(xVewDU%JbG%A#)f_r1wCOsg)@AsNco6?R z76^s`IlJPm_)FcDZ%*U`TQMDclexbhuoRVZ6pR>41lbjvw_c;vB9j6y^U%dJxN*Gr z`zqqElWoajDc_BcW!)-b;Aov;?pZu9K#PCl$3aC)8%IMI&~0lZG2`#cN)q!fdso6NRi7?6)*0leO0pGSae4LzhpGt zBAy>0?s_5Lh3)7YjJ4UHN>OIvUPKDfMyTVhb$`Tf{f`dZbP$6nR!*aL5?cTfz(z4$ zS{&~Ej6wh)Uh5x^=jg0ig^})f$ECDeGY^f4uzsn9U0)f?G3^jSsMGeC5$4e^?(eqj zY89OK4H5N_!rjq9_rM}z@uIb%;R}<1nbYybYL+8kT9TMS_B`~p9ON=1(T!wakxkFlt{V))UjN<*6xtp#7Nk(s z**{eO$7BQnW$p>lcI(W+_WDBi>1gRBsa`TAke9CH$Z76|fn9aIue*iSSZ3`pKZs5U z6mJ-9N*_3kf5PG&rk)D>551L!;m7T%gTUtd!%KCQw)~3*RyvDaQD1E4^-jxvWXzTJ zKA0z3Ej^DQP+q;TIBXefG#KJTcz1B~f>D^T5y9 z`ewM4tjSq8$<(st(r^Px;(O7?v&(o8Mlc2z0 zJkf@BbG18lxI)(*^q(*5@J|Y#*)946J)5l6Ipr8*e~i1Nhh+r8t32l13!YW~Sa$k6 zPA22MnXpFAwvE(SeWQHS{{Wl~UA4}BIC<~}8Q*?Ucsly?9P~FR_zGTHUZ<~!8+g5G z3hxu(Jl#!6={^}ojKjboY0{ZqEgzQLMURK9pQutV4|E`2Q*I$xREha&B+Kc)h5BLR z8%v1Is`silhS6L zOJNbQUJ-YzeBY=e-uS-tYZ3>nUZ0|7G35Z+Z+nG zz^paMz_hz1DG0}lEbUc^OgiTKKyY6xzwdg=dnJa=Jr%z}xVL z9NE8lpJIP=%1LyxUH)8-PU*K{|8LFZvd}DV5^($Pi)hzU0A^=e&~r_jZ&g}Hv)3kl zh)wXF07{=?m1_&hXO^}S4p)*6C?8D{V`Xt?F1n5l|F=+)3Yf$73AoHUNVOmqkgL<6 z^Yan}Qt9BSL4e`61D03HVS%kW{Lc1cX6~p-c{*EMnGw#s;m>u7 zDafyjc^p6=QOSfyTT|}|{xR8pz6~+KzX(s;IvrC=K!Yn{Mq+rE8QMMCtUeFMuXJLw zz9}BmY0s{YZE9_s8HZBIv!IJoDwa2;9|j#`b$p@tn9He)e){Q@4~6p~P51YSGoD3t#gR4A{NUTM%k$ zJSo&ByUItHlIh|?Dz zRWPx4vGz?`v%tyy+8p02e$7nv-_-Ud4d27y-UczBhrpmYH4`ClGb2em6O@ISX7UPp z_}6;fbv08kQpBeer}c*o`&|=;m&V8bv_^G*uTTz4vEQCrd6l zco{nv+Y8cjWQ>#u4nkf?*_2uR{wKSPj=xlqnh1c59^T8|?Do_yzT8_{J^~5L0M`(Cr>-bR^Mj(FT0_$2Wez+YyY=HlVGs(7X6%qZR#c zN2Io)S((y9tQCh`bI?qckGW9`{~>uXX|?G9K(;osb zL$A~)or}B@B(!DDR5p=ETN1I8|MaklK98QthmQ~MR|4bi9^BQUFmhEESXyUZ#93YMbv-vmcs%Pi_n!+ zj0^`)2W^Yx4==8ZP&RP@JoYCm0(XNy2i<8?9q*F-$o4-PcMg8>GN>GIxQ? zch}6X>YwtaIZElQyHi-$#2!eSxWI67{v9vR3oqAplnVeuL9{sb+22VNGq2u@dF4ye zjE5i9!8V8A!Vm$9tgI9du|G$pmK7?i$+L7CWnTJB!74UiPGZ+y)M;@4qhy@F&&aG> z?F%2e~TpI)xE3b?=%qVct%UTQh#$wONGIO%wVc08=Q2_sQ;C?_|@fZ-El{U zWGRZx`MF2o%@OP0oj}i}?u45(>}ABqs*+Y1v{nf8c&UOL&-p!<1qsFvzMY^v$~a0e zIznev+39jLSJb=}yrYrU%QMYanvBHYt-M#Wnb*Sw(HuQmw8(6oBnJCqGEQrH0~?;; z(b5O5I#vDKrv1i0I%g>t;Bqot<1S!+#P2s~__8oN&}z7o+x{arA00G&38Rk@3sFAy z?>QW_&-ZulgEuSu#tKc)agx_SM#Y+5ojBx^rfl8-cAxm`-~tG7F{={N@ zJ?TAd6C?$xSY$OL_;PL~E7TVkB{bZ^q&LV)J^+Rf`jFv#+Ygb8dL>Rlpjrg=4aT8djbgE5*TvGOw@?`0!r1t@!yOSUO3dAP4 zm)u1TLk=qVi*!l^b_ByUM@xu7TcB_5_Tle=JuM&CL)mr2AhLK*P($OeJ{gCU9S#&0 zaFiSN=4SSuLcK}BYwpuY%}vhK9}gO3I@>!9>1jtJ&+41A`UheUqsbsE)=rawHQ67R z``qwc-`ynt(K*Fg)E_O4gG*9F5gmg|#((x+4*;*POh`$2C&14&l%T3vF7HsRtc}xSrgJ7faf+ z*~pd420SG~u1Z`gRGcXPfp@bfKZ(6INiEm$UY+v0R3ymUuSC-H7aG0y8(RnA2p@}L}L z2fQa}lO>|)ENE3Hg@=a$gX9c^9v-@rEqZKte1GB>paIb4^heKBG!YZVRx#- zFHoDTZRuQkg9`jUCZqIoTiK3#UP@TcN2EIux z0TsPdNTj@A37EyhU!g?&3U3I2nkM+N*T%Es8Nw5efEO}^@zA^k!~hT!557#rBHCQ_ z@RF^?romEo;V)y6XZX~3ZK@*h+R99?V_x#nyUHI^42hrv`Gesdb;+}|oi^cr|4f|% zDX3cCs*n*Y7o4+%ZK+u*e0w4c)Vw4BoI3AA z82!GqxESUNz^(33>iJz{NjFo&LS6(jaJdrJc~DP~KFz4;gnO<4B(3=mnm3}F@^Wtw zH5I`SGs5q5Bjg$cDud9ZO;G%X3ejR1XacjO%W`ieoDdas#lftCg!HLj?vFK12KI8q z3;t0Nvik}(te#3|r_a(tgbN+Wj@t&(xj+Y&>Of`?H7j0Htd zZLB}Z#oG;n>J*2)3EcvmJsttTb?Y2lZGRFYRfJkjPlQV%Cu3Vise3YX< z7_|j8fV9H_zkpH%DRGc~Z*XXD6d*F0{8XDHJf?4JKeF<|{wU?BI-yoV1 zg8sJSj^GUB^9E?Spl0PNXzxe+#`cQi0|_Gw2b?mC=5BC;C=+))S^pq^N^eHQpNRdduSh_wxaRh>{9n755(75|4DH42agz-$r?XzSwjMi2f z#}F@Fd!5wpDvr`ib?^WNQM=i@!NvH)h)Y;?q3p~Vt`7eH4BJjo^~dvHGgFCixUkHG7|=U|ph@C)2K=tm8I1U`qS z?*xF;DF-qW;H5~Q+-ypToARtzT7XI&gS{cfP_yl z1NX->;5}R_&kNUh_g1@SRdzV%dLx<(!jt)Urb7{yWBe#u3*<1db#eN7FVh)&&nTw} zZ*iVvSI4*R9~IhB(FnJhgUYo`>=w#$9xnOLsKjM#J-0;`>cu4IdOXpWs#-GtW;Ok% z{6z)fKMKo2$Sfu$9W+C>_a=jJ&-Xed(VrZH)^-4R0=DxNnJ*~C&3rTJgbF2UlFTRM4pAGit>%+9|vF^~Iv&*PB% zd?WDl{d?P-`ImC!0QH#)%(P6{lo08`5l# znKC%vaY^ZAj>)_E=cL&wu3Bl!n(lN1x^fKpJy(<#8~Cw@Oi@OeuK1Fmh?F?>46Ls? z0vj2raH~kTjPW|L-c*=aze^qYiAj~s0N^$#=abv5-= zluk58Vc0SqV`>TqLXxtd1Ka=r?awZ1w>GXbH5DbY)Wt)Wj`<=$k28pfU0r&c`n&)cSF-S#np)R@T{L+{ zhiJVsc-ojc^tq(ku=-eF?R7GwioQ-3*4P&qQCsC)D=t7V$39Sb^or%SgyN3;@YO0b zm~fUJ^|cXn5CNn3K}`(jVB8|wzMDgQiKX_2)frVG>*;?nZ5v zeWO;Pa&9Z02wonPsDSgB9dPC6SvYXK?RoO|G!@l}Rv*@6W{3b}kdCK+TK9J?EHcS8 zvWu38fwUlIhUKB79K_LqC;m*SRQ$4PJ?;yCaSQg1{-{sEBDOj1X4v@!Qt8B-+l4M|e7e39P5eFyJUqIL(e%@8DLeWQ^80A#>$pPC+71gH#d`0|l5Iknku9&>r=c@Qt z4)dERk>@DBwc$Qb0H_<8q5-dAB{>U4Wz^HQPf#vu5i}*$f&PuYUYs?W1M2Sy1iw$~ zF@9k<_y;};(BIl>&HA#u;DQ=$`da)wI|v{2lnnS_j>T|ZEi~RWe`(2Nl4qzy=f2L2 zjA#>xpjlnFCxSj2Gdr4*T41J}3Pm>-?drh9mbpyB8k)Ku zX?Ne5m>b#x8s@B)?>!;tN=>Bq%h`RNPLtz=&rlMYUfa7`{iqmQw$@$pmrlP(+E9K@ zd@5JbG&RUH7R5+LPxs*V+igX$nV93*o(S{Mgdm$xW=go6)1)kjxMtAtWlo zj~Uy(TwZLqNr@-=h*VNmT@1#ce{THd6NRn9_lD{1T=ezNh)80rt7eLMZhBvSiA5|u z!H=7;d&{^UgC@hSRNeLi75mM|L_5Y!F6u_|JZ@U%Mfnh4ex7Qgsg%(z(p1}Eyu$e+ z4!1|xb5s9BulA8nCIIG9)wm{fFT>8S|6oGd>xtpH!!_-u!NfDtJ(%LbDXWM zg{uHW1YZK}Rf=&g^bu*W!0sFe;SZS)$KEQ}jg#7F;qXy{#&2}`dzAL$*p!K5`7lc| zGPgJ=1~#)QA66sQtW;|cKjq(R3K zgR5d(>N`&OsFx1CEIaj(P>$dKS^<`h(WLnU#>xn(?DaAs=Cqr%+t zi;7J0CV$+$**sw^Uj7Jm3)2@<`dm!IVV9qUAWi$IQ&1H7EVEWU4;9EEK2&~|K6i4C zwl}Xg@l-jHJiAW|slLe}Bj^63t!-cfkRe6IsZ`Jr_)fJ)GXAziH3v7g)}et~3(87n zs=Aq7k_ldcH%|*nN-C)d=~#Y#7bE+i8duaJDjJGb9q(~*^*)6x`rV&lG1#Qqu6CbT zt|GGMAYWoj3Lh3)$0uTuK!QOUaFc5w=8nEv3x4ZV(^B~y(MYsCC+RsN62fcM_l3qH z1>xyIR}-odiba3U*8^f(v~|uW=*SdQ>9aA`;OB;HP#qEmvS@%U`NdCkZuL4IUvF*b`t3K{orYNaT~jp zstP54!Nz5?_Ji?}IFXR42oD679J7}OCXH-beHX~p6u#uRFK+by8=%{>(Jb-Ip)zx!uIMNFD@QjkV6OWGVO8 zpJGxn-w~Wv?I{4&l7j)~YwmzB9+7_QeSr4Xo>8FrHtfh?)CiN=mxN-Wr z44o2q&z6cvA!_k7ZY@`L^Lo%R&I5}L31|*FUS&eI*)1yYI}tmT#h;ilGRb6u7#>y| zs082%1$>2Giv@TF-7*;rfQSg8i{aM{c8O6ZzoXOz-?v!$P!chKnIfxk3rLXcE8~gq zdp4^O=lTUC-7oO{iHQ1`PK!h%sYF$UDFNts3$nujW+$D@IIQ8-`XU*D=(An_cea)S zRIpqx$8{;#;Bsr}BdnufD!r9=39_7jR<@R`qaV!LpYWUgX zx4p0^^C<6@u$V}%ie&WGZl~Rqw5PXTTagD;cZcUB{z9qz3l29OA+@dE0`u1!Q|x>` zb$dwxUZgPl(zDeAO?u=ydrNZe}`3wFbJ*rg? zjdkZo4N4!9*AFM-1+@k(f@5c}9Yp`F$Rnzs=1FM>^;;=vH}zZTOUUP+&utPt6jKCl zcYaUbFN&-k#b#0|`0%>!%>P`}@a9`|zv`>I7(Ub=yKB8xA*Wo)8Vq-uO!#>HW-3A4 z*=hR;{c(L_B*sW-NTm!t3XpQST=;qz^BIjv)OmB!g{P~Q$6b`|UXSZ=`c38Iz^Ec! zB-M4DQNL82Z5gZh27H3H#-w@C_B5SMVGfZToEKgl)C~R;-#B5 z$qJNn{PIG}sm#k$fv!svs-~#teDlJY#!H1sYz}zQcYe<-E9`3_g4jf(&5o5V!x3kH z%5X2dojxsB&n@9fzQ1-{10P&1-5==woQ`GIMxY2ad%O2r#4F;jYzQF)_))fXvX`<_ zJ*?O&M)*8WQH-i-JVYASs-qs?asT8M!BPSMKv1QwHLg~|gz^H9XY7fXgm?}z>Nma>581vZo) z^bH1an;9PYmuL`dg1$ZwWRMuMl^0WF>D@b>AaN1ox-fBnvff)e?rN@iKXiSvkSSOw zhIY}AlNl$PK=VZ={%5dTFs5&L765fFQBh7;myqz9bHjZ7+k_W1$?Cbarp58f61Bz5f14{^yMCveATR zy=!Paft}*W)&0&~Oy)P2o~+tHhW5jOBPlT(SsXTiw(eGtU-nY>q|5b-2<}CcEiC`> z@B9nBJhz#o0d(9XnDk?}t-*8=KFYbMHZ>`5tX*xGQ^hSEpQ}heIWA?_=knWk?Hrt> z>|QR_VI=f><0iTntdkWlLKSgGW>%S=LI76T0@Y86=^fXMF~fUli_Q6s=Zh6Mg|)%6 z{fZOc-j_t?Jo-zGDnXvP9j&IyKx8$L;TH9JgxE#~Z&o`jlbeZ7$@A8+z zc+c6?kaA?mI-bad`^kQVYMQbWzFc@|h~Lo?XROn{v2*4%uDOfHxzTdf(!Vv}X+{yf z;Nh_BFm&aX<}h@oJXl~@gFW>JHr4KGdxct({y1_Nq!O0SY&}>t%+j(apqz1tv=fs$z#xD{ck1KVhor5i-?c zNwW6pDEL|>B0&r9YI2^&WtXj0tI0Ay@4B>_3$u1RX3e6u2w)s|f1forq~JR3tnb-k zyI4<+KBj~TrKEZ&Xzs)5V@yt3Ds|?6c5TRecY%4TVQ96WIvoS&|K0o;$7KaQS`Gk+fv$nUdfI_-24&(QPjiEQw> zb?0fz;!DybM(?(tEIaG35)|5-&ThQj?eix*3q+MyVqr~jl&r$I^sYWdLum6yH&|zO z)9jRQa8iw6S!%A>3`h@z@_iBv8MP5ER)-auUOMfiQ96J*|D}^rbXPy4`Pqor8SW(? zph0J_XX`Vx&gaJHS3B#7?(+RjI_JZ1Z`^pOL0f&r+r6u^m#x-&2{nu}Dil}(nY!68 z5Er{LVg}Km+cmOYH5EoDG(-nGe&i{5?qO-k-M13fEv49YCw??_-yXgBTbGB;VSLLP z%2b@F?v2+Y$TCb!_vNecJ-y$%eO>_W?L!g$QF|Yr%1<@kcJo17ICzj+x?1z#wvn02idNUC%jgCu<;qOFzA|1r0N#FdWa~YUt zYu6*bAjG75A2}mz6zC-4kn@yTSzwAN6wM z0Au}Wgy)?hfuSLx5uq^~82t05V=4xMJdN8`CGu*lm-Pqdfk1iHMQf!wc`%bqWu#e9 zwft}-N$puK0Y%s6qblyIeGE4ni=kAwT6r zB(ogo=xFZ-1{Rd~ZOS6?_HWixzOgh4ylv+dJ0F|PbS@V3+#@m=#QQb+1H$v|9#;Fe zwdBhz4ZGgZx~{=zjm9~$1YF1TuFebPaJ6E!0k!?f7}3N-1Et8+H?%PE^`wLsdD>;{ zD7yH7bKpdU&0oymVr^?h$}4emH18etO!`EN+G7bY061rM$^!FC4?~f6iMM0RPN220 zb*JTu>ePTRV_|>D;Rav8^a+1@)i$>WY?z(RpGcJffTN4=^ zjVq0-jH`{Ew9%X~t>oWt6s5!3bT_lLKoYfGffXd z#vj}^kdm^bX6i2*b#n+UjH(eGW0P%)Lbm)qV0}4Gy1F!h?73Cs;l(|ZXLRFG^7Koj zio5d#mJ2KC@t)=%ye^wAyDs}K$F9qjP~VtTOZIC11l0YFL1twFAbFY%X0>#l@}fP( zSD>SI=-tO$)2OOl&dCDZF6HLn77|J#)2@od5y2NEwLY3&3snC8EgpKpBSUvi9`kVv z8<<~YZwVT{wWMizPWxxId9#OJgx-Y0MBWK1mDWlON;%u+-xLocP}}L;)GF4_5Py#& zF|Q!n601)7mKF7f1%Zf$)yv2|Idx!qXUA7WUX9+lNu7B1TC!^=SEHZZo1=AQY|di+ zaWeYy`tRItDSq`RvXOe@-(tD$GcX)xDM2gCbg~((gxAF;)|;^jo|1uhdj#ZsF+V?%?_RO*S-~v}({MgH!MR0{eoQsd z?z%)7k*$<;sM)T;I zC0b;f$gZznZBNe^`yl&Zd+_XI_qtRMDSD;aNuS??i@O^$HQ=jBj61go9h!dR;9^Tf z7)&l2woXc&9E;{S7L8CpVWYj@%bfN$AILb<+1je9KC*sG618DaSA06I=}g7gJ%gUh z-LkRjK@-Yed%DE9w!h0K47mO+?%ctj{DFgmt{qaaEhW%d;f``3L1peF?*v}fc4rz) zB{xzzqf&GPUwccp(x0bI(cuVQO&5mtXf;wEIj;#-9xa}c{Uj?o;-&w~$dADjF)8@A zUXoX;UWykDg17GbRQsSJ2X{HB0qu3sJ7SYOHOI5|WcGT8zsIGw%v2g1l9s_jcC(-1 zwDnzBSVB`Q^nAJ^HXfzdE5EYVI(UsFrcqj-4c9i`UK5@(pzSZB&pAyUR!tvDpVR=+ zh?eie3oVI83PytUUGQeqsTrNFP_ZL8*j42Oi=Agb(LR=h$#}(Im(e0!st!hoSB#Xc z=iGF$+Dv3o&5k^F+zwU6JFJug8Yi zVdsrUqgd}%^#yC9L6F^eG-CLkd@43@6q7>m*wyE2+N~3MWMb%j+{5u(zC8M*RhNAr zS++k&A+*cPV-g)1miD7Pl*-saH{)lHX1LH*HlVazOrektW06Qh!|3tH4o}b(vUq7jD21h`^F;1V=gvGE^;9V z!{W%kb2cXSv$yesN4ay&XT!~j>UCEBz1AlE)8&)f{qKJ}4>7GyTN|84hVVYs>#qsT zj$I#}TI~GMYdY?|IXrREULBr31B(?byhGuU6M(K{M3Z~ zVEKbb>7SMd?0$t(&;5s?4Eo2iD8zkpfrgseKfQiZmt~EH8WN9oMNXPUY-t|HjwG>z zKl)PpGF$Kgjr6VIpMJ#mbVz*|lzFmFM*Xu(CU#x=vh&`okdf%)o}2QQk2X_u*n-oY zERQC$v62SP>+dBIJ(+gaQ4OZCUFCpnY>S}EQe$0?urp6INiS&1U<7$%(yqZx>yEFF zR&zP4Rc~u@PlE=IUh4hh{nB1ZgBRyqtBY5H>ZKT-Qlwg`+7OJ*xQz(1^3sbx+FVjO z)JyEflN0a#>n#C+zAj!y=@$c`IggF{*Ui#|eDf6gzbE)^srEU)y-aMnteK+WN zsfp%K{TNYBQz?pd7h*}j76Lu;PuF$7arn?Nd!a?G9g@8yTvXdx>-$EG4xL-Ra~V-I z(BispXOF*syj}|@=DEFL?$=Baet*bZ&Z||g#miTSAe=xIM<`dx-bPFokZ`&-kUtFb zHnJIwA?oZpEXD`SRg)l-g;^gei+CR=KGG`oY`fW&>8cyUEp!$Ee~vPzLSb0 zLh+rcAQ_DLOu7T8;yS^vqPK{iO@H^>lh6CBMHjK`_;11h1J{ii%VH$E4( z=e8GI=T+xiH;bY(ztF`1z_qUIL6Ba=mh_@L_7|=k>AjP26!-0{djz(k;C_=?bTBc5 z8XnoGzyFhmD%`Wjii*FjbcxD|b=3g3`SOwzG4(3z>bDCb8h`}>@D4Z|#Ey7A9~62N z$^Sy7#|hCHJ3?>Hv%YL@KD$QrG=Ku|KuoW0o0C?d(*(0Jf#fS~cngi@tz9EepMTZO z>EExe{aa-2r=K9q)vPpvKJy?DiXLfxuVY2jVnFc7qbvn^gYd8MvgqQGx6LIjE{@#k zky$HD?xOV$d6|fVJ-u_SF08 zN^ULc?nhku!pBPQOT<`*BV4(|W*0=D4LgIhP_rn3pYsR;3*$*_8(f~mVZpreu zE{XddcIp67rwnRqUgtwP_<*J-QXABpCpmy>(Z>GJC?1SXjau{#pt`7PEJFiWf)IrJ zxGwUR|DZ#FweUz(l*KR12!MkDfK{XOz!%$b0s=Bbf+BjwjvBBb(0Y2H`jq|#5pY#O z!fIG2MgoYvAQ=w16X{EVKOunY<=d4z1utR*FnbfA)J}zi0<2g|J{~)R?F1kh>OzGe zaQ=RTjs`78WMm^AVdrT zTw`|GAOQ#&QS*;5J30W0_Y5&wM2ro1{Sm_)M7S&m2*Ya?aRGl2v3M_)TY@MIPy@H; sz{U!Q7HAQxAcsJWNQ3?_-iZeLLR8m6!YY&JYVbjnmQWBc6*ctxKZUO>O#lD@ literal 0 HcmV?d00001 diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/index.html b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/index.html new file mode 100644 index 00000000..ec690b03 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/index.html @@ -0,0 +1,32 @@ + + + + + + + CookBook.Web.Blazor + + + + + + + + + + + +
+
+ Loading... +
+
+
+ + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/manifest.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/manifest.json new file mode 100644 index 00000000..0b938ba6 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "CookBook - your online list of recipes", + "short_name": "CookBook", + "display": "standalone", + "theme_color": "#04173D", + "background_color": "#FFFFFF", + "permissions": [ "storage" ], + "scope": "/", + "start_url": "/", + "icons": [ + { + "src": "/images/icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/service-worker.js b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/service-worker.js new file mode 100644 index 00000000..a2e3da88 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.Blazor/wwwroot/service-worker.js @@ -0,0 +1,23 @@ +const CACHE = "precache"; + +importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.0.0/workbox-sw.js'); + +self.addEventListener("message", (event) => { + if (event.data && event.data.type === "SKIP_WAITING") { + self.skipWaiting(); + } +}); + +workbox.routing.registerRoute( + new RegExp('https://localhost:44380/*'), + new workbox.strategies.StaleWhileRevalidate({ + cacheName: CACHE + }) +); + +workbox.routing.registerRoute( + new RegExp('/*'), + new workbox.strategies.NetworkFirst({ + cacheName: CACHE + }) +); \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/HomeController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/HomeController.cs new file mode 100644 index 00000000..0ab23eaf --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/HomeController.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; + +namespace CookBook.Web.MVC.Controllers +{ + public class HomeController : Controller + { + public HomeController() + { + } + + public IActionResult Index() + { + return View(); + } + + public IActionResult Privacy() + { + return View(); + } + + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + public IActionResult Error() + { + return View(); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/IngredientController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/IngredientController.cs new file mode 100644 index 00000000..7d14b15c --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/IngredientController.cs @@ -0,0 +1,66 @@ +using CookBook.BL.Web.MVC.Api; +using CookBook.BL.Web.MVC.Facades; +using CookBook.Web.MVC.ViewModels.Ingredient; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Threading.Tasks; + +namespace CookBook.Web.MVC.Controllers +{ + public class IngredientController : Controller + { + private readonly IngredientFacade _ingredientFacade; + + public IngredientController( + IngredientFacade ingredientFacade) + { + _ingredientFacade = ingredientFacade; + } + + [HttpGet] + public async Task List() + { + var ingredients = await _ingredientFacade.GetAllAsync(); + var ingredientListViewModel = new IngredientListViewModel + { + Ingredients = ingredients + }; + return View(ingredientListViewModel); + } + + [HttpGet] + public async Task Detail(Guid id) + { + var ingredient = await _ingredientFacade.GetByIdAsync(id); + var ingredientDetailViewModel = new IngredientDetailViewModel + { + IngredientDetail = ingredient + }; + return View(ingredientDetailViewModel); + } + + [HttpGet] + public IActionResult New() + { + var ingredientNewViewModel = new IngredientNewViewModel + { + IngredientModel = new IngredientDetailModel() + }; + return View(ingredientNewViewModel); + } + + [HttpPost] + public async Task Insert(IngredientNewViewModel ingredientNewViewModel) + { + await _ingredientFacade.InsertAsync(ingredientNewViewModel.IngredientModel); + return RedirectToAction(nameof(List)); + } + + [HttpPost] + public async Task Delete(Guid ingredientId) + { + await _ingredientFacade.DeleteAsync(ingredientId); + return RedirectToAction(nameof(List)); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/RecipeController.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/RecipeController.cs new file mode 100644 index 00000000..28111d58 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Controllers/RecipeController.cs @@ -0,0 +1,132 @@ +using CookBook.BL.Common.Services; +using CookBook.BL.Web.MVC.Api; +using CookBook.BL.Web.MVC.Facades; +using CookBook.Web.MVC.Models; +using CookBook.Web.MVC.ViewModels.Recipe; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; + +namespace CookBook.Web.MVC.Controllers +{ + public class RecipeController : Controller + { + private readonly RecipeFacade _recipeFacade; + private readonly IngredientFacade _ingredientFacade; + private readonly ISerializerService serializerService; + + public RecipeController( + RecipeFacade recipeFacade, + IngredientFacade ingredientFacade, + ISerializerService serializerService) + { + _recipeFacade = recipeFacade; + _ingredientFacade = ingredientFacade; + this.serializerService = serializerService; + } + + [HttpGet] + public async Task List() + { + var recipes = await _recipeFacade.GetAllAsync(); + var recipeListViewModel = new RecipeListViewModel + { + Recipes = recipes + }; + return View(recipeListViewModel); + } + + [HttpGet] + public async Task Detail(Guid id) + { + var recipe = await _recipeFacade.GetByIdAsync(id); + var recipeDetailViewModel = new RecipeDetailViewModel + { + RecipeDetail = recipe + }; + return View(recipeDetailViewModel); + } + + [HttpGet] + public async Task New(RecipeNewViewModel recipeNewViewModel) + { + recipeNewViewModel.IngredientsAll ??= await _ingredientFacade.GetAllAsync(); + recipeNewViewModel.RecipeModel ??= new RecipeDetailModel + { + Ingredients = new List() + }; + recipeNewViewModel.RecipeModel.Ingredients ??= new List(); + + return View(recipeNewViewModel); + } + + [HttpPost] + public async Task Insert(RecipeNewViewModel recipeNewViewModel) + { + var currentCulture = CultureInfo.CurrentCulture; + + if (TimeSpan.TryParse(recipeNewViewModel.DurationText, out TimeSpan duration)) + { + recipeNewViewModel.RecipeModel.Duration = duration; + } + + try + { + await _recipeFacade.InsertAsync(recipeNewViewModel.RecipeModel, culture: currentCulture.Name); + } + catch (ApiException e) + { + var validationErrorsModel = serializerService.Deserialize>(e.Response); + + foreach (var nameError in validationErrorsModel.Errors.Name) + { + ModelState.AddModelError($"{nameof(recipeNewViewModel.RecipeModel)}.{nameof(recipeNewViewModel.RecipeModel.Name)}", nameError); + } + + foreach (var descriptionError in validationErrorsModel.Errors.Description) + { + ModelState.AddModelError($"{nameof(recipeNewViewModel.RecipeModel)}.{nameof(recipeNewViewModel.RecipeModel.Description)}", descriptionError); + } + + foreach (var foodTypeError in validationErrorsModel.Errors.FoodType) + { + ModelState.AddModelError($"{nameof(recipeNewViewModel.RecipeModel)}.{nameof(recipeNewViewModel.RecipeModel.FoodType)}", foodTypeError); + } + + foreach (var durationError in validationErrorsModel.Errors.Duration) + { + ModelState.AddModelError($"{nameof(recipeNewViewModel.RecipeModel)}.{nameof(recipeNewViewModel.RecipeModel.Duration)}", durationError); + } + + foreach (var ingredientsError in validationErrorsModel.Errors.Ingredients) + { + ModelState.AddModelError($"{nameof(recipeNewViewModel.RecipeModel)}.{nameof(recipeNewViewModel.RecipeModel.Ingredients)}", ingredientsError); + } + } + + if (!ModelState.IsValid) + { + return View(nameof(New), recipeNewViewModel); + } + + return RedirectToAction(nameof(List)); + } + + [HttpPost] + public async Task Delete(Guid recipeId) + { + await _recipeFacade.DeleteAsync(recipeId); + return RedirectToAction(nameof(List)); + } + + [HttpPost] + public async Task AddIngredient(RecipeNewViewModel recipeNewViewModel) + { + recipeNewViewModel.RecipeModel.Ingredients ??= new List(); + recipeNewViewModel.RecipeModel.Ingredients.Add(new RecipeListIngredientModel()); + return View(nameof(New), recipeNewViewModel); + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CookBook.Web.MVC.csproj b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CookBook.Web.MVC.csproj new file mode 100644 index 00000000..b2ef3409 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CookBook.Web.MVC.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + + + + + + + + + + + + + + + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CustomCultureProvider.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CustomCultureProvider.cs new file mode 100644 index 00000000..27518f09 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/CustomCultureProvider.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Localization; +using System.Threading.Tasks; + +namespace CookBook.Web.MVC +{ + public class CustomCultureProvider : RequestCultureProvider + { + public override async Task DetermineProviderCultureResult(HttpContext httpContext) + { + if (httpContext.Request.Path.StartsWithSegments(new PathString("/cs"))) + { + return new ProviderCultureResult("cs"); + } + else if (httpContext.Request.Path.StartsWithSegments(new PathString("/en"))) + { + return new ProviderCultureResult("en"); + } + else + { + return null; + } + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Installers/WebMVCInstaller.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Installers/WebMVCInstaller.cs new file mode 100644 index 00000000..4c9b3478 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Installers/WebMVCInstaller.cs @@ -0,0 +1,12 @@ +using CookBook.Common.Installers; +using Microsoft.Extensions.DependencyInjection; + +namespace CookBook.Web.MVC.Installers +{ + public class WebMVCInstaller : IInstaller + { + public void Install(IServiceCollection serviceCollection) + { + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/RecipeNewValidationErrorsModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/RecipeNewValidationErrorsModel.cs new file mode 100644 index 00000000..33a2f20f --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/RecipeNewValidationErrorsModel.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace CookBook.Web.MVC.Models +{ + public class RecipeNewValidationErrorsModel + { + public IList Name { get; set; } = new List(); + public IList Duration { get; set; } = new List(); + public IList FoodType { get; set; } = new List(); + public IList Description { get; set; } = new List(); + public IList Ingredients { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/ValidationErrorsModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/ValidationErrorsModel.cs new file mode 100644 index 00000000..2e5f063c --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Models/ValidationErrorsModel.cs @@ -0,0 +1,7 @@ +namespace CookBook.Web.MVC.Models +{ + public class ValidationErrorsModel + { + public TModel Errors { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Program.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Program.cs new file mode 100644 index 00000000..a8398426 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Program.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace CookBook.Web.MVC +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup()); + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Properties/launchSettings.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Properties/launchSettings.json new file mode 100644 index 00000000..143ccbb6 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Properties/launchSettings.json @@ -0,0 +1,25 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:11096", + "sslPort": 44355 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "CookBook.Web.MVC": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5004;http://localhost:5005" + } + } +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Startup.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Startup.cs new file mode 100644 index 00000000..dac8c3db --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Startup.cs @@ -0,0 +1,84 @@ +using CookBook.BL.Common.Installers; +using CookBook.BL.Web.MVC.Installers; +using CookBook.BL.Web.MVC.Options; +using CookBook.Common.Extensions; +using CookBook.Web.MVC.Installers; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Localization; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; +using System.Collections.Generic; +using System.Globalization; + +namespace CookBook.Web.MVC +{ + public class Startup + { + public IConfiguration Configuration { get; } + + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + services.AddControllersWithViews().AddNewtonsoftJson(); + services.AddOptions(); + + services.AddInstaller(); + services.AddInstaller(); + services.AddInstaller(); + + services.Configure(Configuration.GetSection(nameof(ApiOptions))); + services.Configure(Configuration.GetSection(nameof(WebOptions))); + + var webOptions = Configuration.GetSection(nameof(WebOptions)).Get(); + + var supportedCultures = new List + { + new CultureInfo("en"), + new CultureInfo("cs") + }; + + services.Configure(options => + { + options.DefaultRequestCulture = new RequestCulture(new CultureInfo(webOptions.DefaultCulture)); + options.SupportedCultures = supportedCultures; + options.SupportedUICultures = supportedCultures; + options.RequestCultureProviders.Insert(0, new CustomCultureProvider()); + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IOptions webOptions) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Home/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseRequestLocalization(); + app.UseStaticFiles(); + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute(name: "culture-route", pattern: $"{{culture={webOptions.Value.DefaultCulture}}}/{{controller=Home}}/{{action=Index}}/{{id?}}"); + endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); + }); + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientDetailViewModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientDetailViewModel.cs new file mode 100644 index 00000000..279c3baa --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientDetailViewModel.cs @@ -0,0 +1,9 @@ +using CookBook.BL.Web.MVC.Api; + +namespace CookBook.Web.MVC.ViewModels.Ingredient +{ + public class IngredientDetailViewModel + { + public IngredientDetailModel IngredientDetail { get; set; } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientListViewModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientListViewModel.cs new file mode 100644 index 00000000..41ab6ceb --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientListViewModel.cs @@ -0,0 +1,10 @@ +using CookBook.BL.Web.MVC.Api; +using System.Collections.Generic; + +namespace CookBook.Web.MVC.ViewModels.Ingredient +{ + public class IngredientListViewModel + { + public IList Ingredients { get; set; } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientNewViewModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientNewViewModel.cs new file mode 100644 index 00000000..08b3bf5f --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Ingredient/IngredientNewViewModel.cs @@ -0,0 +1,9 @@ +using CookBook.BL.Web.MVC.Api; + +namespace CookBook.Web.MVC.ViewModels.Ingredient +{ + public class IngredientNewViewModel + { + public IngredientDetailModel IngredientModel { get; set; } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeDetailViewModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeDetailViewModel.cs new file mode 100644 index 00000000..18ab8930 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeDetailViewModel.cs @@ -0,0 +1,9 @@ +using CookBook.BL.Web.MVC.Api; + +namespace CookBook.Web.MVC.ViewModels.Recipe +{ + public class RecipeDetailViewModel + { + public RecipeDetailModel RecipeDetail { get; set; } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeListViewModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeListViewModel.cs new file mode 100644 index 00000000..cab79371 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeListViewModel.cs @@ -0,0 +1,10 @@ +using CookBook.BL.Web.MVC.Api; +using System.Collections.Generic; + +namespace CookBook.Web.MVC.ViewModels.Recipe +{ + public class RecipeListViewModel + { + public IList Recipes { get; set; } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeNewViewModel.cs b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeNewViewModel.cs new file mode 100644 index 00000000..7211065e --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/ViewModels/Recipe/RecipeNewViewModel.cs @@ -0,0 +1,12 @@ +using CookBook.BL.Web.MVC.Api; +using System.Collections.Generic; + +namespace CookBook.Web.MVC.ViewModels.Recipe +{ + public class RecipeNewViewModel + { + public IList IngredientsAll { get; set; } + public RecipeDetailModel RecipeModel { get; set; } + public string DurationText { get; set; } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Index.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Index.cshtml new file mode 100644 index 00000000..3169c6ce --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Index.cshtml @@ -0,0 +1,3 @@ +
+

Vítejte ve své oblíbené online kuchařce.

+
diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Privacy.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Privacy.cshtml new file mode 100644 index 00000000..e6eef706 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Home/Privacy.cshtml @@ -0,0 +1,6 @@ +@{ + ViewData["Title"] = "Privacy Policy"; +} +

@ViewData["Title"]

+ +

Use this page to detail your site's privacy policy.

\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/Detail.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/Detail.cshtml new file mode 100644 index 00000000..d09ad7c4 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/Detail.cshtml @@ -0,0 +1,11 @@ +@model IngredientDetailViewModel + +
+

@Model.IngredientDetail.Name

+
Popis: @Model.IngredientDetail.Description
+ +
+ + +
+
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/List.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/List.cshtml new file mode 100644 index 00000000..115d4934 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/List.cshtml @@ -0,0 +1,10 @@ +@model IngredientListViewModel + +
+ Přidat novú + + @foreach (var ingredient in Model.Ingredients) + { + + } +
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/New.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/New.cshtml new file mode 100644 index 00000000..2c978c52 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Ingredient/New.cshtml @@ -0,0 +1,25 @@ +@model IngredientNewViewModel + +
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/Detail.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/Detail.cshtml new file mode 100644 index 00000000..802f71f7 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/Detail.cshtml @@ -0,0 +1,28 @@ +@model RecipeDetailViewModel + +
+

@Model.RecipeDetail.Name

+
Doba trvání: @Model.RecipeDetail.Duration
+
Popis: @Model.RecipeDetail.Description
+ +
+ Ingredience: +
    + @foreach (var ingredient in Model.RecipeDetail.Ingredients) + { + +
  • + @ingredient.Name + @ingredient.Amount @ingredient.UnitText +
  • + } +
+
+ +
+ + +
+
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/List.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/List.cshtml new file mode 100644 index 00000000..b4d63583 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/List.cshtml @@ -0,0 +1,10 @@ +@model RecipeListViewModel + +
+ Přidat nový + + @foreach (var recipe in Model.Recipes) + { + + } +
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/New.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/New.cshtml new file mode 100644 index 00000000..67f4e836 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Recipe/New.cshtml @@ -0,0 +1,72 @@ +@using CookBook.BL.Web.MVC.Api +@model RecipeNewViewModel + +
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + @if (Model.RecipeModel.Ingredients != null) + { + @for (int i = 0; i < Model.RecipeModel.Ingredients.Count; i++) + { +
+ + + +
+ } + } + +
+ +
+
+ +
+
+ +
+
+ +
+
+ + @for (int i = 0; i < Model.IngredientsAll.Count; i++) + { + + + } +
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_IngredientListItem.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_IngredientListItem.cshtml new file mode 100644 index 00000000..7e42f7e8 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_IngredientListItem.cshtml @@ -0,0 +1,10 @@ +@model CookBook.BL.Web.MVC.Api.IngredientListModel + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_Layout.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_Layout.cshtml new file mode 100644 index 00000000..e4a642ea --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_Layout.cshtml @@ -0,0 +1,44 @@ + + + + + + @ViewData["Title"] - CookBook + + + + +
+ +
+ +
+
+ @RenderBody() +
+
+ + @RenderSection("Scripts", required: false) + + diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_RecipeListItem.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_RecipeListItem.cshtml new file mode 100644 index 00000000..750efa15 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_RecipeListItem.cshtml @@ -0,0 +1,12 @@ +@model CookBook.BL.Web.MVC.Api.RecipeListModel + +
+
+

+ @Model.Name +

+

@Model.FoodTypeText

+
+
\ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_ValidationScriptsPartial.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_ValidationScriptsPartial.cshtml new file mode 100644 index 00000000..5662ea98 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/Shared/_ValidationScriptsPartial.cshtml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewImports.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewImports.cshtml new file mode 100644 index 00000000..bbb4be62 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewImports.cshtml @@ -0,0 +1,7 @@ +@using CookBook.Web.MVC.Controllers +@using CookBook.Web.MVC.Models +@using CookBook.Web.MVC.ViewModels.Recipe +@using CookBook.Web.MVC.ViewModels.Ingredient +@using CookBook.BL.Web.MVC.Api + +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewStart.cshtml b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewStart.cshtml new file mode 100644 index 00000000..77b65af1 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/appsettings.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/appsettings.json new file mode 100644 index 00000000..1d0a5352 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/appsettings.json @@ -0,0 +1,17 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*", + "ApiOptions": { + "BaseUrl": "https://localhost:44378", + "Version": "3" + }, + "WebOptions": { + "DefaultCulture": "cs" + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package-lock.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package-lock.json new file mode 100644 index 00000000..145a255a --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package-lock.json @@ -0,0 +1,4320 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "bootstrap": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "dev": true, + "requires": { + "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" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "file-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "jquery-validation": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.19.1.tgz", + "integrity": "sha512-QNnrZBqSltWUEJx+shOY5WtfrIb0gWmDjFfQP8rZKqMMSfpRSwEkSqhfHPvDfkObD8Hnv5KHSYI8yg73sVFdqA==" + }, + "jquery-validation-unobtrusive": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.11.tgz", + "integrity": "sha512-3FQPllaWdD+Aq55zJLGSW39+eXPDz1HhwAvrSwYi8zHQ8DVcu5IJ1HVeTiCl0BnCnrIBvfFU3zEB/DrGdcoRIQ==", + "requires": { + "jquery": ">=1.8", + "jquery-validation": ">=1.16" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "style-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.6.4" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.0.0.tgz", + "integrity": "sha512-sPsoBs8NkSJt9k/2zLUMDAf0rYaG00EtrFQpHRIphKrR6stGsO92LUJf/uUeQNKEoxqoJ4R4qDLqHl+AOEqolA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.26", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.42.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", + "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.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.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package.json b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package.json new file mode 100644 index 00000000..ce947c31 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/package.json @@ -0,0 +1,21 @@ +{ + "requires": true, + "dependencies": { + "jquery": "^3.4.1", + "jquery-validation": "^1.19.1", + "jquery-validation-unobtrusive": "^3.2.11", + "bootstrap": "^4.4.1", + "popper.js": "^1.16.1" + }, + "devDependencies": { + "webpack": "^4.42.1", + "webpack-cli": "^3.3.11", + "css-loader": "^3.4.2", + "style-loader": "^1.1.3", + "file-loader": "^6.0.0", + "url-loader": "^4.0.0" + }, + "scripts": { + "build": "webpack" + } +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/webpack.config.js b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/webpack.config.js new file mode 100644 index 00000000..3af70399 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/webpack.config.js @@ -0,0 +1,22 @@ +const path = require("path"); + +module.exports = { + entry: { + site: "./wwwroot/js/site.js" + }, + output: { + filename: "[name].entry.js", + path: path.resolve(__dirname, "wwwroot", "dist") + }, + devtool: "source-map", + mode: "development", + module: { + rules: [ + { test: /\.css$/, loader: "style-loader!css-loader" }, + { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader" }, + { test: /\.(woff|woff2)$/, loader: "url-loader?prefix=font/&limit=5000" }, + { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/octet-stream" }, + { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=image/svg+xml" } + ] + } +}; \ No newline at end of file diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/css/site.css b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/css/site.css new file mode 100644 index 00000000..ac7c5776 --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/css/site.css @@ -0,0 +1,97 @@ +/*! + * Start Bootstrap - Shop Homepage (http://startbootstrap.com/) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ + +body { + padding-top: 70px; /* Required padding for .navbar-fixed-top. Remove if using .navbar-static-top. Change if height of navigation changes. */ + background-repeat: repeat; + font-family: 'Source Sans Pro', sans-serif; +} + + +.slide-image { + width: 100%; +} + +.carousel-holder { + margin-bottom: 30px; +} + +.carousel-control, +.item { + border-radius: 4px; +} + +.caption { + height: 130px; + overflow: hidden; +} + + .caption h4 { + white-space: nowrap; + } + +.thumbnail img { + width: 100%; +} + +.addToCart { + padding-right: 10px; + padding-left: 10px; +} + +.thumbnail { + padding: 0; +} + + .thumbnail .caption-full { + padding: 9px; + color: #333; + } + +footer { + margin: 50px 0; +} + +.navbar { + background-image: none; +} + +.navbar-inverse { + background-color: #a593c2; + border-color: #a593c2; +} + +.nav.navbar-nav.navbar-right li a { + color: white; + font-size: 1.2em; +} + +.navbar .nav > li > a { + font-size: 1.2em; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + color: white; +} + +.carousel .item { + height: 400px; +} + +.item img { + position: absolute; + top: 0; + left: 0; + min-height: 400px; +} + +.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { + background-color: #fcaeae !important; + border-color: #fba1a1 !important; +} + +.btn { + background-color: #fcaeae !important; + border-color: #fba1a1 !important; +} diff --git a/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/dist/site.entry.js b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/dist/site.entry.js new file mode 100644 index 00000000..33438f2b --- /dev/null +++ b/Lectures/Lecture_11/CookBook_backend/sln/CookBook.Web.MVC/wwwroot/dist/site.entry.js @@ -0,0 +1,20516 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./wwwroot/js/site.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/bootstrap/dist/css/bootstrap.css": +/*!*******************************************************!*\ + !*** ./node_modules/bootstrap/dist/css/bootstrap.css ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var api = __webpack_require__(/*! ../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); + var content = __webpack_require__(/*! !../../../css-loader/dist/cjs.js!./bootstrap.css */ "./node_modules/css-loader/dist/cjs.js!./node_modules/bootstrap/dist/css/bootstrap.css"); + + content = content.__esModule ? content.default : content; + + if (typeof content === 'string') { + content = [[module.i, content, '']]; + } + +var options = {}; + +options.insert = "head"; +options.singleton = false; + +var update = api(content, options); + +var exported = content.locals ? content.locals : {}; + + + +module.exports = exported; + +/***/ }), + +/***/ "./node_modules/bootstrap/dist/js/bootstrap.js": +/*!*****************************************************!*\ + !*** ./node_modules/bootstrap/dist/js/bootstrap.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +(function (global, factory) { + true ? factory(exports, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! popper.js */ "./node_modules/popper.js/dist/esm/popper.js")) : + undefined; +}(this, (function (exports, $, Popper) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + keys.push.apply(keys, symbols); + } + + return keys; + } + + function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.4.1): util.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Private TransitionEnd Helpers + * ------------------------------------------------------------------------ + */ + + var TRANSITION_END = 'transitionend'; + var MAX_UID = 1000000; + var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) + + function toType(obj) { + return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); + } + + function getSpecialTransitionEndEvent() { + return { + bindType: TRANSITION_END, + delegateType: TRANSITION_END, + handle: function handle(event) { + if ($(event.target).is(this)) { + return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params + } + + return undefined; // eslint-disable-line no-undefined + } + }; + } + + function transitionEndEmulator(duration) { + var _this = this; + + var called = false; + $(this).one(Util.TRANSITION_END, function () { + called = true; + }); + setTimeout(function () { + if (!called) { + Util.triggerTransitionEnd(_this); + } + }, duration); + return this; + } + + function setTransitionEndSupport() { + $.fn.emulateTransitionEnd = transitionEndEmulator; + $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); + } + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ + + + var Util = { + TRANSITION_END: 'bsTransitionEnd', + getUID: function getUID(prefix) { + do { + // eslint-disable-next-line no-bitwise + prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here + } while (document.getElementById(prefix)); + + return prefix; + }, + getSelectorFromElement: function getSelectorFromElement(element) { + var selector = element.getAttribute('data-target'); + + if (!selector || selector === '#') { + var hrefAttr = element.getAttribute('href'); + selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; + } + + try { + return document.querySelector(selector) ? selector : null; + } catch (err) { + return null; + } + }, + getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { + if (!element) { + return 0; + } // Get transition-duration of the element + + + var transitionDuration = $(element).css('transition-duration'); + var transitionDelay = $(element).css('transition-delay'); + var floatTransitionDuration = parseFloat(transitionDuration); + var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found + + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } // If multiple durations are defined, take the first + + + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }, + reflow: function reflow(element) { + return element.offsetHeight; + }, + triggerTransitionEnd: function triggerTransitionEnd(element) { + $(element).trigger(TRANSITION_END); + }, + // TODO: Remove in v5 + supportsTransitionEnd: function supportsTransitionEnd() { + return Boolean(TRANSITION_END); + }, + isElement: function isElement(obj) { + return (obj[0] || obj).nodeType; + }, + typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { + for (var property in configTypes) { + if (Object.prototype.hasOwnProperty.call(configTypes, property)) { + var expectedTypes = configTypes[property]; + var value = config[property]; + var valueType = value && Util.isElement(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); + } + } + } + }, + findShadowRoot: function findShadowRoot(element) { + if (!document.documentElement.attachShadow) { + return null; + } // Can find the shadow root otherwise it'll return the document + + + if (typeof element.getRootNode === 'function') { + var root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + + if (element instanceof ShadowRoot) { + return element; + } // when we don't find a shadow root + + + if (!element.parentNode) { + return null; + } + + return Util.findShadowRoot(element.parentNode); + }, + jQueryDetection: function jQueryDetection() { + if (typeof $ === 'undefined') { + throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); + } + + var version = $.fn.jquery.split(' ')[0].split('.'); + var minMajor = 1; + var ltMajor = 2; + var minMinor = 9; + var minPatch = 1; + var maxMajor = 4; + + if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { + throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); + } + } + }; + Util.jQueryDetection(); + setTransitionEndSupport(); + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'alert'; + var VERSION = '4.4.1'; + var DATA_KEY = 'bs.alert'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var Selector = { + DISMISS: '[data-dismiss="alert"]' + }; + var Event = { + CLOSE: "close" + EVENT_KEY, + CLOSED: "closed" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + ALERT: 'alert', + FADE: 'fade', + SHOW: 'show' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Alert = + /*#__PURE__*/ + function () { + function Alert(element) { + this._element = element; + } // Getters + + + var _proto = Alert.prototype; + + // Public + _proto.close = function close(element) { + var rootElement = this._element; + + if (element) { + rootElement = this._getRootElement(element); + } + + var customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent.isDefaultPrevented()) { + return; + } + + this._removeElement(rootElement); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + this._element = null; + } // Private + ; + + _proto._getRootElement = function _getRootElement(element) { + var selector = Util.getSelectorFromElement(element); + var parent = false; + + if (selector) { + parent = document.querySelector(selector); + } + + if (!parent) { + parent = $(element).closest("." + ClassName.ALERT)[0]; + } + + return parent; + }; + + _proto._triggerCloseEvent = function _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE); + $(element).trigger(closeEvent); + return closeEvent; + }; + + _proto._removeElement = function _removeElement(element) { + var _this = this; + + $(element).removeClass(ClassName.SHOW); + + if (!$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element); + + return; + } + + var transitionDuration = Util.getTransitionDurationFromElement(element); + $(element).one(Util.TRANSITION_END, function (event) { + return _this._destroyElement(element, event); + }).emulateTransitionEnd(transitionDuration); + }; + + _proto._destroyElement = function _destroyElement(element) { + $(element).detach().trigger(Event.CLOSED).remove(); + } // Static + ; + + Alert._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $element = $(this); + var data = $element.data(DATA_KEY); + + if (!data) { + data = new Alert(this); + $element.data(DATA_KEY, data); + } + + if (config === 'close') { + data[config](this); + } + }); + }; + + Alert._handleDismiss = function _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + }; + + _createClass(Alert, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }]); + + return Alert; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert())); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Alert._jQueryInterface; + $.fn[NAME].Constructor = Alert; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Alert._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$1 = 'button'; + var VERSION$1 = '4.4.1'; + var DATA_KEY$1 = 'bs.button'; + var EVENT_KEY$1 = "." + DATA_KEY$1; + var DATA_API_KEY$1 = '.data-api'; + var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1]; + var ClassName$1 = { + ACTIVE: 'active', + BUTTON: 'btn', + FOCUS: 'focus' + }; + var Selector$1 = { + DATA_TOGGLE_CARROT: '[data-toggle^="button"]', + DATA_TOGGLES: '[data-toggle="buttons"]', + DATA_TOGGLE: '[data-toggle="button"]', + DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn', + INPUT: 'input:not([type="hidden"])', + ACTIVE: '.active', + BUTTON: '.btn' + }; + var Event$1 = { + CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1, + FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1), + LOAD_DATA_API: "load" + EVENT_KEY$1 + DATA_API_KEY$1 + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Button = + /*#__PURE__*/ + function () { + function Button(element) { + this._element = element; + } // Getters + + + var _proto = Button.prototype; + + // Public + _proto.toggle = function toggle() { + var triggerChangeEvent = true; + var addAriaPressed = true; + var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLES)[0]; + + if (rootElement) { + var input = this._element.querySelector(Selector$1.INPUT); + + if (input) { + if (input.type === 'radio') { + if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) { + triggerChangeEvent = false; + } else { + var activeElement = rootElement.querySelector(Selector$1.ACTIVE); + + if (activeElement) { + $(activeElement).removeClass(ClassName$1.ACTIVE); + } + } + } else if (input.type === 'checkbox') { + if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName$1.ACTIVE)) { + triggerChangeEvent = false; + } + } else { + // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input + triggerChangeEvent = false; + } + + if (triggerChangeEvent) { + input.checked = !this._element.classList.contains(ClassName$1.ACTIVE); + $(input).trigger('change'); + } + + input.focus(); + addAriaPressed = false; + } + } + + if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) { + if (addAriaPressed) { + this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE)); + } + + if (triggerChangeEvent) { + $(this._element).toggleClass(ClassName$1.ACTIVE); + } + } + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$1); + this._element = null; + } // Static + ; + + Button._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$1); + + if (!data) { + data = new Button(this); + $(this).data(DATA_KEY$1, data); + } + + if (config === 'toggle') { + data[config](); + } + }); + }; + + _createClass(Button, null, [{ + key: "VERSION", + get: function get() { + return VERSION$1; + } + }]); + + return Button; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { + var button = event.target; + + if (!$(button).hasClass(ClassName$1.BUTTON)) { + button = $(button).closest(Selector$1.BUTTON)[0]; + } + + if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) { + event.preventDefault(); // work around Firefox bug #1540995 + } else { + var inputBtn = button.querySelector(Selector$1.INPUT); + + if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) { + event.preventDefault(); // work around Firefox bug #1540995 + + return; + } + + Button._jQueryInterface.call($(button), 'toggle'); + } + }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { + var button = $(event.target).closest(Selector$1.BUTTON)[0]; + $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type)); + }); + $(window).on(Event$1.LOAD_DATA_API, function () { + // ensure correct active class is set to match the controls' actual values/states + // find all checkboxes/readio buttons inside data-toggle groups + var buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLES_BUTTONS)); + + for (var i = 0, len = buttons.length; i < len; i++) { + var button = buttons[i]; + var input = button.querySelector(Selector$1.INPUT); + + if (input.checked || input.hasAttribute('checked')) { + button.classList.add(ClassName$1.ACTIVE); + } else { + button.classList.remove(ClassName$1.ACTIVE); + } + } // find all button toggles + + + buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLE)); + + for (var _i = 0, _len = buttons.length; _i < _len; _i++) { + var _button = buttons[_i]; + + if (_button.getAttribute('aria-pressed') === 'true') { + _button.classList.add(ClassName$1.ACTIVE); + } else { + _button.classList.remove(ClassName$1.ACTIVE); + } + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$1] = Button._jQueryInterface; + $.fn[NAME$1].Constructor = Button; + + $.fn[NAME$1].noConflict = function () { + $.fn[NAME$1] = JQUERY_NO_CONFLICT$1; + return Button._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$2 = 'carousel'; + var VERSION$2 = '4.4.1'; + var DATA_KEY$2 = 'bs.carousel'; + var EVENT_KEY$2 = "." + DATA_KEY$2; + var DATA_API_KEY$2 = '.data-api'; + var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2]; + var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key + + var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key + + var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + var SWIPE_THRESHOLD = 40; + var Default = { + interval: 5000, + keyboard: true, + slide: false, + pause: 'hover', + wrap: true, + touch: true + }; + var DefaultType = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean' + }; + var Direction = { + NEXT: 'next', + PREV: 'prev', + LEFT: 'left', + RIGHT: 'right' + }; + var Event$2 = { + SLIDE: "slide" + EVENT_KEY$2, + SLID: "slid" + EVENT_KEY$2, + KEYDOWN: "keydown" + EVENT_KEY$2, + MOUSEENTER: "mouseenter" + EVENT_KEY$2, + MOUSELEAVE: "mouseleave" + EVENT_KEY$2, + TOUCHSTART: "touchstart" + EVENT_KEY$2, + TOUCHMOVE: "touchmove" + EVENT_KEY$2, + TOUCHEND: "touchend" + EVENT_KEY$2, + POINTERDOWN: "pointerdown" + EVENT_KEY$2, + POINTERUP: "pointerup" + EVENT_KEY$2, + DRAG_START: "dragstart" + EVENT_KEY$2, + LOAD_DATA_API: "load" + EVENT_KEY$2 + DATA_API_KEY$2, + CLICK_DATA_API: "click" + EVENT_KEY$2 + DATA_API_KEY$2 + }; + var ClassName$2 = { + CAROUSEL: 'carousel', + ACTIVE: 'active', + SLIDE: 'slide', + RIGHT: 'carousel-item-right', + LEFT: 'carousel-item-left', + NEXT: 'carousel-item-next', + PREV: 'carousel-item-prev', + ITEM: 'carousel-item', + POINTER_EVENT: 'pointer-event' + }; + var Selector$2 = { + ACTIVE: '.active', + ACTIVE_ITEM: '.active.carousel-item', + ITEM: '.carousel-item', + ITEM_IMG: '.carousel-item img', + NEXT_PREV: '.carousel-item-next, .carousel-item-prev', + INDICATORS: '.carousel-indicators', + DATA_SLIDE: '[data-slide], [data-slide-to]', + DATA_RIDE: '[data-ride="carousel"]' + }; + var PointerType = { + TOUCH: 'touch', + PEN: 'pen' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Carousel = + /*#__PURE__*/ + function () { + function Carousel(element, config) { + this._items = null; + this._interval = null; + this._activeElement = null; + this._isPaused = false; + this._isSliding = false; + this.touchTimeout = null; + this.touchStartX = 0; + this.touchDeltaX = 0; + this._config = this._getConfig(config); + this._element = element; + this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS); + this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); + + this._addEventListeners(); + } // Getters + + + var _proto = Carousel.prototype; + + // Public + _proto.next = function next() { + if (!this._isSliding) { + this._slide(Direction.NEXT); + } + }; + + _proto.nextWhenVisible = function nextWhenVisible() { + // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') { + this.next(); + } + }; + + _proto.prev = function prev() { + if (!this._isSliding) { + this._slide(Direction.PREV); + } + }; + + _proto.pause = function pause(event) { + if (!event) { + this._isPaused = true; + } + + if (this._element.querySelector(Selector$2.NEXT_PREV)) { + Util.triggerTransitionEnd(this._element); + this.cycle(true); + } + + clearInterval(this._interval); + this._interval = null; + }; + + _proto.cycle = function cycle(event) { + if (!event) { + this._isPaused = false; + } + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._config.interval && !this._isPaused) { + this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); + } + }; + + _proto.to = function to(index) { + var _this = this; + + this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM); + + var activeIndex = this._getItemIndex(this._activeElement); + + if (index > this._items.length - 1 || index < 0) { + return; + } + + if (this._isSliding) { + $(this._element).one(Event$2.SLID, function () { + return _this.to(index); + }); + return; + } + + if (activeIndex === index) { + this.pause(); + this.cycle(); + return; + } + + var direction = index > activeIndex ? Direction.NEXT : Direction.PREV; + + this._slide(direction, this._items[index]); + }; + + _proto.dispose = function dispose() { + $(this._element).off(EVENT_KEY$2); + $.removeData(this._element, DATA_KEY$2); + this._items = null; + this._config = null; + this._element = null; + this._interval = null; + this._isPaused = null; + this._isSliding = null; + this._activeElement = null; + this._indicatorsElement = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default, {}, config); + Util.typeCheckConfig(NAME$2, config, DefaultType); + return config; + }; + + _proto._handleSwipe = function _handleSwipe() { + var absDeltax = Math.abs(this.touchDeltaX); + + if (absDeltax <= SWIPE_THRESHOLD) { + return; + } + + var direction = absDeltax / this.touchDeltaX; + this.touchDeltaX = 0; // swipe left + + if (direction > 0) { + this.prev(); + } // swipe right + + + if (direction < 0) { + this.next(); + } + }; + + _proto._addEventListeners = function _addEventListeners() { + var _this2 = this; + + if (this._config.keyboard) { + $(this._element).on(Event$2.KEYDOWN, function (event) { + return _this2._keydown(event); + }); + } + + if (this._config.pause === 'hover') { + $(this._element).on(Event$2.MOUSEENTER, function (event) { + return _this2.pause(event); + }).on(Event$2.MOUSELEAVE, function (event) { + return _this2.cycle(event); + }); + } + + if (this._config.touch) { + this._addTouchEventListeners(); + } + }; + + _proto._addTouchEventListeners = function _addTouchEventListeners() { + var _this3 = this; + + if (!this._touchSupported) { + return; + } + + var start = function start(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchStartX = event.originalEvent.clientX; + } else if (!_this3._pointerEvent) { + _this3.touchStartX = event.originalEvent.touches[0].clientX; + } + }; + + var move = function move(event) { + // ensure swiping with one touch and not pinching + if (event.originalEvent.touches && event.originalEvent.touches.length > 1) { + _this3.touchDeltaX = 0; + } else { + _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX; + } + }; + + var end = function end(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; + } + + _this3._handleSwipe(); + + if (_this3._config.pause === 'hover') { + // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + _this3.pause(); + + if (_this3.touchTimeout) { + clearTimeout(_this3.touchTimeout); + } + + _this3.touchTimeout = setTimeout(function (event) { + return _this3.cycle(event); + }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); + } + }; + + $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) { + return e.preventDefault(); + }); + + if (this._pointerEvent) { + $(this._element).on(Event$2.POINTERDOWN, function (event) { + return start(event); + }); + $(this._element).on(Event$2.POINTERUP, function (event) { + return end(event); + }); + + this._element.classList.add(ClassName$2.POINTER_EVENT); + } else { + $(this._element).on(Event$2.TOUCHSTART, function (event) { + return start(event); + }); + $(this._element).on(Event$2.TOUCHMOVE, function (event) { + return move(event); + }); + $(this._element).on(Event$2.TOUCHEND, function (event) { + return end(event); + }); + } + }; + + _proto._keydown = function _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + + switch (event.which) { + case ARROW_LEFT_KEYCODE: + event.preventDefault(); + this.prev(); + break; + + case ARROW_RIGHT_KEYCODE: + event.preventDefault(); + this.next(); + break; + } + }; + + _proto._getItemIndex = function _getItemIndex(element) { + this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : []; + return this._items.indexOf(element); + }; + + _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { + var isNextDirection = direction === Direction.NEXT; + var isPrevDirection = direction === Direction.PREV; + + var activeIndex = this._getItemIndex(activeElement); + + var lastItemIndex = this._items.length - 1; + var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; + + if (isGoingToWrap && !this._config.wrap) { + return activeElement; + } + + var delta = direction === Direction.PREV ? -1 : 1; + var itemIndex = (activeIndex + delta) % this._items.length; + return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; + }; + + _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { + var targetIndex = this._getItemIndex(relatedTarget); + + var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM)); + + var slideEvent = $.Event(Event$2.SLIDE, { + relatedTarget: relatedTarget, + direction: eventDirectionName, + from: fromIndex, + to: targetIndex + }); + $(this._element).trigger(slideEvent); + return slideEvent; + }; + + _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { + if (this._indicatorsElement) { + var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE)); + $(indicators).removeClass(ClassName$2.ACTIVE); + + var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; + + if (nextIndicator) { + $(nextIndicator).addClass(ClassName$2.ACTIVE); + } + } + }; + + _proto._slide = function _slide(direction, element) { + var _this4 = this; + + var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM); + + var activeElementIndex = this._getItemIndex(activeElement); + + var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); + + var nextElementIndex = this._getItemIndex(nextElement); + + var isCycling = Boolean(this._interval); + var directionalClassName; + var orderClassName; + var eventDirectionName; + + if (direction === Direction.NEXT) { + directionalClassName = ClassName$2.LEFT; + orderClassName = ClassName$2.NEXT; + eventDirectionName = Direction.LEFT; + } else { + directionalClassName = ClassName$2.RIGHT; + orderClassName = ClassName$2.PREV; + eventDirectionName = Direction.RIGHT; + } + + if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) { + this._isSliding = false; + return; + } + + var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); + + if (slideEvent.isDefaultPrevented()) { + return; + } + + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + return; + } + + this._isSliding = true; + + if (isCycling) { + this.pause(); + } + + this._setActiveIndicatorElement(nextElement); + + var slidEvent = $.Event(Event$2.SLID, { + relatedTarget: nextElement, + direction: eventDirectionName, + from: activeElementIndex, + to: nextElementIndex + }); + + if ($(this._element).hasClass(ClassName$2.SLIDE)) { + $(nextElement).addClass(orderClassName); + Util.reflow(nextElement); + $(activeElement).addClass(directionalClassName); + $(nextElement).addClass(directionalClassName); + var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10); + + if (nextElementInterval) { + this._config.defaultInterval = this._config.defaultInterval || this._config.interval; + this._config.interval = nextElementInterval; + } else { + this._config.interval = this._config.defaultInterval || this._config.interval; + } + + var transitionDuration = Util.getTransitionDurationFromElement(activeElement); + $(activeElement).one(Util.TRANSITION_END, function () { + $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName$2.ACTIVE); + $(activeElement).removeClass(ClassName$2.ACTIVE + " " + orderClassName + " " + directionalClassName); + _this4._isSliding = false; + setTimeout(function () { + return $(_this4._element).trigger(slidEvent); + }, 0); + }).emulateTransitionEnd(transitionDuration); + } else { + $(activeElement).removeClass(ClassName$2.ACTIVE); + $(nextElement).addClass(ClassName$2.ACTIVE); + this._isSliding = false; + $(this._element).trigger(slidEvent); + } + + if (isCycling) { + this.cycle(); + } + } // Static + ; + + Carousel._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$2); + + var _config = _objectSpread2({}, Default, {}, $(this).data()); + + if (typeof config === 'object') { + _config = _objectSpread2({}, _config, {}, config); + } + + var action = typeof config === 'string' ? config : _config.slide; + + if (!data) { + data = new Carousel(this, _config); + $(this).data(DATA_KEY$2, data); + } + + if (typeof config === 'number') { + data.to(config); + } else if (typeof action === 'string') { + if (typeof data[action] === 'undefined') { + throw new TypeError("No method named \"" + action + "\""); + } + + data[action](); + } else if (_config.interval && _config.ride) { + data.pause(); + data.cycle(); + } + }); + }; + + Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { + var selector = Util.getSelectorFromElement(this); + + if (!selector) { + return; + } + + var target = $(selector)[0]; + + if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) { + return; + } + + var config = _objectSpread2({}, $(target).data(), {}, $(this).data()); + + var slideIndex = this.getAttribute('data-slide-to'); + + if (slideIndex) { + config.interval = false; + } + + Carousel._jQueryInterface.call($(target), config); + + if (slideIndex) { + $(target).data(DATA_KEY$2).to(slideIndex); + } + + event.preventDefault(); + }; + + _createClass(Carousel, null, [{ + key: "VERSION", + get: function get() { + return VERSION$2; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return Carousel; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler); + $(window).on(Event$2.LOAD_DATA_API, function () { + var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE)); + + for (var i = 0, len = carousels.length; i < len; i++) { + var $carousel = $(carousels[i]); + + Carousel._jQueryInterface.call($carousel, $carousel.data()); + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$2] = Carousel._jQueryInterface; + $.fn[NAME$2].Constructor = Carousel; + + $.fn[NAME$2].noConflict = function () { + $.fn[NAME$2] = JQUERY_NO_CONFLICT$2; + return Carousel._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$3 = 'collapse'; + var VERSION$3 = '4.4.1'; + var DATA_KEY$3 = 'bs.collapse'; + var EVENT_KEY$3 = "." + DATA_KEY$3; + var DATA_API_KEY$3 = '.data-api'; + var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3]; + var Default$1 = { + toggle: true, + parent: '' + }; + var DefaultType$1 = { + toggle: 'boolean', + parent: '(string|element)' + }; + var Event$3 = { + SHOW: "show" + EVENT_KEY$3, + SHOWN: "shown" + EVENT_KEY$3, + HIDE: "hide" + EVENT_KEY$3, + HIDDEN: "hidden" + EVENT_KEY$3, + CLICK_DATA_API: "click" + EVENT_KEY$3 + DATA_API_KEY$3 + }; + var ClassName$3 = { + SHOW: 'show', + COLLAPSE: 'collapse', + COLLAPSING: 'collapsing', + COLLAPSED: 'collapsed' + }; + var Dimension = { + WIDTH: 'width', + HEIGHT: 'height' + }; + var Selector$3 = { + ACTIVES: '.show, .collapsing', + DATA_TOGGLE: '[data-toggle="collapse"]' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Collapse = + /*#__PURE__*/ + function () { + function Collapse(element, config) { + this._isTransitioning = false; + this._element = element; + this._config = this._getConfig(config); + this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); + var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE)); + + for (var i = 0, len = toggleList.length; i < len; i++) { + var elem = toggleList[i]; + var selector = Util.getSelectorFromElement(elem); + var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { + return foundElem === element; + }); + + if (selector !== null && filterElement.length > 0) { + this._selector = selector; + + this._triggerArray.push(elem); + } + } + + this._parent = this._config.parent ? this._getParent() : null; + + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._element, this._triggerArray); + } + + if (this._config.toggle) { + this.toggle(); + } + } // Getters + + + var _proto = Collapse.prototype; + + // Public + _proto.toggle = function toggle() { + if ($(this._element).hasClass(ClassName$3.SHOW)) { + this.hide(); + } else { + this.show(); + } + }; + + _proto.show = function show() { + var _this = this; + + if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) { + return; + } + + var actives; + var activesData; + + if (this._parent) { + actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) { + if (typeof _this._config.parent === 'string') { + return elem.getAttribute('data-parent') === _this._config.parent; + } + + return elem.classList.contains(ClassName$3.COLLAPSE); + }); + + if (actives.length === 0) { + actives = null; + } + } + + if (actives) { + activesData = $(actives).not(this._selector).data(DATA_KEY$3); + + if (activesData && activesData._isTransitioning) { + return; + } + } + + var startEvent = $.Event(Event$3.SHOW); + $(this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + if (actives) { + Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide'); + + if (!activesData) { + $(actives).data(DATA_KEY$3, null); + } + } + + var dimension = this._getDimension(); + + $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING); + this._element.style[dimension] = 0; + + if (this._triggerArray.length) { + $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true); + } + + this.setTransitioning(true); + + var complete = function complete() { + $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW); + _this._element.style[dimension] = ''; + + _this.setTransitioning(false); + + $(_this._element).trigger(Event$3.SHOWN); + }; + + var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + var scrollSize = "scroll" + capitalizedDimension; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + this._element.style[dimension] = this._element[scrollSize] + "px"; + }; + + _proto.hide = function hide() { + var _this2 = this; + + if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) { + return; + } + + var startEvent = $.Event(Event$3.HIDE); + $(this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + var dimension = this._getDimension(); + + this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; + Util.reflow(this._element); + $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW); + var triggerArrayLength = this._triggerArray.length; + + if (triggerArrayLength > 0) { + for (var i = 0; i < triggerArrayLength; i++) { + var trigger = this._triggerArray[i]; + var selector = Util.getSelectorFromElement(trigger); + + if (selector !== null) { + var $elem = $([].slice.call(document.querySelectorAll(selector))); + + if (!$elem.hasClass(ClassName$3.SHOW)) { + $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false); + } + } + } + } + + this.setTransitioning(true); + + var complete = function complete() { + _this2.setTransitioning(false); + + $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN); + }; + + this._element.style[dimension] = ''; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + }; + + _proto.setTransitioning = function setTransitioning(isTransitioning) { + this._isTransitioning = isTransitioning; + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$3); + this._config = null; + this._parent = null; + this._element = null; + this._triggerArray = null; + this._isTransitioning = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default$1, {}, config); + config.toggle = Boolean(config.toggle); // Coerce string values + + Util.typeCheckConfig(NAME$3, config, DefaultType$1); + return config; + }; + + _proto._getDimension = function _getDimension() { + var hasWidth = $(this._element).hasClass(Dimension.WIDTH); + return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT; + }; + + _proto._getParent = function _getParent() { + var _this3 = this; + + var parent; + + if (Util.isElement(this._config.parent)) { + parent = this._config.parent; // It's a jQuery object + + if (typeof this._config.parent.jquery !== 'undefined') { + parent = this._config.parent[0]; + } + } else { + parent = document.querySelector(this._config.parent); + } + + var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; + var children = [].slice.call(parent.querySelectorAll(selector)); + $(children).each(function (i, element) { + _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); + }); + return parent; + }; + + _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { + var isOpen = $(element).hasClass(ClassName$3.SHOW); + + if (triggerArray.length) { + $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); + } + } // Static + ; + + Collapse._getTargetFromElement = function _getTargetFromElement(element) { + var selector = Util.getSelectorFromElement(element); + return selector ? document.querySelector(selector) : null; + }; + + Collapse._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $this = $(this); + var data = $this.data(DATA_KEY$3); + + var _config = _objectSpread2({}, Default$1, {}, $this.data(), {}, typeof config === 'object' && config ? config : {}); + + if (!data && _config.toggle && /show|hide/.test(config)) { + _config.toggle = false; + } + + if (!data) { + data = new Collapse(this, _config); + $this.data(DATA_KEY$3, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Collapse, null, [{ + key: "VERSION", + get: function get() { + return VERSION$3; + } + }, { + key: "Default", + get: function get() { + return Default$1; + } + }]); + + return Collapse; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) { + // preventDefault only for elements (which change the URL) not inside the collapsible element + if (event.currentTarget.tagName === 'A') { + event.preventDefault(); + } + + var $trigger = $(this); + var selector = Util.getSelectorFromElement(this); + var selectors = [].slice.call(document.querySelectorAll(selector)); + $(selectors).each(function () { + var $target = $(this); + var data = $target.data(DATA_KEY$3); + var config = data ? 'toggle' : $trigger.data(); + + Collapse._jQueryInterface.call($target, config); + }); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$3] = Collapse._jQueryInterface; + $.fn[NAME$3].Constructor = Collapse; + + $.fn[NAME$3].noConflict = function () { + $.fn[NAME$3] = JQUERY_NO_CONFLICT$3; + return Collapse._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$4 = 'dropdown'; + var VERSION$4 = '4.4.1'; + var DATA_KEY$4 = 'bs.dropdown'; + var EVENT_KEY$4 = "." + DATA_KEY$4; + var DATA_API_KEY$4 = '.data-api'; + var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4]; + var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key + + var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key + + var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key + + var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key + + var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key + + var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) + + var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); + var Event$4 = { + HIDE: "hide" + EVENT_KEY$4, + HIDDEN: "hidden" + EVENT_KEY$4, + SHOW: "show" + EVENT_KEY$4, + SHOWN: "shown" + EVENT_KEY$4, + CLICK: "click" + EVENT_KEY$4, + CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4, + KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4, + KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4 + }; + var ClassName$4 = { + DISABLED: 'disabled', + SHOW: 'show', + DROPUP: 'dropup', + DROPRIGHT: 'dropright', + DROPLEFT: 'dropleft', + MENURIGHT: 'dropdown-menu-right', + MENULEFT: 'dropdown-menu-left', + POSITION_STATIC: 'position-static' + }; + var Selector$4 = { + DATA_TOGGLE: '[data-toggle="dropdown"]', + FORM_CHILD: '.dropdown form', + MENU: '.dropdown-menu', + NAVBAR_NAV: '.navbar-nav', + VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' + }; + var AttachmentMap = { + TOP: 'top-start', + TOPEND: 'top-end', + BOTTOM: 'bottom-start', + BOTTOMEND: 'bottom-end', + RIGHT: 'right-start', + RIGHTEND: 'right-end', + LEFT: 'left-start', + LEFTEND: 'left-end' + }; + var Default$2 = { + offset: 0, + flip: true, + boundary: 'scrollParent', + reference: 'toggle', + display: 'dynamic', + popperConfig: null + }; + var DefaultType$2 = { + offset: '(number|string|function)', + flip: 'boolean', + boundary: '(string|element)', + reference: '(string|element)', + display: 'string', + popperConfig: '(null|object)' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Dropdown = + /*#__PURE__*/ + function () { + function Dropdown(element, config) { + this._element = element; + this._popper = null; + this._config = this._getConfig(config); + this._menu = this._getMenuElement(); + this._inNavbar = this._detectNavbar(); + + this._addEventListeners(); + } // Getters + + + var _proto = Dropdown.prototype; + + // Public + _proto.toggle = function toggle() { + if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) { + return; + } + + var isActive = $(this._menu).hasClass(ClassName$4.SHOW); + + Dropdown._clearMenus(); + + if (isActive) { + return; + } + + this.show(true); + }; + + _proto.show = function show(usePopper) { + if (usePopper === void 0) { + usePopper = false; + } + + if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var showEvent = $.Event(Event$4.SHOW, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $(parent).trigger(showEvent); + + if (showEvent.isDefaultPrevented()) { + return; + } // Disable totally Popper.js for Dropdown in Navbar + + + if (!this._inNavbar && usePopper) { + /** + * Check for Popper dependency + * Popper - https://popper.js.org + */ + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)'); + } + + var referenceElement = this._element; + + if (this._config.reference === 'parent') { + referenceElement = parent; + } else if (Util.isElement(this._config.reference)) { + referenceElement = this._config.reference; // Check if it's jQuery element + + if (typeof this._config.reference.jquery !== 'undefined') { + referenceElement = this._config.reference[0]; + } + } // If boundary is not `scrollParent`, then set position to `static` + // to allow the menu to "escape" the scroll parent's boundaries + // https://github.com/twbs/bootstrap/issues/24251 + + + if (this._config.boundary !== 'scrollParent') { + $(parent).addClass(ClassName$4.POSITION_STATIC); + } + + this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()); + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) { + $(document.body).children().on('mouseover', null, $.noop); + } + + this._element.focus(); + + this._element.setAttribute('aria-expanded', true); + + $(this._menu).toggleClass(ClassName$4.SHOW); + $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget)); + }; + + _proto.hide = function hide() { + if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var hideEvent = $.Event(Event$4.HIDE, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $(parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + if (this._popper) { + this._popper.destroy(); + } + + $(this._menu).toggleClass(ClassName$4.SHOW); + $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget)); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$4); + $(this._element).off(EVENT_KEY$4); + this._element = null; + this._menu = null; + + if (this._popper !== null) { + this._popper.destroy(); + + this._popper = null; + } + }; + + _proto.update = function update() { + this._inNavbar = this._detectNavbar(); + + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Private + ; + + _proto._addEventListeners = function _addEventListeners() { + var _this = this; + + $(this._element).on(Event$4.CLICK, function (event) { + event.preventDefault(); + event.stopPropagation(); + + _this.toggle(); + }); + }; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config); + Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType); + return config; + }; + + _proto._getMenuElement = function _getMenuElement() { + if (!this._menu) { + var parent = Dropdown._getParentFromElement(this._element); + + if (parent) { + this._menu = parent.querySelector(Selector$4.MENU); + } + } + + return this._menu; + }; + + _proto._getPlacement = function _getPlacement() { + var $parentDropdown = $(this._element.parentNode); + var placement = AttachmentMap.BOTTOM; // Handle dropup + + if ($parentDropdown.hasClass(ClassName$4.DROPUP)) { + placement = AttachmentMap.TOP; + + if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) { + placement = AttachmentMap.TOPEND; + } + } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) { + placement = AttachmentMap.RIGHT; + } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) { + placement = AttachmentMap.LEFT; + } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) { + placement = AttachmentMap.BOTTOMEND; + } + + return placement; + }; + + _proto._detectNavbar = function _detectNavbar() { + return $(this._element).closest('.navbar').length > 0; + }; + + _proto._getOffset = function _getOffset() { + var _this2 = this; + + var offset = {}; + + if (typeof this._config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {}); + return data; + }; + } else { + offset.offset = this._config.offset; + } + + return offset; + }; + + _proto._getPopperConfig = function _getPopperConfig() { + var popperConfig = { + placement: this._getPlacement(), + modifiers: { + offset: this._getOffset(), + flip: { + enabled: this._config.flip + }, + preventOverflow: { + boundariesElement: this._config.boundary + } + } + }; // Disable Popper.js if we have a static display + + if (this._config.display === 'static') { + popperConfig.modifiers.applyStyle = { + enabled: false + }; + } + + return _objectSpread2({}, popperConfig, {}, this._config.popperConfig); + } // Static + ; + + Dropdown._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$4); + + var _config = typeof config === 'object' ? config : null; + + if (!data) { + data = new Dropdown(this, _config); + $(this).data(DATA_KEY$4, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + Dropdown._clearMenus = function _clearMenus(event) { + if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { + return; + } + + var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE)); + + for (var i = 0, len = toggles.length; i < len; i++) { + var parent = Dropdown._getParentFromElement(toggles[i]); + + var context = $(toggles[i]).data(DATA_KEY$4); + var relatedTarget = { + relatedTarget: toggles[i] + }; + + if (event && event.type === 'click') { + relatedTarget.clickEvent = event; + } + + if (!context) { + continue; + } + + var dropdownMenu = context._menu; + + if (!$(parent).hasClass(ClassName$4.SHOW)) { + continue; + } + + if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) { + continue; + } + + var hideEvent = $.Event(Event$4.HIDE, relatedTarget); + $(parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + continue; + } // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().off('mouseover', null, $.noop); + } + + toggles[i].setAttribute('aria-expanded', 'false'); + + if (context._popper) { + context._popper.destroy(); + } + + $(dropdownMenu).removeClass(ClassName$4.SHOW); + $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget)); + } + }; + + Dropdown._getParentFromElement = function _getParentFromElement(element) { + var parent; + var selector = Util.getSelectorFromElement(element); + + if (selector) { + parent = document.querySelector(selector); + } + + return parent || element.parentNode; + } // eslint-disable-next-line complexity + ; + + Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { + // If not input/textarea: + // - And not a key in REGEXP_KEYDOWN => not a dropdown command + // If input/textarea: + // - If space key => not a dropdown command + // - If key is other than escape + // - If key is not up or down => not a dropdown command + // - If trigger inside the menu => not a dropdown command + if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) { + return; + } + + var parent = Dropdown._getParentFromElement(this); + + var isActive = $(parent).hasClass(ClassName$4.SHOW); + + if (!isActive && event.which === ESCAPE_KEYCODE) { + return; + } + + if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { + if (event.which === ESCAPE_KEYCODE) { + var toggle = parent.querySelector(Selector$4.DATA_TOGGLE); + $(toggle).trigger('focus'); + } + + $(this).trigger('click'); + return; + } + + var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)).filter(function (item) { + return $(item).is(':visible'); + }); + + if (items.length === 0) { + return; + } + + var index = items.indexOf(event.target); + + if (event.which === ARROW_UP_KEYCODE && index > 0) { + // Up + index--; + } + + if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { + // Down + index++; + } + + if (index < 0) { + index = 0; + } + + items[index].focus(); + }; + + _createClass(Dropdown, null, [{ + key: "VERSION", + get: function get() { + return VERSION$4; + } + }, { + key: "Default", + get: function get() { + return Default$2; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$2; + } + }]); + + return Dropdown; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + " " + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) { + event.preventDefault(); + event.stopPropagation(); + + Dropdown._jQueryInterface.call($(this), 'toggle'); + }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) { + e.stopPropagation(); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$4] = Dropdown._jQueryInterface; + $.fn[NAME$4].Constructor = Dropdown; + + $.fn[NAME$4].noConflict = function () { + $.fn[NAME$4] = JQUERY_NO_CONFLICT$4; + return Dropdown._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$5 = 'modal'; + var VERSION$5 = '4.4.1'; + var DATA_KEY$5 = 'bs.modal'; + var EVENT_KEY$5 = "." + DATA_KEY$5; + var DATA_API_KEY$5 = '.data-api'; + var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5]; + var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key + + var Default$3 = { + backdrop: true, + keyboard: true, + focus: true, + show: true + }; + var DefaultType$3 = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean', + show: 'boolean' + }; + var Event$5 = { + HIDE: "hide" + EVENT_KEY$5, + HIDE_PREVENTED: "hidePrevented" + EVENT_KEY$5, + HIDDEN: "hidden" + EVENT_KEY$5, + SHOW: "show" + EVENT_KEY$5, + SHOWN: "shown" + EVENT_KEY$5, + FOCUSIN: "focusin" + EVENT_KEY$5, + RESIZE: "resize" + EVENT_KEY$5, + CLICK_DISMISS: "click.dismiss" + EVENT_KEY$5, + KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY$5, + MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY$5, + MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY$5, + CLICK_DATA_API: "click" + EVENT_KEY$5 + DATA_API_KEY$5 + }; + var ClassName$5 = { + SCROLLABLE: 'modal-dialog-scrollable', + SCROLLBAR_MEASURER: 'modal-scrollbar-measure', + BACKDROP: 'modal-backdrop', + OPEN: 'modal-open', + FADE: 'fade', + SHOW: 'show', + STATIC: 'modal-static' + }; + var Selector$5 = { + DIALOG: '.modal-dialog', + MODAL_BODY: '.modal-body', + DATA_TOGGLE: '[data-toggle="modal"]', + DATA_DISMISS: '[data-dismiss="modal"]', + FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', + STICKY_CONTENT: '.sticky-top' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Modal = + /*#__PURE__*/ + function () { + function Modal(element, config) { + this._config = this._getConfig(config); + this._element = element; + this._dialog = element.querySelector(Selector$5.DIALOG); + this._backdrop = null; + this._isShown = false; + this._isBodyOverflowing = false; + this._ignoreBackdropClick = false; + this._isTransitioning = false; + this._scrollbarWidth = 0; + } // Getters + + + var _proto = Modal.prototype; + + // Public + _proto.toggle = function toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + }; + + _proto.show = function show(relatedTarget) { + var _this = this; + + if (this._isShown || this._isTransitioning) { + return; + } + + if ($(this._element).hasClass(ClassName$5.FADE)) { + this._isTransitioning = true; + } + + var showEvent = $.Event(Event$5.SHOW, { + relatedTarget: relatedTarget + }); + $(this._element).trigger(showEvent); + + if (this._isShown || showEvent.isDefaultPrevented()) { + return; + } + + this._isShown = true; + + this._checkScrollbar(); + + this._setScrollbar(); + + this._adjustDialog(); + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) { + return _this.hide(event); + }); + $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () { + $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) { + if ($(event.target).is(_this._element)) { + _this._ignoreBackdropClick = true; + } + }); + }); + + this._showBackdrop(function () { + return _this._showElement(relatedTarget); + }); + }; + + _proto.hide = function hide(event) { + var _this2 = this; + + if (event) { + event.preventDefault(); + } + + if (!this._isShown || this._isTransitioning) { + return; + } + + var hideEvent = $.Event(Event$5.HIDE); + $(this._element).trigger(hideEvent); + + if (!this._isShown || hideEvent.isDefaultPrevented()) { + return; + } + + this._isShown = false; + var transition = $(this._element).hasClass(ClassName$5.FADE); + + if (transition) { + this._isTransitioning = true; + } + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $(document).off(Event$5.FOCUSIN); + $(this._element).removeClass(ClassName$5.SHOW); + $(this._element).off(Event$5.CLICK_DISMISS); + $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS); + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, function (event) { + return _this2._hideModal(event); + }).emulateTransitionEnd(transitionDuration); + } else { + this._hideModal(); + } + }; + + _proto.dispose = function dispose() { + [window, this._element, this._dialog].forEach(function (htmlElement) { + return $(htmlElement).off(EVENT_KEY$5); + }); + /** + * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API` + * Do not move `document` in `htmlElements` array + * It will remove `Event.CLICK_DATA_API` event that should remain + */ + + $(document).off(Event$5.FOCUSIN); + $.removeData(this._element, DATA_KEY$5); + this._config = null; + this._element = null; + this._dialog = null; + this._backdrop = null; + this._isShown = null; + this._isBodyOverflowing = null; + this._ignoreBackdropClick = null; + this._isTransitioning = null; + this._scrollbarWidth = null; + }; + + _proto.handleUpdate = function handleUpdate() { + this._adjustDialog(); + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default$3, {}, config); + Util.typeCheckConfig(NAME$5, config, DefaultType$3); + return config; + }; + + _proto._triggerBackdropTransition = function _triggerBackdropTransition() { + var _this3 = this; + + if (this._config.backdrop === 'static') { + var hideEventPrevented = $.Event(Event$5.HIDE_PREVENTED); + $(this._element).trigger(hideEventPrevented); + + if (hideEventPrevented.defaultPrevented) { + return; + } + + this._element.classList.add(ClassName$5.STATIC); + + var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, function () { + _this3._element.classList.remove(ClassName$5.STATIC); + }).emulateTransitionEnd(modalTransitionDuration); + + this._element.focus(); + } else { + this.hide(); + } + }; + + _proto._showElement = function _showElement(relatedTarget) { + var _this4 = this; + + var transition = $(this._element).hasClass(ClassName$5.FADE); + var modalBody = this._dialog ? this._dialog.querySelector(Selector$5.MODAL_BODY) : null; + + if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { + // Don't move modal's DOM position + document.body.appendChild(this._element); + } + + this._element.style.display = 'block'; + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE) && modalBody) { + modalBody.scrollTop = 0; + } else { + this._element.scrollTop = 0; + } + + if (transition) { + Util.reflow(this._element); + } + + $(this._element).addClass(ClassName$5.SHOW); + + if (this._config.focus) { + this._enforceFocus(); + } + + var shownEvent = $.Event(Event$5.SHOWN, { + relatedTarget: relatedTarget + }); + + var transitionComplete = function transitionComplete() { + if (_this4._config.focus) { + _this4._element.focus(); + } + + _this4._isTransitioning = false; + $(_this4._element).trigger(shownEvent); + }; + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); + $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); + } else { + transitionComplete(); + } + }; + + _proto._enforceFocus = function _enforceFocus() { + var _this5 = this; + + $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop + .on(Event$5.FOCUSIN, function (event) { + if (document !== event.target && _this5._element !== event.target && $(_this5._element).has(event.target).length === 0) { + _this5._element.focus(); + } + }); + }; + + _proto._setEscapeEvent = function _setEscapeEvent() { + var _this6 = this; + + if (this._isShown && this._config.keyboard) { + $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) { + if (event.which === ESCAPE_KEYCODE$1) { + _this6._triggerBackdropTransition(); + } + }); + } else if (!this._isShown) { + $(this._element).off(Event$5.KEYDOWN_DISMISS); + } + }; + + _proto._setResizeEvent = function _setResizeEvent() { + var _this7 = this; + + if (this._isShown) { + $(window).on(Event$5.RESIZE, function (event) { + return _this7.handleUpdate(event); + }); + } else { + $(window).off(Event$5.RESIZE); + } + }; + + _proto._hideModal = function _hideModal() { + var _this8 = this; + + this._element.style.display = 'none'; + + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._isTransitioning = false; + + this._showBackdrop(function () { + $(document.body).removeClass(ClassName$5.OPEN); + + _this8._resetAdjustments(); + + _this8._resetScrollbar(); + + $(_this8._element).trigger(Event$5.HIDDEN); + }); + }; + + _proto._removeBackdrop = function _removeBackdrop() { + if (this._backdrop) { + $(this._backdrop).remove(); + this._backdrop = null; + } + }; + + _proto._showBackdrop = function _showBackdrop(callback) { + var _this9 = this; + + var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : ''; + + if (this._isShown && this._config.backdrop) { + this._backdrop = document.createElement('div'); + this._backdrop.className = ClassName$5.BACKDROP; + + if (animate) { + this._backdrop.classList.add(animate); + } + + $(this._backdrop).appendTo(document.body); + $(this._element).on(Event$5.CLICK_DISMISS, function (event) { + if (_this9._ignoreBackdropClick) { + _this9._ignoreBackdropClick = false; + return; + } + + if (event.target !== event.currentTarget) { + return; + } + + _this9._triggerBackdropTransition(); + }); + + if (animate) { + Util.reflow(this._backdrop); + } + + $(this._backdrop).addClass(ClassName$5.SHOW); + + if (!callback) { + return; + } + + if (!animate) { + callback(); + return; + } + + var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); + } else if (!this._isShown && this._backdrop) { + $(this._backdrop).removeClass(ClassName$5.SHOW); + + var callbackRemove = function callbackRemove() { + _this9._removeBackdrop(); + + if (callback) { + callback(); + } + }; + + if ($(this._element).hasClass(ClassName$5.FADE)) { + var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + + $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); + } else { + callbackRemove(); + } + } else if (callback) { + callback(); + } + } // ---------------------------------------------------------------------- + // the following methods are used to handle overflowing modals + // todo (fat): these should probably be refactored out of modal.js + // ---------------------------------------------------------------------- + ; + + _proto._adjustDialog = function _adjustDialog() { + var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + if (!this._isBodyOverflowing && isModalOverflowing) { + this._element.style.paddingLeft = this._scrollbarWidth + "px"; + } + + if (this._isBodyOverflowing && !isModalOverflowing) { + this._element.style.paddingRight = this._scrollbarWidth + "px"; + } + }; + + _proto._resetAdjustments = function _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + }; + + _proto._checkScrollbar = function _checkScrollbar() { + var rect = document.body.getBoundingClientRect(); + this._isBodyOverflowing = rect.left + rect.right < window.innerWidth; + this._scrollbarWidth = this._getScrollbarWidth(); + }; + + _proto._setScrollbar = function _setScrollbar() { + var _this10 = this; + + if (this._isBodyOverflowing) { + // Note: DOMNode.style.paddingRight returns the actual value or '' if not set + // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set + var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT)); + var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding + + $(fixedContent).each(function (index, element) { + var actualPadding = element.style.paddingRight; + var calculatedPadding = $(element).css('padding-right'); + $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px"); + }); // Adjust sticky content margin + + $(stickyContent).each(function (index, element) { + var actualMargin = element.style.marginRight; + var calculatedMargin = $(element).css('margin-right'); + $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px"); + }); // Adjust body padding + + var actualPadding = document.body.style.paddingRight; + var calculatedPadding = $(document.body).css('padding-right'); + $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); + } + + $(document.body).addClass(ClassName$5.OPEN); + }; + + _proto._resetScrollbar = function _resetScrollbar() { + // Restore fixed content padding + var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT)); + $(fixedContent).each(function (index, element) { + var padding = $(element).data('padding-right'); + $(element).removeData('padding-right'); + element.style.paddingRight = padding ? padding : ''; + }); // Restore sticky content + + var elements = [].slice.call(document.querySelectorAll("" + Selector$5.STICKY_CONTENT)); + $(elements).each(function (index, element) { + var margin = $(element).data('margin-right'); + + if (typeof margin !== 'undefined') { + $(element).css('margin-right', margin).removeData('margin-right'); + } + }); // Restore body padding + + var padding = $(document.body).data('padding-right'); + $(document.body).removeData('padding-right'); + document.body.style.paddingRight = padding ? padding : ''; + }; + + _proto._getScrollbarWidth = function _getScrollbarWidth() { + // thx d.walsh + var scrollDiv = document.createElement('div'); + scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER; + document.body.appendChild(scrollDiv); + var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; + } // Static + ; + + Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { + return this.each(function () { + var data = $(this).data(DATA_KEY$5); + + var _config = _objectSpread2({}, Default$3, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {}); + + if (!data) { + data = new Modal(this, _config); + $(this).data(DATA_KEY$5, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](relatedTarget); + } else if (_config.show) { + data.show(relatedTarget); + } + }); + }; + + _createClass(Modal, null, [{ + key: "VERSION", + get: function get() { + return VERSION$5; + } + }, { + key: "Default", + get: function get() { + return Default$3; + } + }]); + + return Modal; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) { + var _this11 = this; + + var target; + var selector = Util.getSelectorFromElement(this); + + if (selector) { + target = document.querySelector(selector); + } + + var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data()); + + if (this.tagName === 'A' || this.tagName === 'AREA') { + event.preventDefault(); + } + + var $target = $(target).one(Event$5.SHOW, function (showEvent) { + if (showEvent.isDefaultPrevented()) { + // Only register focus restorer if modal will actually get shown + return; + } + + $target.one(Event$5.HIDDEN, function () { + if ($(_this11).is(':visible')) { + _this11.focus(); + } + }); + }); + + Modal._jQueryInterface.call($(target), config, this); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$5] = Modal._jQueryInterface; + $.fn[NAME$5].Constructor = Modal; + + $.fn[NAME$5].noConflict = function () { + $.fn[NAME$5] = JQUERY_NO_CONFLICT$5; + return Modal._jQueryInterface; + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.4.1): tools/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; + var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + var DefaultWhitelist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }; + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi; + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i; + + function allowedAttribute(attr, allowedAttributeList) { + var attrName = attr.nodeName.toLowerCase(); + + if (allowedAttributeList.indexOf(attrName) !== -1) { + if (uriAttrs.indexOf(attrName) !== -1) { + return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)); + } + + return true; + } + + var regExp = allowedAttributeList.filter(function (attrRegex) { + return attrRegex instanceof RegExp; + }); // Check if a regular expression validates the attribute. + + for (var i = 0, l = regExp.length; i < l; i++) { + if (attrName.match(regExp[i])) { + return true; + } + } + + return false; + } + + function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { + if (unsafeHtml.length === 0) { + return unsafeHtml; + } + + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeHtml); + } + + var domParser = new window.DOMParser(); + var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + var whitelistKeys = Object.keys(whiteList); + var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); + + var _loop = function _loop(i, len) { + var el = elements[i]; + var elName = el.nodeName.toLowerCase(); + + if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { + el.parentNode.removeChild(el); + return "continue"; + } + + var attributeList = [].slice.call(el.attributes); + var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); + attributeList.forEach(function (attr) { + if (!allowedAttribute(attr, whitelistedAttributes)) { + el.removeAttribute(attr.nodeName); + } + }); + }; + + for (var i = 0, len = elements.length; i < len; i++) { + var _ret = _loop(i); + + if (_ret === "continue") continue; + } + + return createdDocument.body.innerHTML; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$6 = 'tooltip'; + var VERSION$6 = '4.4.1'; + var DATA_KEY$6 = 'bs.tooltip'; + var EVENT_KEY$6 = "." + DATA_KEY$6; + var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6]; + var CLASS_PREFIX = 'bs-tooltip'; + var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); + var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; + var DefaultType$4 = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(number|string|function)', + container: '(string|element|boolean)', + fallbackPlacement: '(string|array)', + boundary: '(string|element)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + whiteList: 'object', + popperConfig: '(null|object)' + }; + var AttachmentMap$1 = { + AUTO: 'auto', + TOP: 'top', + RIGHT: 'right', + BOTTOM: 'bottom', + LEFT: 'left' + }; + var Default$4 = { + animation: true, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + selector: false, + placement: 'top', + offset: 0, + container: false, + fallbackPlacement: 'flip', + boundary: 'scrollParent', + sanitize: true, + sanitizeFn: null, + whiteList: DefaultWhitelist, + popperConfig: null + }; + var HoverState = { + SHOW: 'show', + OUT: 'out' + }; + var Event$6 = { + HIDE: "hide" + EVENT_KEY$6, + HIDDEN: "hidden" + EVENT_KEY$6, + SHOW: "show" + EVENT_KEY$6, + SHOWN: "shown" + EVENT_KEY$6, + INSERTED: "inserted" + EVENT_KEY$6, + CLICK: "click" + EVENT_KEY$6, + FOCUSIN: "focusin" + EVENT_KEY$6, + FOCUSOUT: "focusout" + EVENT_KEY$6, + MOUSEENTER: "mouseenter" + EVENT_KEY$6, + MOUSELEAVE: "mouseleave" + EVENT_KEY$6 + }; + var ClassName$6 = { + FADE: 'fade', + SHOW: 'show' + }; + var Selector$6 = { + TOOLTIP: '.tooltip', + TOOLTIP_INNER: '.tooltip-inner', + ARROW: '.arrow' + }; + var Trigger = { + HOVER: 'hover', + FOCUS: 'focus', + CLICK: 'click', + MANUAL: 'manual' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Tooltip = + /*#__PURE__*/ + function () { + function Tooltip(element, config) { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)'); + } // private + + + this._isEnabled = true; + this._timeout = 0; + this._hoverState = ''; + this._activeTrigger = {}; + this._popper = null; // Protected + + this.element = element; + this.config = this._getConfig(config); + this.tip = null; + + this._setListeners(); + } // Getters + + + var _proto = Tooltip.prototype; + + // Public + _proto.enable = function enable() { + this._isEnabled = true; + }; + + _proto.disable = function disable() { + this._isEnabled = false; + }; + + _proto.toggleEnabled = function toggleEnabled() { + this._isEnabled = !this._isEnabled; + }; + + _proto.toggle = function toggle(event) { + if (!this._isEnabled) { + return; + } + + if (event) { + var dataKey = this.constructor.DATA_KEY; + var context = $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + context._activeTrigger.click = !context._activeTrigger.click; + + if (context._isWithActiveTrigger()) { + context._enter(null, context); + } else { + context._leave(null, context); + } + } else { + if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) { + this._leave(null, this); + + return; + } + + this._enter(null, this); + } + }; + + _proto.dispose = function dispose() { + clearTimeout(this._timeout); + $.removeData(this.element, this.constructor.DATA_KEY); + $(this.element).off(this.constructor.EVENT_KEY); + $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler); + + if (this.tip) { + $(this.tip).remove(); + } + + this._isEnabled = null; + this._timeout = null; + this._hoverState = null; + this._activeTrigger = null; + + if (this._popper) { + this._popper.destroy(); + } + + this._popper = null; + this.element = null; + this.config = null; + this.tip = null; + }; + + _proto.show = function show() { + var _this = this; + + if ($(this.element).css('display') === 'none') { + throw new Error('Please use show on visible elements'); + } + + var showEvent = $.Event(this.constructor.Event.SHOW); + + if (this.isWithContent() && this._isEnabled) { + $(this.element).trigger(showEvent); + var shadowRoot = Util.findShadowRoot(this.element); + var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); + + if (showEvent.isDefaultPrevented() || !isInTheDom) { + return; + } + + var tip = this.getTipElement(); + var tipId = Util.getUID(this.constructor.NAME); + tip.setAttribute('id', tipId); + this.element.setAttribute('aria-describedby', tipId); + this.setContent(); + + if (this.config.animation) { + $(tip).addClass(ClassName$6.FADE); + } + + var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; + + var attachment = this._getAttachment(placement); + + this.addAttachmentClass(attachment); + + var container = this._getContainer(); + + $(tip).data(this.constructor.DATA_KEY, this); + + if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) { + $(tip).appendTo(container); + } + + $(this.element).trigger(this.constructor.Event.INSERTED); + this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment)); + $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().on('mouseover', null, $.noop); + } + + var complete = function complete() { + if (_this.config.animation) { + _this._fixTransition(); + } + + var prevHoverState = _this._hoverState; + _this._hoverState = null; + $(_this.element).trigger(_this.constructor.Event.SHOWN); + + if (prevHoverState === HoverState.OUT) { + _this._leave(null, _this); + } + }; + + if ($(this.tip).hasClass(ClassName$6.FADE)) { + var transitionDuration = Util.getTransitionDurationFromElement(this.tip); + $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + } + }; + + _proto.hide = function hide(callback) { + var _this2 = this; + + var tip = this.getTipElement(); + var hideEvent = $.Event(this.constructor.Event.HIDE); + + var complete = function complete() { + if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) { + tip.parentNode.removeChild(tip); + } + + _this2._cleanTipClass(); + + _this2.element.removeAttribute('aria-describedby'); + + $(_this2.element).trigger(_this2.constructor.Event.HIDDEN); + + if (_this2._popper !== null) { + _this2._popper.destroy(); + } + + if (callback) { + callback(); + } + }; + + $(this.element).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().off('mouseover', null, $.noop); + } + + this._activeTrigger[Trigger.CLICK] = false; + this._activeTrigger[Trigger.FOCUS] = false; + this._activeTrigger[Trigger.HOVER] = false; + + if ($(this.tip).hasClass(ClassName$6.FADE)) { + var transitionDuration = Util.getTransitionDurationFromElement(tip); + $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + + this._hoverState = ''; + }; + + _proto.update = function update() { + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Protected + ; + + _proto.isWithContent = function isWithContent() { + return Boolean(this.getTitle()); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $(this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var tip = this.getTipElement(); + this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle()); + $(tip).removeClass(ClassName$6.FADE + " " + ClassName$6.SHOW); + }; + + _proto.setElementContent = function setElementContent($element, content) { + if (typeof content === 'object' && (content.nodeType || content.jquery)) { + // Content is a DOM node or a jQuery + if (this.config.html) { + if (!$(content).parent().is($element)) { + $element.empty().append(content); + } + } else { + $element.text($(content).text()); + } + + return; + } + + if (this.config.html) { + if (this.config.sanitize) { + content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); + } + + $element.html(content); + } else { + $element.text(content); + } + }; + + _proto.getTitle = function getTitle() { + var title = this.element.getAttribute('data-original-title'); + + if (!title) { + title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; + } + + return title; + } // Private + ; + + _proto._getPopperConfig = function _getPopperConfig(attachment) { + var _this3 = this; + + var defaultBsConfig = { + placement: attachment, + modifiers: { + offset: this._getOffset(), + flip: { + behavior: this.config.fallbackPlacement + }, + arrow: { + element: Selector$6.ARROW + }, + preventOverflow: { + boundariesElement: this.config.boundary + } + }, + onCreate: function onCreate(data) { + if (data.originalPlacement !== data.placement) { + _this3._handlePopperPlacementChange(data); + } + }, + onUpdate: function onUpdate(data) { + return _this3._handlePopperPlacementChange(data); + } + }; + return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig); + }; + + _proto._getOffset = function _getOffset() { + var _this4 = this; + + var offset = {}; + + if (typeof this.config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {}); + return data; + }; + } else { + offset.offset = this.config.offset; + } + + return offset; + }; + + _proto._getContainer = function _getContainer() { + if (this.config.container === false) { + return document.body; + } + + if (Util.isElement(this.config.container)) { + return $(this.config.container); + } + + return $(document).find(this.config.container); + }; + + _proto._getAttachment = function _getAttachment(placement) { + return AttachmentMap$1[placement.toUpperCase()]; + }; + + _proto._setListeners = function _setListeners() { + var _this5 = this; + + var triggers = this.config.trigger.split(' '); + triggers.forEach(function (trigger) { + if (trigger === 'click') { + $(_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) { + return _this5.toggle(event); + }); + } else if (trigger !== Trigger.MANUAL) { + var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN; + var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT; + $(_this5.element).on(eventIn, _this5.config.selector, function (event) { + return _this5._enter(event); + }).on(eventOut, _this5.config.selector, function (event) { + return _this5._leave(event); + }); + } + }); + + this._hideModalHandler = function () { + if (_this5.element) { + _this5.hide(); + } + }; + + $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler); + + if (this.config.selector) { + this.config = _objectSpread2({}, this.config, { + trigger: 'manual', + selector: '' + }); + } else { + this._fixTitle(); + } + }; + + _proto._fixTitle = function _fixTitle() { + var titleType = typeof this.element.getAttribute('data-original-title'); + + if (this.element.getAttribute('title') || titleType !== 'string') { + this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); + this.element.setAttribute('title', ''); + } + }; + + _proto._enter = function _enter(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; + } + + if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) { + context._hoverState = HoverState.SHOW; + return; + } + + clearTimeout(context._timeout); + context._hoverState = HoverState.SHOW; + + if (!context.config.delay || !context.config.delay.show) { + context.show(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HoverState.SHOW) { + context.show(); + } + }, context.config.delay.show); + }; + + _proto._leave = function _leave(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false; + } + + if (context._isWithActiveTrigger()) { + return; + } + + clearTimeout(context._timeout); + context._hoverState = HoverState.OUT; + + if (!context.config.delay || !context.config.delay.hide) { + context.hide(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HoverState.OUT) { + context.hide(); + } + }, context.config.delay.hide); + }; + + _proto._isWithActiveTrigger = function _isWithActiveTrigger() { + for (var trigger in this._activeTrigger) { + if (this._activeTrigger[trigger]) { + return true; + } + } + + return false; + }; + + _proto._getConfig = function _getConfig(config) { + var dataAttributes = $(this.element).data(); + Object.keys(dataAttributes).forEach(function (dataAttr) { + if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { + delete dataAttributes[dataAttr]; + } + }); + config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {}); + + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + + Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType); + + if (config.sanitize) { + config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); + } + + return config; + }; + + _proto._getDelegateConfig = function _getDelegateConfig() { + var config = {}; + + if (this.config) { + for (var key in this.config) { + if (this.constructor.Default[key] !== this.config[key]) { + config[key] = this.config[key]; + } + } + } + + return config; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $(this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); + + if (tabClass !== null && tabClass.length) { + $tip.removeClass(tabClass.join('')); + } + }; + + _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { + var popperInstance = popperData.instance; + this.tip = popperInstance.popper; + + this._cleanTipClass(); + + this.addAttachmentClass(this._getAttachment(popperData.placement)); + }; + + _proto._fixTransition = function _fixTransition() { + var tip = this.getTipElement(); + var initConfigAnimation = this.config.animation; + + if (tip.getAttribute('x-placement') !== null) { + return; + } + + $(tip).removeClass(ClassName$6.FADE); + this.config.animation = false; + this.hide(); + this.show(); + this.config.animation = initConfigAnimation; + } // Static + ; + + Tooltip._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$6); + + var _config = typeof config === 'object' && config; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Tooltip(this, _config); + $(this).data(DATA_KEY$6, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Tooltip, null, [{ + key: "VERSION", + get: function get() { + return VERSION$6; + } + }, { + key: "Default", + get: function get() { + return Default$4; + } + }, { + key: "NAME", + get: function get() { + return NAME$6; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY$6; + } + }, { + key: "Event", + get: function get() { + return Event$6; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY$6; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$4; + } + }]); + + return Tooltip; + }(); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $.fn[NAME$6] = Tooltip._jQueryInterface; + $.fn[NAME$6].Constructor = Tooltip; + + $.fn[NAME$6].noConflict = function () { + $.fn[NAME$6] = JQUERY_NO_CONFLICT$6; + return Tooltip._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$7 = 'popover'; + var VERSION$7 = '4.4.1'; + var DATA_KEY$7 = 'bs.popover'; + var EVENT_KEY$7 = "." + DATA_KEY$7; + var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7]; + var CLASS_PREFIX$1 = 'bs-popover'; + var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); + + var Default$5 = _objectSpread2({}, Tooltip.Default, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }); + + var DefaultType$5 = _objectSpread2({}, Tooltip.DefaultType, { + content: '(string|element|function)' + }); + + var ClassName$7 = { + FADE: 'fade', + SHOW: 'show' + }; + var Selector$7 = { + TITLE: '.popover-header', + CONTENT: '.popover-body' + }; + var Event$7 = { + HIDE: "hide" + EVENT_KEY$7, + HIDDEN: "hidden" + EVENT_KEY$7, + SHOW: "show" + EVENT_KEY$7, + SHOWN: "shown" + EVENT_KEY$7, + INSERTED: "inserted" + EVENT_KEY$7, + CLICK: "click" + EVENT_KEY$7, + FOCUSIN: "focusin" + EVENT_KEY$7, + FOCUSOUT: "focusout" + EVENT_KEY$7, + MOUSEENTER: "mouseenter" + EVENT_KEY$7, + MOUSELEAVE: "mouseleave" + EVENT_KEY$7 + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Popover = + /*#__PURE__*/ + function (_Tooltip) { + _inheritsLoose(Popover, _Tooltip); + + function Popover() { + return _Tooltip.apply(this, arguments) || this; + } + + var _proto = Popover.prototype; + + // Overrides + _proto.isWithContent = function isWithContent() { + return this.getTitle() || this._getContent(); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $(this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $(this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events + + this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle()); + + var content = this._getContent(); + + if (typeof content === 'function') { + content = content.call(this.element); + } + + this.setElementContent($tip.find(Selector$7.CONTENT), content); + $tip.removeClass(ClassName$7.FADE + " " + ClassName$7.SHOW); + } // Private + ; + + _proto._getContent = function _getContent() { + return this.element.getAttribute('data-content') || this.config.content; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $(this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1); + + if (tabClass !== null && tabClass.length > 0) { + $tip.removeClass(tabClass.join('')); + } + } // Static + ; + + Popover._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$7); + + var _config = typeof config === 'object' ? config : null; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Popover(this, _config); + $(this).data(DATA_KEY$7, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Popover, null, [{ + key: "VERSION", + // Getters + get: function get() { + return VERSION$7; + } + }, { + key: "Default", + get: function get() { + return Default$5; + } + }, { + key: "NAME", + get: function get() { + return NAME$7; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY$7; + } + }, { + key: "Event", + get: function get() { + return Event$7; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY$7; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$5; + } + }]); + + return Popover; + }(Tooltip); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $.fn[NAME$7] = Popover._jQueryInterface; + $.fn[NAME$7].Constructor = Popover; + + $.fn[NAME$7].noConflict = function () { + $.fn[NAME$7] = JQUERY_NO_CONFLICT$7; + return Popover._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$8 = 'scrollspy'; + var VERSION$8 = '4.4.1'; + var DATA_KEY$8 = 'bs.scrollspy'; + var EVENT_KEY$8 = "." + DATA_KEY$8; + var DATA_API_KEY$6 = '.data-api'; + var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8]; + var Default$6 = { + offset: 10, + method: 'auto', + target: '' + }; + var DefaultType$6 = { + offset: 'number', + method: 'string', + target: '(string|element)' + }; + var Event$8 = { + ACTIVATE: "activate" + EVENT_KEY$8, + SCROLL: "scroll" + EVENT_KEY$8, + LOAD_DATA_API: "load" + EVENT_KEY$8 + DATA_API_KEY$6 + }; + var ClassName$8 = { + DROPDOWN_ITEM: 'dropdown-item', + DROPDOWN_MENU: 'dropdown-menu', + ACTIVE: 'active' + }; + var Selector$8 = { + DATA_SPY: '[data-spy="scroll"]', + ACTIVE: '.active', + NAV_LIST_GROUP: '.nav, .list-group', + NAV_LINKS: '.nav-link', + NAV_ITEMS: '.nav-item', + LIST_ITEMS: '.list-group-item', + DROPDOWN: '.dropdown', + DROPDOWN_ITEMS: '.dropdown-item', + DROPDOWN_TOGGLE: '.dropdown-toggle' + }; + var OffsetMethod = { + OFFSET: 'offset', + POSITION: 'position' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var ScrollSpy = + /*#__PURE__*/ + function () { + function ScrollSpy(element, config) { + var _this = this; + + this._element = element; + this._scrollElement = element.tagName === 'BODY' ? window : element; + this._config = this._getConfig(config); + this._selector = this._config.target + " " + Selector$8.NAV_LINKS + "," + (this._config.target + " " + Selector$8.LIST_ITEMS + ",") + (this._config.target + " " + Selector$8.DROPDOWN_ITEMS); + this._offsets = []; + this._targets = []; + this._activeTarget = null; + this._scrollHeight = 0; + $(this._scrollElement).on(Event$8.SCROLL, function (event) { + return _this._process(event); + }); + this.refresh(); + + this._process(); + } // Getters + + + var _proto = ScrollSpy.prototype; + + // Public + _proto.refresh = function refresh() { + var _this2 = this; + + var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION; + var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; + var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0; + this._offsets = []; + this._targets = []; + this._scrollHeight = this._getScrollHeight(); + var targets = [].slice.call(document.querySelectorAll(this._selector)); + targets.map(function (element) { + var target; + var targetSelector = Util.getSelectorFromElement(element); + + if (targetSelector) { + target = document.querySelector(targetSelector); + } + + if (target) { + var targetBCR = target.getBoundingClientRect(); + + if (targetBCR.width || targetBCR.height) { + // TODO (fat): remove sketch reliance on jQuery position/offset + return [$(target)[offsetMethod]().top + offsetBase, targetSelector]; + } + } + + return null; + }).filter(function (item) { + return item; + }).sort(function (a, b) { + return a[0] - b[0]; + }).forEach(function (item) { + _this2._offsets.push(item[0]); + + _this2._targets.push(item[1]); + }); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$8); + $(this._scrollElement).off(EVENT_KEY$8); + this._element = null; + this._scrollElement = null; + this._config = null; + this._selector = null; + this._offsets = null; + this._targets = null; + this._activeTarget = null; + this._scrollHeight = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default$6, {}, typeof config === 'object' && config ? config : {}); + + if (typeof config.target !== 'string') { + var id = $(config.target).attr('id'); + + if (!id) { + id = Util.getUID(NAME$8); + $(config.target).attr('id', id); + } + + config.target = "#" + id; + } + + Util.typeCheckConfig(NAME$8, config, DefaultType$6); + return config; + }; + + _proto._getScrollTop = function _getScrollTop() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; + }; + + _proto._getScrollHeight = function _getScrollHeight() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); + }; + + _proto._getOffsetHeight = function _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; + }; + + _proto._process = function _process() { + var scrollTop = this._getScrollTop() + this._config.offset; + + var scrollHeight = this._getScrollHeight(); + + var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); + + if (this._scrollHeight !== scrollHeight) { + this.refresh(); + } + + if (scrollTop >= maxScroll) { + var target = this._targets[this._targets.length - 1]; + + if (this._activeTarget !== target) { + this._activate(target); + } + + return; + } + + if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { + this._activeTarget = null; + + this._clear(); + + return; + } + + var offsetLength = this._offsets.length; + + for (var i = offsetLength; i--;) { + var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); + + if (isActiveTarget) { + this._activate(this._targets[i]); + } + } + }; + + _proto._activate = function _activate(target) { + this._activeTarget = target; + + this._clear(); + + var queries = this._selector.split(',').map(function (selector) { + return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; + }); + + var $link = $([].slice.call(document.querySelectorAll(queries.join(',')))); + + if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) { + $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE); + $link.addClass(ClassName$8.ACTIVE); + } else { + // Set triggered link as active + $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active + // With both
    and