From aad2f47154225dbe3ff5397b3989d550d7a2fde7 Mon Sep 17 00:00:00 2001 From: Nino Righi Date: Fri, 21 May 2021 18:44:11 +0200 Subject: [PATCH] Catalog Filter Store Refactor and Caching Service --- angular.json | 40 ++ apps/core/cache/README.md | 25 ++ apps/core/cache/karma.conf.js | 32 ++ apps/core/cache/ng-package.json | 7 + apps/core/cache/package.json | 11 + apps/core/cache/src/lib/cache-options.ts | 4 + apps/core/cache/src/lib/cache.module.ts | 8 + apps/core/cache/src/lib/cache.service.ts | 73 ++++ apps/core/cache/src/lib/cached.ts | 4 + apps/core/cache/src/public-api.ts | 6 + apps/core/cache/src/test.ts | 24 ++ apps/core/cache/tsconfig.lib.json | 25 ++ apps/core/cache/tsconfig.lib.prod.json | 10 + apps/core/cache/tsconfig.spec.json | 17 + apps/core/cache/tslint.json | 17 + .../domain/catalog/src/lib/catalog.service.ts | 13 +- .../article-search-new.store.ts | 69 ++-- .../article-search.component.html | 2 +- .../article-search.component.ts | 24 +- .../article-search/article-search.module.ts | 54 +-- .../article-searchbox.component.html | 32 +- .../article-searchbox.component.scss | 11 - .../article-searchbox.component.ts | 135 +++---- .../article-searchbox.module.ts | 17 + .../filter-chips/filter-chips.component.html | 12 + .../filter-chips/filter-chips.component.scss | 30 ++ .../filter-chips/filter-chips.component.ts | 25 ++ .../filter-chips/filter-chips.module.ts | 14 + .../search-filter.component.html | 5 + .../search-filter.component.scss | 4 + .../search-filter/search-filter.component.ts | 33 +- .../search-filter/search-filter.module.ts | 18 + .../search-main/search-main.component.html | 12 +- .../search-main/search-main.component.scss | 4 + .../search-main/search-main.component.ts | 42 +- .../search-main/search-main.module.ts | 15 + .../search-results.component.ts | 72 +++- .../search-results/search-results.module.ts | 19 + .../catalog/src/lib/page-catalog.component.ts | 3 +- .../article-list-modal.component.ts | 2 +- .../src/lib/ui-searchbox-input.directive.ts | 4 +- package-lock.json | 367 +++++++++--------- package.json | 4 +- tsconfig.json | 4 + 44 files changed, 878 insertions(+), 471 deletions(-) create mode 100644 apps/core/cache/README.md create mode 100644 apps/core/cache/karma.conf.js create mode 100644 apps/core/cache/ng-package.json create mode 100644 apps/core/cache/package.json create mode 100644 apps/core/cache/src/lib/cache-options.ts create mode 100644 apps/core/cache/src/lib/cache.module.ts create mode 100644 apps/core/cache/src/lib/cache.service.ts create mode 100644 apps/core/cache/src/lib/cached.ts create mode 100644 apps/core/cache/src/public-api.ts create mode 100644 apps/core/cache/src/test.ts create mode 100644 apps/core/cache/tsconfig.lib.json create mode 100644 apps/core/cache/tsconfig.lib.prod.json create mode 100644 apps/core/cache/tsconfig.spec.json create mode 100644 apps/core/cache/tslint.json create mode 100644 apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.module.ts create mode 100644 apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.html create mode 100644 apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.scss create mode 100644 apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.ts create mode 100644 apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.module.ts create mode 100644 apps/page/catalog/src/lib/article-search/search-filter/search-filter.module.ts create mode 100644 apps/page/catalog/src/lib/article-search/search-main/search-main.module.ts create mode 100644 apps/page/catalog/src/lib/article-search/search-results/search-results.module.ts diff --git a/angular.json b/angular.json index 495c35ac4..e822d1c41 100644 --- a/angular.json +++ b/angular.json @@ -2576,6 +2576,46 @@ } } } + }, + "@core/cache": { + "projectType": "library", + "root": "apps/core/cache", + "sourceRoot": "apps/core/cache/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "tsConfig": "apps/core/cache/tsconfig.lib.json", + "project": "apps/core/cache/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "apps/core/cache/tsconfig.lib.prod.json" + } + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "apps/core/cache/src/test.ts", + "tsConfig": "apps/core/cache/tsconfig.spec.json", + "karmaConfig": "apps/core/cache/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "apps/core/cache/tsconfig.lib.json", + "apps/core/cache/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } } }, "defaultProject": "sales" diff --git a/apps/core/cache/README.md b/apps/core/cache/README.md new file mode 100644 index 000000000..eacc4ca23 --- /dev/null +++ b/apps/core/cache/README.md @@ -0,0 +1,25 @@ +# Cache + +This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.2. + +## Code scaffolding + +Run `ng generate component component-name --project cache` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project cache`. + +> Note: Don't forget to add `--project cache` or else it will be added to the default project in your `angular.json` file. + +## Build + +Run `ng build cache` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Publishing + +After building your library with `ng build cache`, go to the dist folder `cd dist/cache` and run `npm publish`. + +## Running unit tests + +Run `ng test cache` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/apps/core/cache/karma.conf.js b/apps/core/cache/karma.conf.js new file mode 100644 index 000000000..8e352c8d3 --- /dev/null +++ b/apps/core/cache/karma.conf.js @@ -0,0 +1,32 @@ +// 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-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma'), + ], + client: { + clearContext: false, // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../../coverage/core/cache'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true, + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true, + }); +}; diff --git a/apps/core/cache/ng-package.json b/apps/core/cache/ng-package.json new file mode 100644 index 000000000..e1b1c9a91 --- /dev/null +++ b/apps/core/cache/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../../dist/core/cache", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/apps/core/cache/package.json b/apps/core/cache/package.json new file mode 100644 index 000000000..50abe576e --- /dev/null +++ b/apps/core/cache/package.json @@ -0,0 +1,11 @@ +{ + "name": "@core/cache", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^10.1.2", + "@angular/core": "^10.1.2" + }, + "dependencies": { + "tslib": "^2.0.0" + } +} \ No newline at end of file diff --git a/apps/core/cache/src/lib/cache-options.ts b/apps/core/cache/src/lib/cache-options.ts new file mode 100644 index 000000000..15946404b --- /dev/null +++ b/apps/core/cache/src/lib/cache-options.ts @@ -0,0 +1,4 @@ +export interface CacheOptions { + ttl?: number; + persist?: boolean; +} diff --git a/apps/core/cache/src/lib/cache.module.ts b/apps/core/cache/src/lib/cache.module.ts new file mode 100644 index 000000000..6d512ba80 --- /dev/null +++ b/apps/core/cache/src/lib/cache.module.ts @@ -0,0 +1,8 @@ +import { NgModule } from '@angular/core'; + +@NgModule({ + declarations: [], + imports: [], + exports: [], +}) +export class CacheModule {} diff --git a/apps/core/cache/src/lib/cache.service.ts b/apps/core/cache/src/lib/cache.service.ts new file mode 100644 index 000000000..326494268 --- /dev/null +++ b/apps/core/cache/src/lib/cache.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@angular/core'; +import { CacheOptions } from './cache-options'; +import { Cached } from './cached'; +import { sha1 } from 'object-hash'; + +@Injectable({ + providedIn: 'root', +}) +export class CacheService { + constructor() {} + + set(token: Object, data: any, options?: CacheOptions) { + const persist = options?.persist; + const ttl = options?.ttl; + const cached: Cached = { + data, + }; + + if (ttl) { + cached.until = Date.now() + ttl; + } + + if (persist) { + localStorage.setItem(this.getKey(token), this.serialize(cached)); + } else { + sessionStorage.setItem(this.getKey(token), this.serialize(cached)); + } + + Object.freeze(cached); + return cached; + } + + get(token: Object, from: 'session' | 'persist' = 'session'): T { + let cached: Cached; + + if (from === 'session') { + cached = this.deserialize(sessionStorage.getItem(this.getKey(token))); + } else if (from === 'persist') { + cached = this.deserialize(localStorage.getItem(this.getKey(token))); + } + + if (!cached) { + return undefined; + } + + if (cached.until < Date.now()) { + this.delete(token, from); + return undefined; + } + + return cached.data; + } + + private delete(token: Object, from: 'session' | 'persist' = 'session') { + if (from === 'session') { + sessionStorage.removeItem(this.getKey(token)); + } else if (from === 'persist') { + localStorage.removeItem(this.getKey(token)); + } + } + + private getKey(token: Object) { + return sha1(token); + } + + private serialize(data: Cached): string { + return JSON.stringify(data); + } + + private deserialize(data: string): Cached { + return JSON.parse(data); + } +} diff --git a/apps/core/cache/src/lib/cached.ts b/apps/core/cache/src/lib/cached.ts new file mode 100644 index 000000000..9ff18d16a --- /dev/null +++ b/apps/core/cache/src/lib/cached.ts @@ -0,0 +1,4 @@ +export interface Cached { + until?: number; + data?: any; +} diff --git a/apps/core/cache/src/public-api.ts b/apps/core/cache/src/public-api.ts new file mode 100644 index 000000000..c48dcee36 --- /dev/null +++ b/apps/core/cache/src/public-api.ts @@ -0,0 +1,6 @@ +/* + * Public API Surface of cache + */ + +export * from './lib/cache.service'; +export * from './lib/cache.module'; diff --git a/apps/core/cache/src/test.ts b/apps/core/cache/src/test.ts new file mode 100644 index 000000000..504678a21 --- /dev/null +++ b/apps/core/cache/src/test.ts @@ -0,0 +1,24 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +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/apps/core/cache/tsconfig.lib.json b/apps/core/cache/tsconfig.lib.json new file mode 100644 index 000000000..775bbc57d --- /dev/null +++ b/apps/core/cache/tsconfig.lib.json @@ -0,0 +1,25 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/apps/core/cache/tsconfig.lib.prod.json b/apps/core/cache/tsconfig.lib.prod.json new file mode 100644 index 000000000..5615c27df --- /dev/null +++ b/apps/core/cache/tsconfig.lib.prod.json @@ -0,0 +1,10 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "enableIvy": false + } +} diff --git a/apps/core/cache/tsconfig.spec.json b/apps/core/cache/tsconfig.spec.json new file mode 100644 index 000000000..85392ee8f --- /dev/null +++ b/apps/core/cache/tsconfig.spec.json @@ -0,0 +1,17 @@ +/* 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" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/apps/core/cache/tslint.json b/apps/core/cache/tslint.json new file mode 100644 index 000000000..3aa2f4c6b --- /dev/null +++ b/apps/core/cache/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "lib", + "camelCase" + ], + "component-selector": [ + true, + "element", + "lib", + "kebab-case" + ] + } +} diff --git a/apps/domain/catalog/src/lib/catalog.service.ts b/apps/domain/catalog/src/lib/catalog.service.ts index 480f87279..51200e9b2 100644 --- a/apps/domain/catalog/src/lib/catalog.service.ts +++ b/apps/domain/catalog/src/lib/catalog.service.ts @@ -30,14 +30,17 @@ export class DomainCatalogService { } getSearchHistory({ take }: { take: number }) { - return this.searchService.SearchHistory(take ?? 10).pipe(map((res) => res.result)); + return this.searchService.SearchHistory(take ?? 5).pipe(map((res) => res.result)); } + @memorize() search({ queryToken }: { queryToken: QueryTokenDTO }) { - return this.searchService.SearchSearch({ - queryToken, - stockId: null, - }); + return this.searchService + .SearchSearch({ + queryToken, + stockId: null, + }) + .pipe(shareReplay()); } getDetailsById({ id }: { id: number }) { diff --git a/apps/page/catalog/src/lib/article-search/article-search-new.store.ts b/apps/page/catalog/src/lib/article-search/article-search-new.store.ts index 31845c84a..470a3022c 100644 --- a/apps/page/catalog/src/lib/article-search/article-search-new.store.ts +++ b/apps/page/catalog/src/lib/article-search/article-search-new.store.ts @@ -4,9 +4,9 @@ import { StringDictionary } from '@cmf/core'; import { ApplicationService } from '@core/application'; import { BreadcrumbService } from '@core/breadcrumb'; import { ComponentStore, tapResponse } from '@ngrx/component-store'; -import { cloneDeep, isEqual } from 'lodash'; -import { combineLatest, Observable, Subscription } from 'rxjs'; -import { first, map, tap, shareReplay, switchMap, throttleTime, withLatestFrom, debounceTime, take } from 'rxjs/operators'; +import { isEqual } from 'lodash'; +import { combineLatest, Observable, Subject, Subscription } from 'rxjs'; +import { first, map, tap, switchMap, withLatestFrom, debounceTime, finalize } from 'rxjs/operators'; import { DomainCatalogService } from '@domain/catalog'; import { fromInputDto, @@ -36,6 +36,8 @@ export interface ArticleSearchState { /* tslint:disable member-ordering */ @Injectable() export class ArticleSearchStore extends ComponentStore { + readonly onSearch = new Subject<{ clear?: boolean; reload?: boolean }>(); + private queryParamsQuerySelector = (s: ArticleSearchState) => (s.params?.query?.length ? decodeURI(s.params.query) : ''); readonly queryParamsQuery$ = this.select(this.queryParamsQuerySelector); get query() { @@ -43,7 +45,10 @@ export class ArticleSearchStore extends ComponentStore { } private itemsSelector = (s: ArticleSearchState) => s.items ?? []; - readonly items$ = this.select(this.itemsSelector).pipe(tap(console.log.bind(window, 'items'))); + readonly items$ = this.select(this.itemsSelector); + get items() { + return this.get(this.itemsSelector); + } private orderBySelector = (s: ArticleSearchState) => (s.params?.orderBy != undefined ? decodeURI(s.params.orderBy) : undefined); readonly queryParamsOrderBy$ = this.select(this.orderBySelector); @@ -61,7 +66,7 @@ export class ArticleSearchStore extends ComponentStore { readonly searchState$ = this.select(this.searchStateSelector); private queryParamsSelector = (s: ArticleSearchState) => - Object.keys(s.params).reduce((dic, key) => ({ ...dic, [key]: encodeURI(s.params[key]) }), {} as StringDictionary); + Object.keys(s.params).reduce((dic, key) => ({ ...dic, [key]: s.params[key] }), {} as StringDictionary); readonly queryParams$ = this.select(this.queryParamsSelector); get queryParams() { return this.get(this.queryParamsSelector); @@ -84,30 +89,25 @@ export class ArticleSearchStore extends ComponentStore { main: ig.find((g) => g.group === 'main')?.input.map(fromInputDto), inputSelector: ig.find((g) => g.group === 'input_selector')?.input.map(fromInputDto), }; - }), - shareReplay() + }) ); readonly orderByOptions$ = this.catalog.getOrderBy(); readonly filter$ = combineLatest([this.queryParamsFilter$, this.defaultFilter$]).pipe( - map(([selectedFilters, defaultFilters]) => mapSelectedParamsToFilter(selectedFilters, defaultFilters.filter)), - shareReplay() + map(([selectedFilters, defaultFilters]) => mapSelectedParamsToFilter(selectedFilters, defaultFilters.filter)) ); readonly inputSelectorFilter$ = combineLatest([this.queryParamsInputSelector$, this.defaultFilter$]).pipe( - map(([selectedFilters, defaultFilters]) => mapSelectedParamsToFilter(selectedFilters, defaultFilters.inputSelector)), - shareReplay() + map(([selectedFilters, defaultFilters]) => mapSelectedParamsToFilter(selectedFilters, defaultFilters.inputSelector)) ); readonly mainFilter$ = combineLatest([this.queryParamsMain$, this.defaultFilter$]).pipe( - map(([selectedFilters, defaultFilters]) => mapSelectedParamsToFilter(selectedFilters, defaultFilters.main)), - shareReplay() + map(([selectedFilters, defaultFilters]) => mapSelectedParamsToFilter(selectedFilters, defaultFilters.main)) ); readonly queryTokenFilter$ = combineLatest([this.filter$, this.mainFilter$]).pipe( - map(([filter, mainFilter]) => mapFilterArrayToStringDictionary([...filter, ...mainFilter])), - shareReplay() + map(([filter, mainFilter]) => mapFilterArrayToStringDictionary([...filter, ...mainFilter])) ); readonly queryTokenInput$ = combineLatest([this.queryParamsQuery$, this.inputSelectorFilter$]).pipe( @@ -127,19 +127,14 @@ export class ArticleSearchStore extends ComponentStore { } return dic; - }), - shareReplay() + }) ); readonly orderBy$ = combineLatest([this.queryParamsOrderBy$, this.queryParamsDesc$, this.orderByOptions$]).pipe( - map(([orderBy, desc, orderByOptions]) => orderByOptions.find((opt) => opt.by === orderBy && !!opt.desc === Boolean(desc))), - shareReplay() + map(([orderBy, desc, orderByOptions]) => orderByOptions.find((opt) => opt.by === orderBy && !!opt.desc === Boolean(desc))) ); - readonly queryTokenOrderBy$ = this.orderBy$.pipe( - map((orderBy) => (orderBy ? [orderBy] : undefined)), - shareReplay() - ); + readonly queryTokenOrderBy$ = this.orderBy$.pipe(map((orderBy) => (orderBy ? [orderBy] : undefined))); readonly queryToken$ = combineLatest([ this.queryTokenInput$, @@ -156,9 +151,7 @@ export class ArticleSearchStore extends ComponentStore { returnStockData: false, friendlyName, } as QueryTokenDTO) - ), - shareReplay(), - tap(console.log.bind(window, 'queryParams')) + ) ); private connectedRouteSubscription: Subscription; @@ -176,9 +169,13 @@ export class ArticleSearchStore extends ComponentStore { } search = this.effect((options$: Observable<{ clear?: boolean; reload?: boolean }>) => - combineLatest([options$, this.queryToken$, this.items$]).pipe( + options$.pipe( debounceTime(250), - first(), + withLatestFrom(this.queryToken$, this.items$), + tap(([options]) => { + this.setSearchState({ searchState: 'fetching' }); + this.onSearch.next(options); + }), switchMap(([options, queryToken, items]) => this.catalog .search({ @@ -191,6 +188,7 @@ export class ArticleSearchStore extends ComponentStore { .pipe( tapResponse( (res) => { + this.setSearchState({ searchState: '' }); if (options.clear || options.reload) { this.patchState({ items: res.result, hits: res.hits }); if (res.hits > 1) { @@ -199,6 +197,7 @@ export class ArticleSearchStore extends ComponentStore { this.navigateToDetails(res.result[0]); } else { this.setSearchState({ searchState: 'empty' }); + this.navigateToMain(); } } else { this.patchState({ items: [...items, ...res.result], hits: res.hits }); @@ -216,7 +215,7 @@ export class ArticleSearchStore extends ComponentStore { this.disconnect(); let connected = false; - this.connectedRouteSubscription = route.queryParams.subscribe((params) => { + this.connectedRouteSubscription = route.queryParams.pipe(finalize(() => options?.disconnected?.call(undefined))).subscribe((params) => { const current = this.get(this.queryParamsSelector); if (!isEqual(current, params)) { @@ -225,14 +224,13 @@ export class ArticleSearchStore extends ComponentStore { if (!connected) { connected = true; - options?.connected?.call(undefined, params); + setTimeout(() => options?.connected?.call(undefined, params), 0); } }); return { disconnect: () => { this.disconnect(); - options?.disconnected?.call(undefined); }, }; } @@ -275,6 +273,10 @@ export class ArticleSearchStore extends ComponentStore { this.router.navigate(['/product/details', item.id]); } + navigateToMain() { + this.router.navigate(['/product/search'], { queryParams: this.queryParams }); + } + private setQueryParams({ params }: { params: StringDictionary }) { this.patchState({ params }); } @@ -293,6 +295,7 @@ export class ArticleSearchStore extends ComponentStore { setFilter({ filter }: { filter: Filter[] }) { const queryParams = this.get(this.queryParamsSelector); + this.patchState({ params: { ...queryParams, @@ -331,6 +334,10 @@ export class ArticleSearchStore extends ComponentStore { this.patchState({ searchState }); } + setItems({ items }: { items: ItemDTO[] }) { + this.patchState({ items }); + } + setOrderBy({ orderBy }: { orderBy: OrderByDTO }) { const queryParams = this.get(this.queryParamsSelector); this.patchState({ diff --git a/apps/page/catalog/src/lib/article-search/article-search.component.html b/apps/page/catalog/src/lib/article-search/article-search.component.html index 94696b837..61a7a417d 100644 --- a/apps/page/catalog/src/lib/article-search/article-search.component.html +++ b/apps/page/catalog/src/lib/article-search/article-search.component.html @@ -1,4 +1,4 @@ - diff --git a/apps/page/catalog/src/lib/article-search/article-search.component.ts b/apps/page/catalog/src/lib/article-search/article-search.component.ts index fbb298a5a..6a5fe52ec 100644 --- a/apps/page/catalog/src/lib/article-search/article-search.component.ts +++ b/apps/page/catalog/src/lib/article-search/article-search.component.ts @@ -15,30 +15,12 @@ export class ArticleSearchComponent implements OnInit { filterActive$ = new BehaviorSubject(false); showMainContent$ = this.getShowMainContent(); lastSelectedFilterCategory: Filter; - anyFiltersActive$: Observable; - // readonly filters$ = this.articleSearchStore.selectFilter$; + hasFilter$: Observable = this.store.queryParamsFilter$.pipe(map((filter) => filter !== '')); - constructor(private articleSearchStore: ArticleSearchStore) {} + constructor(private store: ArticleSearchStore) {} - ngOnInit() { - // this.articleSearchStore.loadInitialFilters(); - // this.articleSearchStore.searchHistory(); - // this.anyFiltersActive$ = this.filters$.pipe(map((filters) => this.anyFilterSet(filters))); - } - - // TODO: Replace Logic - anyFilterSet(filters: Filter[]): boolean { - let anySelected = false; - for (const filter of filters) { - const options: FilterOption[] = filter.options; - const selected = options.filter((o) => o.selected); - if (selected?.length > 0) { - anySelected = true; - } - } - return anySelected; - } + ngOnInit() {} getShowMainContent(animationDelayInMs: number = 500): Observable { return this.filterActive$.pipe( diff --git a/apps/page/catalog/src/lib/article-search/article-search.module.ts b/apps/page/catalog/src/lib/article-search/article-search.module.ts index 4e9fa0333..86036b751 100644 --- a/apps/page/catalog/src/lib/article-search/article-search.module.ts +++ b/apps/page/catalog/src/lib/article-search/article-search.module.ts @@ -1,57 +1,27 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; -import { UiCommonModule } from '@ui/common'; -import { UiFilterModule } from '@ui/filter'; import { UiIconModule } from '@ui/icon'; -import { UiSearchboxModule } from '@ui/searchbox'; - import { ArticleSearchComponent } from './article-search.component'; -import { ArticleSearchFilterComponent } from './search-filter/search-filter.component'; -import { ArticleSearchMainComponent } from './search-main/search-main.component'; -import { ArticleSearchboxComponent } from './containers/article-searchbox/article-searchbox.component'; -import { InfoboxComponent } from './containers/article-searchbox/infobox/infobox.component'; -import { ArticleSearchResultsComponent } from './search-results/search-results.component'; -import { OrderByFilterComponent } from './search-results/order-by-filter/order-by-filter.component'; -import { StockInfosPipe } from './search-results/order-by-filter/stick-infos.pipe'; -import { DomainCatalogModule } from '@domain/catalog'; -import { UiCheckboxModule } from '@ui/checkbox'; -import { UiFormControlModule } from '@ui/form-control'; -import { UiInputModule } from '@ui/input'; -import { ScrollingModule } from '@angular/cdk/scrolling'; -import { SearchResultItemComponent } from './search-results/search-result-item.component'; +import { FilterChipsModule } from './containers/filter-chips/filter-chips.module'; +import { ArticleSearchboxModule } from './containers/article-searchbox/article-searchbox.module'; +import { SearchResultsModule } from './search-results/search-results.module'; +import { SearchMainModule } from './search-main/search-main.module'; +import { SearchFilterModule } from './search-filter/search-filter.module'; @NgModule({ imports: [ CommonModule, RouterModule, - FormsModule, - ReactiveFormsModule, - UiSearchboxModule, - UiCommonModule, UiIconModule, - UiFilterModule, - UiSearchboxModule, - ReactiveFormsModule, - DomainCatalogModule, - ScrollingModule, - UiCheckboxModule, - UiFormControlModule, - UiInputModule, - ], - exports: [ArticleSearchComponent, ArticleSearchMainComponent, ArticleSearchFilterComponent, ArticleSearchboxComponent, InfoboxComponent], - declarations: [ - ArticleSearchComponent, - ArticleSearchMainComponent, - ArticleSearchFilterComponent, - ArticleSearchboxComponent, - InfoboxComponent, - ArticleSearchResultsComponent, - OrderByFilterComponent, - StockInfosPipe, - SearchResultItemComponent, + FilterChipsModule, + ArticleSearchboxModule, + SearchResultsModule, + SearchMainModule, + SearchFilterModule, ], + exports: [ArticleSearchComponent], + declarations: [ArticleSearchComponent], providers: [], }) export class ArticleSearchModule {} diff --git a/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.html b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.html index dd0604a84..a62e1f7e5 100644 --- a/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.html +++ b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.html @@ -1,30 +1,4 @@
-
- - - {{ chip.name }} - - - - - {{ chip.name }} - - -
- +
diff --git a/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.scss b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.scss index b00af5a1d..fd5a8b7ca 100644 --- a/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.scss +++ b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.scss @@ -2,17 +2,6 @@ @apply text-dark-cerulean border border-solid border-inactive-customer; } -ui-checkbox { - @apply mx-px-10 px-5 py-4 text-inactive-customer font-bold text-sm whitespace-nowrap; - border-radius: 27px; - border: 1px solid white; - background-color: #e9f0f8; -} - -ui-checkbox.filter { - @apply bg-white; -} - .wrapper { @apply flex flex-col; diff --git a/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.ts b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.ts index d276fe12a..57a1a3d68 100644 --- a/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.ts +++ b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.component.ts @@ -8,18 +8,16 @@ import { Output, ViewChild, OnDestroy, - ElementRef, - AfterViewInit, } from '@angular/core'; import { EnvironmentService } from '@core/environment'; import { AutocompleteDTO } from '@swagger/cat'; -import { Filter } from '@ui/filter'; import { UiSearchboxAutocompleteComponent } from '@ui/searchbox'; import { BehaviorSubject, combineLatest, concat, Observable } from 'rxjs'; -import { delay, first, map, shareReplay, tap, filter } from 'rxjs/operators'; +import { map, shareReplay, tap, filter, switchMap, debounceTime, distinctUntilChanged } from 'rxjs/operators'; import { NativeContainerService } from 'native-container'; import { Subscription } from 'rxjs'; import { ArticleSearchStore } from '../../article-search-new.store'; +import { DomainCatalogService } from '@domain/catalog'; @Component({ selector: 'page-article-searchbox', @@ -27,21 +25,44 @@ import { ArticleSearchStore } from '../../article-search-new.store'; styleUrls: ['article-searchbox.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class ArticleSearchboxComponent implements OnInit, OnDestroy, AfterViewInit { +export class ArticleSearchboxComponent implements OnInit, OnDestroy { @ViewChild(UiSearchboxAutocompleteComponent, { read: UiSearchboxAutocompleteComponent, static: false, }) autocomplete: UiSearchboxAutocompleteComponent; - autocompleteResult$: Observable; + readonly autocompleteQuery$ = new BehaviorSubject(''); + autocompleteResult$: Observable = combineLatest([ + this.autocompleteQuery$, + this.store.queryTokenFilter$, + this.store.queryParamsInputSelector$, + ]).pipe( + debounceTime(200), + distinctUntilChanged(), + filter(([query]) => query.trim().length >= 3), + switchMap(([query, fil, inputSelector]) => + this.catalog.searchComplete({ + queryToken: { + filter: fil, + input: query, + take: 5, + type: inputSelector || 'qs', + catalogType: undefined, + }, + }) + ), + tap((response) => { + if (response.hits > 0) { + this.autocomplete.open(); + } else { + this.autocomplete.close(); + } + }), + map((response) => response.result) + ); - readonly inputFilter$ = this.articleSearchStore.inputSelectorFilter$; - readonly mainFilter$ = this.articleSearchStore.mainFilter$; - - readonly query$ = this.articleSearchStore.queryParamsQuery$.pipe(shareReplay()); - // readonly isHistory$ = this.articleSearchStore.query$.pipe(map((query) => query.history)); - readonly searchState$ = this.articleSearchStore.searchState$; - // readonly autocomplete$ = this.articleSearchStore.selectAutocomplete$; + readonly query$ = this.store.queryParamsQuery$.pipe(shareReplay()); + readonly searchState$ = this.store.searchState$; isMobile: boolean; subscriptions = new Subscription(); @@ -67,11 +88,6 @@ export class ArticleSearchboxComponent implements OnInit, OnDestroy, AfterViewIn shareReplay() ); - isMain$ = this.mode$.pipe( - map((type) => type === 'main'), - shareReplay() - ); - isFetching$ = this.searchState$.pipe( map((searchState) => searchState === 'fetching'), shareReplay() @@ -85,13 +101,13 @@ export class ArticleSearchboxComponent implements OnInit, OnDestroy, AfterViewIn constructor( private environmentService: EnvironmentService, private cdr: ChangeDetectorRef, - private articleSearchStore: ArticleSearchStore, - private nativeContainer: NativeContainerService + private store: ArticleSearchStore, + private nativeContainer: NativeContainerService, + private catalog: DomainCatalogService ) {} ngOnInit() { this.detectDevice(); - this.initAutocomplete(); } ngOnDestroy() { @@ -100,15 +116,15 @@ export class ArticleSearchboxComponent implements OnInit, OnDestroy, AfterViewIn startSearch() { const isNative = this.nativeContainer.isUiWebview().isNative; - const query = this.articleSearchStore.query; + const query = this.store.query; if (isNative && (query?.length ?? 0) === 0) { return this.scan(); } else { - this.articleSearchStore.search({ clear: true }); + this.store.search({ clear: true }); this.subscriptions.add( - this.articleSearchStore.searchState$.subscribe((state) => { + this.store.searchState$.subscribe((state) => { if (state !== 'fetching' && state !== 'empty') { this.closeFilterOverlay.emit(); } @@ -122,11 +138,11 @@ export class ArticleSearchboxComponent implements OnInit, OnDestroy, AfterViewIn .openScanner('scanBook') .pipe(filter((message) => message.status !== 'IN_PROGRESS')) .subscribe((result) => { - this.articleSearchStore.setQuery({ query: result?.data }); + this.store.setQuery({ query: result?.data }); - this.articleSearchStore.search({ clear: true }); + this.store.search({ clear: true }); this.subscriptions.add( - this.articleSearchStore.searchState$.subscribe((state) => { + this.store.searchState$.subscribe((state) => { if (state !== 'fetching' && state !== 'empty') { this.closeFilterOverlay.emit(); } @@ -139,76 +155,21 @@ export class ArticleSearchboxComponent implements OnInit, OnDestroy, AfterViewIn } reset() { - this.articleSearchStore.setSearchState({ searchState: '' }); - this.articleSearchStore.setQuery({ query: '' }); + this.store.setSearchState({ searchState: '' }); + this.store.setQuery({ query: '' }); + this.autocomplete.close(); } resetSearchState() { - this.articleSearchStore.setSearchState({ searchState: '' }); - } - - // checkFilterChip(checked: boolean = false, changedFilterChip: Filter, filterChips: Filter[]) { - // changedFilterChip.options[0].selected = checked; - // if (changedFilterChip.target === 'filter') { - // const f = filterChips.filter((fil) => fil.target === 'filter'); - // this.articleSearchStore.setInputFilter({ filter: f }); - // } else if (changedFilterChip.target === 'input') { - - // // this.articleSearchStore.setPrimaryFilter({ filter }); - // } - // this.cdr.markForCheck(); - // } - - checkInputFilter(checked: boolean = false, changedFilterChip: Filter, inputFilter: Filter[]) { - changedFilterChip.options[0].selected = checked; - this.articleSearchStore.setInputSelectorFilter({ filter: inputFilter }); - this.cdr.markForCheck(); - } - - checkMainFilter(checked: boolean = false, changedFilterChip: Filter, mainFilter: Filter[]) { - changedFilterChip.options[0].selected = checked; - this.articleSearchStore.setMainFilter({ filter: mainFilter }); - this.cdr.markForCheck(); + this.store.setSearchState({ searchState: '' }); } updateQuery(query: string) { - this.articleSearchStore.setQuery({ query }); - } - - async autocompleteTrigger(queryAutocomplete: string) { - // await this.query$.pipe(first()).toPromise(); // Wait for setQuery from updateQuery() - // if (queryAutocomplete.length >= 3) { - // this.articleSearchStore.searchAutocomplete(); - // } - } - - initAutocomplete() { - // this.autocompleteResult$ = this.autocomplete$.pipe( - // tap((results) => { - // if (this.autocomplete) { - // if (results.length > 0) { - // this.autocomplete.open(); - // } else { - // this.autocomplete.close(); - // } - // } - // }), - // delay(1), - // tap(() => this.cdr.detectChanges()) - // ); + this.store.setQuery({ query }); } async detectDevice() { this.isMobile = await this.environmentService.isMobile(); this.cdr.detectChanges(); } - - focus(input: HTMLInputElement): void { - setTimeout(() => { - input.focus(); - this.cdr.detectChanges(); - }, 1000); - } - - ngAfterViewInit() {} } diff --git a/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.module.ts b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.module.ts new file mode 100644 index 000000000..022527cc5 --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/containers/article-searchbox/article-searchbox.module.ts @@ -0,0 +1,17 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { UiIconModule } from '@ui/icon'; +import { UiInputModule } from '@ui/input'; +import { UiSearchboxModule } from '@ui/searchbox'; + +import { ArticleSearchboxComponent } from './article-searchbox.component'; +import { InfoboxComponent } from './infobox/infobox.component'; + +@NgModule({ + imports: [CommonModule, FormsModule, UiIconModule, UiSearchboxModule, UiInputModule], + exports: [ArticleSearchboxComponent, InfoboxComponent], + declarations: [ArticleSearchboxComponent, InfoboxComponent], + providers: [], +}) +export class ArticleSearchboxModule {} diff --git a/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.html b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.html new file mode 100644 index 000000000..5114f0058 --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.html @@ -0,0 +1,12 @@ +
+ + {{ chip.name }} + +
diff --git a/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.scss b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.scss new file mode 100644 index 000000000..ddf6201e1 --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.scss @@ -0,0 +1,30 @@ +:host { + --filter-chips-background-color: #e9f0f8; +} + +:host.filter { + --filter-chips-background-color: #fff; +} + +.filter-chip-background { + background-color: var(--filter-chips-background-color); +} + +.primary-filter-container { + @apply flex flex-row justify-center mb-8; +} + +.checked { + @apply text-dark-cerulean border border-solid border-inactive-customer; +} + +ui-checkbox { + @apply mx-px-10 px-5 py-4 text-inactive-customer font-bold text-sm whitespace-nowrap; + border-radius: 27px; + border: 1px solid white; + background-color: #e9f0f8; +} + +ui-checkbox.filter { + @apply bg-white; +} diff --git a/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.ts b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.ts new file mode 100644 index 000000000..4757ed935 --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.component.ts @@ -0,0 +1,25 @@ +import { Component, Input, OnInit, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core'; +import { Filter } from '@ui/filter'; +import { cloneDeep } from 'lodash'; + +@Component({ + selector: 'page-filter-chips', + templateUrl: 'filter-chips.component.html', + styleUrls: ['filter-chips.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class FilterChipsComponent implements OnInit { + @Output() filterChange = new EventEmitter(); + + @Input() filter: Filter[]; + + constructor() {} + + ngOnInit() {} + + checkFilter(checked: boolean = false, changedFilterChip: Filter) { + const filter = cloneDeep(this.filter); + filter.find((f) => f.key === changedFilterChip.key).options[0].selected = checked; + this.filterChange.emit(filter); + } +} diff --git a/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.module.ts b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.module.ts new file mode 100644 index 000000000..e1efe520e --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/containers/filter-chips/filter-chips.module.ts @@ -0,0 +1,14 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { UiCheckboxModule } from '@ui/checkbox'; + +import { FilterChipsComponent } from './filter-chips.component'; + +@NgModule({ + imports: [CommonModule, FormsModule, UiCheckboxModule], + exports: [FilterChipsComponent], + declarations: [FilterChipsComponent], + providers: [], +}) +export class FilterChipsModule {} diff --git a/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.html b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.html index 4670b6907..36f0aef60 100644 --- a/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.html +++ b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.html @@ -1,3 +1,8 @@ +
+ + +
+ diff --git a/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.scss b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.scss index ab02338f0..e595e9ab4 100644 --- a/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.scss +++ b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.scss @@ -7,6 +7,10 @@ bottom: 30px; } +.filter-chips { + @apply flex flex-row justify-center; +} + button.apply-filter { @apply border-none bg-brand text-white rounded-full py-cta-y-l px-cta-x-l text-cta-l font-bold; min-width: 201px; diff --git a/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.ts b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.ts index 10337bcae..6663edb8c 100644 --- a/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.ts +++ b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { Filter } from '@ui/filter'; import { BehaviorSubject, Subscription } from 'rxjs'; -import { first, map } from 'rxjs/operators'; +import { first, map, tap } from 'rxjs/operators'; import { ArticleSearchStore } from '../article-search-new.store'; @Component({ @@ -18,6 +18,9 @@ export class ArticleSearchFilterComponent implements OnInit, OnDestroy { readonly initialFilters$ = this.articleSearchStore.defaultFilter$.pipe(map((filter) => filter.filter)); readonly searchState$ = this.articleSearchStore.searchState$; + readonly inputFilter$ = this.articleSearchStore.inputSelectorFilter$; + readonly mainFilter$ = this.articleSearchStore.mainFilter$; + /* @internal */ updateFilterCategory$ = new BehaviorSubject(undefined); @@ -32,23 +35,22 @@ export class ArticleSearchFilterComponent implements OnInit, OnDestroy { this.updateFilterCategory$.next(value); } - filterChanges: Filter[]; + initialFilter: Filter[]; searchStateSubscription: Subscription; constructor(private cdr: ChangeDetectorRef, private articleSearchStore: ArticleSearchStore) {} - async ngOnInit() { - this.filterChanges = await this.filters$.pipe(first()).toPromise(); + ngOnInit() { + // this.filterChanges = await this.filters$.pipe(first()).toPromise(); } ngOnDestroy() { - const filter = this.filterChanges; - this.articleSearchStore.setFilter({ filter }); - - if (!!this.searchStateSubscription) { - this.searchStateSubscription.unsubscribe(); - } + // const filter = this.filterChanges; + // this.articleSearchStore.setFilter({ filter }); + // if (!!this.searchStateSubscription) { + // this.searchStateSubscription.unsubscribe(); + // } } closeOverlay() { @@ -56,7 +58,8 @@ export class ArticleSearchFilterComponent implements OnInit, OnDestroy { } async applyFilters() { - this.filterChanges = await this.filters$.pipe(first()).toPromise(); + // this.filterChanges = await this.filters$.pipe(first()).toPromise(); + // console.log(this.filterChanges); this.articleSearchStore.search({ clear: true }); this.searchStateSubscription = this.articleSearchStore.searchState$.subscribe((state) => { @@ -66,6 +69,14 @@ export class ArticleSearchFilterComponent implements OnInit, OnDestroy { }); } + checkInputFilter(filter: Filter[]) { + this.articleSearchStore.setInputSelectorFilter({ filter }); + } + + checkMainFilter(filter: Filter[]) { + this.articleSearchStore.setMainFilter({ filter }); + } + updateCategory(filter: Filter) { this.lastSelectedFilterCategory.emit(filter); this.cdr.markForCheck(); diff --git a/apps/page/catalog/src/lib/article-search/search-filter/search-filter.module.ts b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.module.ts new file mode 100644 index 000000000..047faf69a --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/search-filter/search-filter.module.ts @@ -0,0 +1,18 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UiCommonModule } from '@ui/common'; +import { UiFilterModule } from '@ui/filter'; +import { UiIconModule } from '@ui/icon'; +import { ArticleSearchboxModule } from '../containers/article-searchbox/article-searchbox.module'; +import { FilterChipsModule } from '../containers/filter-chips/filter-chips.module'; + +import { ArticleSearchFilterComponent } from './search-filter.component'; + +@NgModule({ + imports: [CommonModule, FilterChipsModule, ArticleSearchboxModule, UiIconModule, UiFilterModule], + exports: [ArticleSearchFilterComponent], + declarations: [ArticleSearchFilterComponent], + providers: [], +}) +export class SearchFilterModule {} diff --git a/apps/page/catalog/src/lib/article-search/search-main/search-main.component.html b/apps/page/catalog/src/lib/article-search/search-main/search-main.component.html index 47dcf32bf..eb266ee85 100644 --- a/apps/page/catalog/src/lib/article-search/search-main/search-main.component.html +++ b/apps/page/catalog/src/lib/article-search/search-main/search-main.component.html @@ -3,16 +3,20 @@

Welchen Artikel suchen Sie?

+
+ + +

Deine letzten Suchanfragen

    - +
diff --git a/apps/page/catalog/src/lib/article-search/search-main/search-main.component.scss b/apps/page/catalog/src/lib/article-search/search-main/search-main.component.scss index ca1ee7dad..f8ad2090b 100644 --- a/apps/page/catalog/src/lib/article-search/search-main/search-main.component.scss +++ b/apps/page/catalog/src/lib/article-search/search-main/search-main.component.scss @@ -10,6 +10,10 @@ @apply text-2xl mt-1 mb-px-30; } +.filter-chips { + @apply flex flex-row justify-center; +} + .card-search-article { @apply bg-white rounded p-4 text-center; diff --git a/apps/page/catalog/src/lib/article-search/search-main/search-main.component.ts b/apps/page/catalog/src/lib/article-search/search-main/search-main.component.ts index e2afcdc4b..bd8ee6f69 100644 --- a/apps/page/catalog/src/lib/article-search/search-main/search-main.component.ts +++ b/apps/page/catalog/src/lib/article-search/search-main/search-main.component.ts @@ -1,6 +1,9 @@ import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { first, tap } from 'rxjs/operators'; +import { DomainCatalogService } from '@domain/catalog'; +import { Filter } from '@ui/filter'; +import { NEVER } from 'rxjs'; +import { catchError } from 'rxjs/operators'; import { ArticleSearchStore } from '../article-search-new.store'; // import { ArticleSearchStore } from '../article-search.store'; @@ -11,18 +14,13 @@ import { ArticleSearchStore } from '../article-search-new.store'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class ArticleSearchMainComponent implements OnInit, OnDestroy { - // readonly recentQueries$ = this.articleSearchStore.history$; + readonly history$ = this.catalog.getSearchHistory({ take: 5 }).pipe(catchError(() => NEVER)); + readonly inputFilter$ = this.articleSearchStore.inputSelectorFilter$; + readonly mainFilter$ = this.articleSearchStore.mainFilter$; - readonly filter$ = this.articleSearchStore.filter$; - // readonly primaryFilter$ = this.articleSearchStore.primaryFilter$; - - constructor(private articleSearchStore: ArticleSearchStore, private route: ActivatedRoute) {} + constructor(private articleSearchStore: ArticleSearchStore, private catalog: DomainCatalogService, private route: ActivatedRoute) {} ngOnInit() { - // const query = this.route.snapshot.queryParams.taskCalendarSearch; - // if (!!query) { - // this.articleSearchStore.setTaskCalendarArticleSearchQuery({ query }); - // } this.articleSearchStore.connect(this.route); } @@ -30,19 +28,15 @@ export class ArticleSearchMainComponent implements OnInit, OnDestroy { this.articleSearchStore.disconnect(); } - async setQueryHistory(recentQuery: { input: string; filter: string; primaryFilter: string }) { - // const filter = await this.filter$.pipe(first()).toPromise(); - // const primaryFilter = await this.primaryFilter$.pipe(first()).toPromise(); - // this.articleSearchStore.setSelectedFilterBasedOnIdString( - // recentQuery.filter, - // filter.concat(primaryFilter.filter((pf) => pf.target === 'filter')) - // ); - // if (recentQuery.primaryFilter !== 'qs') { - // this.articleSearchStore.setSelectedFilterBasedOnIdString( - // recentQuery.primaryFilter, - // primaryFilter.filter((pf) => pf.target === 'input') - // ); - // } - // this.articleSearchStore.setQuery({ query: recentQuery.input, history: true }); + checkInputFilter(filter: Filter[]) { + this.articleSearchStore.setInputSelectorFilter({ filter }); + } + + checkMainFilter(filter: Filter[]) { + this.articleSearchStore.setMainFilter({ filter }); + } + + setQueryHistory(recentQuery: string) { + this.articleSearchStore.setQuery({ query: recentQuery }); } } diff --git a/apps/page/catalog/src/lib/article-search/search-main/search-main.module.ts b/apps/page/catalog/src/lib/article-search/search-main/search-main.module.ts new file mode 100644 index 000000000..a6519ed43 --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/search-main/search-main.module.ts @@ -0,0 +1,15 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { UiIconModule } from '@ui/icon'; +import { ArticleSearchboxModule } from '../containers/article-searchbox/article-searchbox.module'; +import { FilterChipsModule } from '../containers/filter-chips/filter-chips.module'; + +import { ArticleSearchMainComponent } from './search-main.component'; + +@NgModule({ + imports: [CommonModule, UiIconModule, FilterChipsModule, ArticleSearchboxModule], + exports: [ArticleSearchMainComponent], + declarations: [ArticleSearchMainComponent], + providers: [], +}) +export class SearchMainModule {} diff --git a/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts b/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts index 72069eb24..7866ddf8e 100644 --- a/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts +++ b/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts @@ -1,12 +1,12 @@ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; -import { Component, ChangeDetectionStrategy, OnInit, OnDestroy, AfterViewInit, ViewChild, ElementRef } from '@angular/core'; -import { ActivatedRoute, NavigationStart, Router } from '@angular/router'; +import { Component, ChangeDetectionStrategy, OnInit, OnDestroy, ViewChild, AfterContentInit, AfterViewInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; import { ApplicationService } from '@core/application'; import { BreadcrumbService } from '@core/breadcrumb'; import { ItemDTO } from '@swagger/cat'; -import { ScrollPositionService } from 'apps/ui/common/src/lib/scroll-position/scroll-position.service'; -import { BehaviorSubject, combineLatest, Subscription } from 'rxjs'; -import { first, map, withLatestFrom } from 'rxjs/operators'; +import { CacheService } from 'apps/core/cache/src/public-api'; +import { BehaviorSubject, Subscription } from 'rxjs'; +import { first, map } from 'rxjs/operators'; import { ArticleSearchStore } from '../article-search-new.store'; @Component({ @@ -15,54 +15,90 @@ import { ArticleSearchStore } from '../article-search-new.store'; styleUrls: ['search-results.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class ArticleSearchResultsComponent implements OnInit, OnDestroy, AfterViewInit { +export class ArticleSearchResultsComponent implements OnInit, OnDestroy, AfterContentInit, AfterViewInit { @ViewChild('scrollContainer', { static: false }) scrollContainer: CdkVirtualScrollViewport; loading$ = new BehaviorSubject(false); results$ = this.store.items$; - fetching$ = this.store.searchState$.pipe(map((state) => state === 'fetching')); - private readonly subscriptions = new Subscription(); + scrollPosSubscription: Subscription; trackByItemId = (item: ItemDTO) => item.id; constructor( private store: ArticleSearchStore, private route: ActivatedRoute, - private scrollPositionService: ScrollPositionService, private router: Router, private application: ApplicationService, - private breadcrumb: BreadcrumbService + private breadcrumb: BreadcrumbService, + private cache: CacheService ) {} ngOnInit() { - this.store.connect(this.route, { connected: () => this.store.search({ reload: true }) }); + this.store.connect(this.route, { + connected: () => { + this.route.queryParams.subscribe((params) => { + const cachedItems = this.cache.get(params); + if (cachedItems) { + this.store.setItems({ items: cachedItems }); + } + this.store.search({ reload: true }); + + // if (params.scrollPos) { + // this.scrollTo(Number(params.scrollPos)); + // } + }); + }, + disconnected: () => { + // this.store.setQueryParam({ key: 'scrollPos', value: this.scrollContainer.measureScrollOffset('top').toString() }); + this.cache.set(this.store.queryParams, this.store.items); + }, + }); const { query, queryParams, hits } = this.store; this.breadcrumb.addOrUpdateBreadcrumbIfNotExists({ key: this.application.activatedProcessId, - name: `${query} (${hits} Ergebnisse)`, + name: `${query} (${hits ? hits : 'Lade'} Ergebnisse)`, path: '/product/search/results', params: queryParams, tags: ['catalog', 'filter', 'results'], }); - } - ngAfterViewInit() { - this.scrollPositionService.setScrollContainerRef(this.scrollContainer); - this.scrollPositionService.scrollToLastRememberedPositionVirtualScroll(); + // this.scrollPosSubscription = this.store.onSearch.subscribe((options) => { + // if (options?.clear) { + // this.store.setQueryParam({ key: 'scrollPos', value: '0' }); + // this.scrollTo(0); + // } + // }); } ngOnDestroy() { this.store.disconnect(); this.loading$.complete(); - // this.subscriptions.unsubscribe(); + // this.scrollPosSubscription.unsubscribe(); } + ngAfterContentInit() { + // const scrollPos = this.route?.snapshot?.queryParams?.scrollPos; + // if (scrollPos) { + // this.scrollTo(Number(scrollPos)); + // } + } + + ngAfterViewInit() { + // const scrollPos = this.route?.snapshot?.queryParams?.scrollPos; + // if (scrollPos) { + // this.scrollTo(Number(scrollPos)); + // } + } + + // scrollTo(scrollPos: number) { + // this.scrollContainer.scrollTo({ top: scrollPos }); + // } + async scrolledIndexChange(index: number) { - // this.store.queryParamsChanges(); // Update Scrollposition const results = await this.results$.pipe(first()).toPromise(); if (index >= results.length - 20 && results.length - 20 > 0) { this.store.search({ clear: false }); diff --git a/apps/page/catalog/src/lib/article-search/search-results/search-results.module.ts b/apps/page/catalog/src/lib/article-search/search-results/search-results.module.ts new file mode 100644 index 000000000..730c94882 --- /dev/null +++ b/apps/page/catalog/src/lib/article-search/search-results/search-results.module.ts @@ -0,0 +1,19 @@ +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { DomainCatalogModule } from '@domain/catalog'; +import { UiCommonModule } from '@ui/common'; +import { UiIconModule } from '@ui/icon'; +import { OrderByFilterComponent } from './order-by-filter/order-by-filter.component'; +import { StockInfosPipe } from './order-by-filter/stick-infos.pipe'; +import { SearchResultItemComponent } from './search-result-item.component'; +import { ArticleSearchResultsComponent } from './search-results.component'; + +@NgModule({ + imports: [CommonModule, RouterModule, DomainCatalogModule, UiCommonModule, UiIconModule, ScrollingModule], + exports: [ArticleSearchResultsComponent, SearchResultItemComponent, OrderByFilterComponent], + declarations: [ArticleSearchResultsComponent, SearchResultItemComponent, OrderByFilterComponent, StockInfosPipe], + providers: [], +}) +export class SearchResultsModule {} diff --git a/apps/page/catalog/src/lib/page-catalog.component.ts b/apps/page/catalog/src/lib/page-catalog.component.ts index 2d77976d3..a1a279800 100644 --- a/apps/page/catalog/src/lib/page-catalog.component.ts +++ b/apps/page/catalog/src/lib/page-catalog.component.ts @@ -1,12 +1,11 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { ApplicationService } from '@core/application'; -import { ScrollPositionService } from 'apps/ui/common/src/lib/scroll-position/scroll-position.service'; @Component({ selector: 'page-catalog', templateUrl: 'page-catalog.component.html', styleUrls: ['page-catalog.component.scss'], - providers: [ScrollPositionService], + providers: [], changeDetection: ChangeDetectionStrategy.OnPush, }) export class PageCatalogComponent implements OnInit { diff --git a/apps/page/task-calendar/src/lib/modals/article-list/article-list-modal.component.ts b/apps/page/task-calendar/src/lib/modals/article-list/article-list-modal.component.ts index 523047d01..ba5e3c920 100644 --- a/apps/page/task-calendar/src/lib/modals/article-list/article-list-modal.component.ts +++ b/apps/page/task-calendar/src/lib/modals/article-list/article-list-modal.component.ts @@ -56,6 +56,6 @@ export class ArticleListModalComponent { const taskCalendarSearch: string = articles.map((article: ArticleDTO) => article.ean).join(';'); this.modalRef.close('closeAll'); this.moduleSwitcherService.switchToCustomer(); - this.router.navigate(['/product', 'search'], { queryParams: { taskCalendarSearch } }); + this.router.navigate(['/product', 'search', 'results'], { queryParams: { query: taskCalendarSearch } }); } } diff --git a/apps/ui/searchbox/src/lib/ui-searchbox-input.directive.ts b/apps/ui/searchbox/src/lib/ui-searchbox-input.directive.ts index a2c90930d..6982cc81c 100644 --- a/apps/ui/searchbox/src/lib/ui-searchbox-input.directive.ts +++ b/apps/ui/searchbox/src/lib/ui-searchbox-input.directive.ts @@ -1,4 +1,4 @@ -import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, Renderer2 } from '@angular/core'; +import { Directive, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, Renderer2 } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Directive({ @@ -16,7 +16,6 @@ export class UiSearchboxInputDirective implements ControlValueAccessor { focused = false; @Input() - @HostBinding('value') value: string; @Output() @@ -77,5 +76,6 @@ export class UiSearchboxInputDirective implements ControlValueAccessor { this.select.emit(value); } } + this.renderer.setProperty(this.elementRef.nativeElement, 'value', this.value); } } diff --git a/package-lock.json b/package-lock.json index cec10b619..aee7ee206 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5582,6 +5582,12 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/object-hash": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-2.1.0.tgz", + "integrity": "sha512-RW3VRiuQIMo5PJ4Q1IwBtdLHL/t8ACpzUY40norN9ejE6CUBwKetmSxJnITJ0NlzN/ymF1nvPvlpvegtns7yOg==", + "dev": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -5993,7 +5999,7 @@ }, "amdefine": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/amdefine/-/amdefine-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "angular-oauth2-oidc": { @@ -6075,7 +6081,7 @@ }, "application": { "version": "0.1.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/application/-/application-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/application/-/application-0.1.4.tgz", "integrity": "sha1-BvmnPOURkq3hiJIhSkaQHOmar1I=", "requires": { "cookies": "~0.3.0", @@ -6136,7 +6142,7 @@ }, "arr-diff": { "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/arr-diff/-/arr-diff-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, @@ -6148,7 +6154,7 @@ }, "arr-union": { "version": "3.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/arr-union/-/arr-union-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, @@ -6171,7 +6177,7 @@ }, "array-union": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/array-union/-/array-union-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { @@ -6180,13 +6186,13 @@ }, "array-uniq": { "version": "1.0.3", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/array-uniq/-/array-uniq-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array-unique": { "version": "0.3.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/array-unique/-/array-unique-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, @@ -6203,7 +6209,7 @@ }, "asap": { "version": "2.0.6", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/asap/-/asap-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, @@ -6264,12 +6270,12 @@ }, "assert-plus": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/assert-plus/-/assert-plus-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/assign-symbols/-/assign-symbols-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, @@ -6363,7 +6369,7 @@ }, "aws-sign2": { "version": "0.7.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/aws-sign2/-/aws-sign2-0.7.0.tgz", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { @@ -6470,7 +6476,7 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { @@ -6490,7 +6496,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/define-property/-/define-property-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { @@ -6552,7 +6558,7 @@ }, "bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { "tweetnacl": "^0.14.3" @@ -6741,7 +6747,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -6752,7 +6758,7 @@ }, "brorand": { "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/brorand/-/brorand-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, @@ -6911,7 +6917,7 @@ }, "builtin-status-codes": { "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, @@ -7021,7 +7027,7 @@ }, "call-me-maybe": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, @@ -7334,7 +7340,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -7493,7 +7499,7 @@ }, "collection-visit": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/collection-visit/-/collection-visit-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { @@ -7561,13 +7567,13 @@ }, "commondir": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/commondir/-/commondir-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "component-bind": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/component-bind/-/component-bind-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" }, "component-emitter": { @@ -7577,7 +7583,7 @@ }, "component-inherit": { "version": "0.0.3", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/component-inherit/-/component-inherit-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, "compose-function": { @@ -7623,7 +7629,7 @@ }, "concat-map": { "version": "0.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { @@ -7746,7 +7752,7 @@ }, "copy-descriptor": { "version": "0.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, @@ -7887,7 +7893,7 @@ }, "core-util-is": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { @@ -8356,7 +8362,7 @@ }, "cuint": { "version": "0.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/cuint/-/cuint-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", "dev": true }, @@ -8376,7 +8382,7 @@ }, "cyclist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, @@ -8398,7 +8404,7 @@ }, "dashdash": { "version": "1.14.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/dashdash/-/dashdash-1.14.1.tgz", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" @@ -8421,7 +8427,7 @@ }, "debuglog": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/debuglog/-/debuglog-1.0.1.tgz", "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", "dev": true }, @@ -8442,7 +8448,7 @@ }, "decode-uri-component": { "version": "0.2.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, @@ -8631,7 +8637,7 @@ }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { @@ -8686,7 +8692,7 @@ }, "dezalgo": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/dezalgo/-/dezalgo-1.0.3.tgz", "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "dev": true, "requires": { @@ -8696,7 +8702,7 @@ }, "di": { "version": "0.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/di/-/di-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, @@ -8825,7 +8831,7 @@ }, "dns-txt": { "version": "2.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/dns-txt/-/dns-txt-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { @@ -8834,7 +8840,7 @@ }, "dom-serialize": { "version": "2.2.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/dom-serialize/-/dom-serialize-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { @@ -8916,7 +8922,7 @@ }, "ecc-jsbn": { "version": "0.1.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { "jsbn": "~0.1.0", @@ -8925,7 +8931,7 @@ }, "ee-first": { "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/ee-first/-/ee-first-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, @@ -9081,7 +9087,7 @@ }, "ent": { "version": "2.2.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/ent/-/ent-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, @@ -9342,13 +9348,13 @@ }, "exit": { "version": "0.1.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/exit/-/exit-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, "expand-brackets": { "version": "2.1.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/expand-brackets/-/expand-brackets-2.1.4.tgz", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { @@ -9363,7 +9369,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -9372,7 +9378,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -9494,7 +9500,7 @@ }, "extend-shallow": { "version": "3.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/extend-shallow/-/extend-shallow-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { @@ -9553,7 +9559,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/define-property/-/define-property-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { @@ -9562,7 +9568,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -9607,7 +9613,7 @@ }, "fast-deep-equal": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-glob": { @@ -9689,7 +9695,7 @@ }, "fast-json-stable-stringify": { "version": "2.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fastest-levenshtein": { @@ -9789,7 +9795,7 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/fill-range/-/fill-range-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { @@ -9801,7 +9807,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -9967,7 +9973,7 @@ }, "for-in": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/for-in/-/for-in-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, @@ -9999,13 +10005,13 @@ }, "forwarded": { "version": "0.1.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/forwarded/-/forwarded-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, "fragment-cache": { "version": "0.2.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/fragment-cache/-/fragment-cache-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { @@ -10014,7 +10020,7 @@ }, "fresh": { "version": "0.5.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/fresh/-/fresh-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, @@ -10070,7 +10076,7 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { @@ -10163,13 +10169,13 @@ }, "get-value": { "version": "2.0.6", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/get-value/-/get-value-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { "version": "0.1.7", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/getpass/-/getpass-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { "assert-plus": "^1.0.0" @@ -10378,7 +10384,7 @@ }, "has-ansi": { "version": "2.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/has-ansi/-/has-ansi-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" @@ -10394,7 +10400,7 @@ "dependencies": { "isarray": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/isarray/-/isarray-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" } } @@ -10406,7 +10412,7 @@ }, "has-flag": { "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/has-flag/-/has-flag-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { @@ -10422,7 +10428,7 @@ }, "has-value": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/has-value/-/has-value-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { @@ -10433,7 +10439,7 @@ }, "has-values": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/has-values/-/has-values-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { @@ -10443,7 +10449,7 @@ "dependencies": { "kind-of": { "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/kind-of/-/kind-of-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { @@ -10522,7 +10528,7 @@ }, "hpack.js": { "version": "2.1.6", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/hpack.js/-/hpack.js-2.1.6.tgz", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { @@ -10609,7 +10615,7 @@ }, "http-deceiver": { "version": "1.2.7", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/http-deceiver/-/http-deceiver-1.2.7.tgz", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, @@ -10698,7 +10704,7 @@ }, "https-browserify": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/https-browserify/-/https-browserify-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, @@ -10740,7 +10746,7 @@ }, "humanize-ms": { "version": "1.2.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/humanize-ms/-/humanize-ms-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "dev": true, "requires": { @@ -11000,20 +11006,20 @@ }, "image-size": { "version": "0.5.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/image-size/-/image-size-0.5.5.tgz", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "dev": true, "optional": true }, "immediate": { "version": "3.0.6", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/immediate/-/immediate-3.0.6.tgz", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, "import-cwd": { "version": "2.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/import-cwd/-/import-cwd-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dev": true, "requires": { @@ -11032,7 +11038,7 @@ }, "import-from": { "version": "2.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/import-from/-/import-from-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, "requires": { @@ -11057,7 +11063,7 @@ }, "imurmurhash": { "version": "0.1.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/imurmurhash/-/imurmurhash-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, @@ -11082,7 +11088,7 @@ }, "indexof": { "version": "0.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/indexof/-/indexof-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "infer-owner": { @@ -11277,13 +11283,13 @@ }, "ip": { "version": "1.1.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/ip/-/ip-1.1.5.tgz", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, "ip-regex": { "version": "2.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/ip-regex/-/ip-regex-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, @@ -11301,7 +11307,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -11310,7 +11316,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -11357,7 +11363,7 @@ }, "is-binary-path": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/is-binary-path/-/is-binary-path-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { @@ -11409,7 +11415,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -11418,7 +11424,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -11472,13 +11478,13 @@ }, "is-extendable": { "version": "0.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/is-extendable/-/is-extendable-0.1.1.tgz", + "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://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/is-extglob/-/is-extglob-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, @@ -11489,7 +11495,7 @@ }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -11524,7 +11530,7 @@ }, "is-number": { "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/is-number/-/is-number-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { @@ -11533,7 +11539,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -11550,7 +11556,7 @@ }, "is-path-cwd": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", "dev": true }, @@ -11565,7 +11571,7 @@ }, "is-path-inside": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/is-path-inside/-/is-path-inside-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { @@ -11574,7 +11580,7 @@ }, "is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, @@ -11680,7 +11686,7 @@ }, "isarray": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/isarray/-/isarray-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { @@ -11696,7 +11702,7 @@ }, "isobject": { "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/isobject/-/isobject-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, @@ -11878,7 +11884,7 @@ }, "jasminewd2": { "version": "2.2.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/jasminewd2/-/jasminewd2-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", "dev": true }, @@ -11933,7 +11939,7 @@ }, "jsbn": { "version": "0.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/jsbn/-/jsbn-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsesc": { @@ -11994,7 +12000,7 @@ }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { @@ -12026,7 +12032,7 @@ }, "jsonfile": { "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/jsonfile/-/jsonfile-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { @@ -12035,12 +12041,12 @@ }, "jsonify": { "version": "0.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/jsonify/-/jsonify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsonparse": { "version": "1.3.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/jsonparse/-/jsonparse-1.3.1.tgz", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, @@ -12875,7 +12881,7 @@ }, "lines-and-columns": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, @@ -13252,7 +13258,7 @@ }, "map-cache": { "version": "0.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/map-cache/-/map-cache-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, @@ -13263,7 +13269,7 @@ }, "map-visit": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/map-visit/-/map-visit-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { @@ -13352,7 +13358,7 @@ }, "memorystream": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, @@ -13375,7 +13381,7 @@ }, "merge-descriptors": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, @@ -13550,7 +13556,7 @@ }, "minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true }, @@ -13679,7 +13685,7 @@ }, "move-concurrently": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/move-concurrently/-/move-concurrently-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { @@ -13699,7 +13705,7 @@ }, "ms": { "version": "2.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { @@ -14466,7 +14472,7 @@ }, "node-static": { "version": "0.5.9", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/node-static/-/node-static-0.5.9.tgz", + "resolved": "https://registry.npmjs.org/node-static/-/node-static-0.5.9.tgz", "integrity": "sha1-L1vzCUnhc1lYJmwmlBOuvOjL6Jk=" }, "nopt": { @@ -14496,7 +14502,7 @@ }, "normalize-range": { "version": "0.1.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/normalize-range/-/normalize-range-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, @@ -14709,7 +14715,7 @@ }, "load-json-file": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { @@ -14721,7 +14727,7 @@ }, "parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { @@ -14731,7 +14737,7 @@ }, "read-pkg": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { @@ -14742,7 +14748,7 @@ }, "strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true } @@ -14779,7 +14785,7 @@ }, "num2fraction": { "version": "1.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/num2fraction/-/num2fraction-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, @@ -14805,7 +14811,7 @@ }, "object-copy": { "version": "0.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/object-copy/-/object-copy-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { @@ -14816,7 +14822,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -14825,7 +14831,7 @@ }, "kind-of": { "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -14837,8 +14843,7 @@ "object-hash": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", - "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", - "dev": true + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" }, "object-inspect": { "version": "1.7.0", @@ -14864,7 +14869,7 @@ }, "object-visit": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/object-visit/-/object-visit-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { @@ -14895,7 +14900,7 @@ }, "object.pick": { "version": "1.3.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/object.pick/-/object.pick-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { @@ -14922,7 +14927,7 @@ }, "on-finished": { "version": "2.3.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/on-finished/-/on-finished-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { @@ -14937,7 +14942,7 @@ }, "once": { "version": "1.4.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/once/-/once-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" @@ -15087,18 +15092,18 @@ }, "os-browserify": { "version": "0.3.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/os-browserify/-/os-browserify-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, "os-homedir": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { @@ -15460,7 +15465,7 @@ }, "pascalcase": { "version": "0.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/pascalcase/-/pascalcase-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, @@ -15472,7 +15477,7 @@ }, "path-dirname": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/path-dirname/-/path-dirname-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, @@ -15483,7 +15488,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { @@ -15494,7 +15499,7 @@ }, "path-key": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/path-key/-/path-key-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, @@ -15606,7 +15611,7 @@ }, "policyfile": { "version": "0.0.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/policyfile/-/policyfile-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz", "integrity": "sha1-1rgurZiueeviKOLa9ZAzEeyYLk0=" }, "portfinder": { @@ -15639,7 +15644,7 @@ }, "posix-character-classes": { "version": "0.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, @@ -17319,7 +17324,7 @@ }, "promise-retry": { "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/promise-retry/-/promise-retry-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "dev": true, "requires": { @@ -17337,7 +17342,7 @@ }, "proto-list": { "version": "1.2.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/proto-list/-/proto-list-1.2.4.tgz", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, @@ -17689,7 +17694,7 @@ }, "pseudomap": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/pseudomap/-/pseudomap-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { @@ -17779,7 +17784,7 @@ }, "q": { "version": "1.4.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/q/-/q-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, @@ -17940,7 +17945,7 @@ }, "read-cache": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/read-cache/-/read-cache-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "dev": true, "requires": { @@ -18081,7 +18086,7 @@ }, "redis": { "version": "0.6.7", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/redis/-/redis-0.6.7.tgz", + "resolved": "https://registry.npmjs.org/redis/-/redis-0.6.7.tgz", "integrity": "sha1-Dxf5E0aKXLK/CGTk1WZp0FhmjUY=" }, "redsess": { @@ -18275,7 +18280,7 @@ }, "remove-trailing-separator": { "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, @@ -18287,7 +18292,7 @@ }, "repeat-string": { "version": "1.6.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/repeat-string/-/repeat-string-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, @@ -18351,7 +18356,7 @@ }, "requires-port": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/requires-port/-/requires-port-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, @@ -18379,13 +18384,13 @@ }, "resolve-from": { "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/resolve-from/-/resolve-from-3.0.0.tgz", + "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://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/resolve-url/-/resolve-url-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, @@ -18622,7 +18627,7 @@ }, "run-queue": { "version": "1.0.3", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/run-queue/-/run-queue-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { @@ -18651,7 +18656,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -18987,7 +18992,7 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { @@ -19061,7 +19066,7 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/shebang-regex/-/shebang-regex-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, @@ -19172,7 +19177,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -19181,7 +19186,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -19190,7 +19195,7 @@ }, "source-map": { "version": "0.5.7", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/source-map/-/source-map-0.5.7.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } @@ -19209,7 +19214,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/define-property/-/define-property-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { @@ -19258,7 +19263,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -19351,7 +19356,7 @@ }, "isarray": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/isarray/-/isarray-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" } } @@ -19531,7 +19536,7 @@ }, "source-map-url": { "version": "0.4.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/source-map-url/-/source-map-url-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, @@ -19710,7 +19715,7 @@ }, "static-extend": { "version": "0.1.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/static-extend/-/static-extend-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { @@ -19720,7 +19725,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/define-property/-/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -19818,7 +19823,7 @@ }, "strict-uri-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, @@ -19923,7 +19928,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -21011,7 +21016,7 @@ }, "templar": { "version": "0.0.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/templar/-/templar-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/templar/-/templar-0.0.5.tgz", "integrity": "sha1-oXdbZxTfm7jBskFSEthkTIDtqp4=", "requires": { "lru-cache": "~1.1.0" @@ -21175,7 +21180,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -21221,7 +21226,7 @@ }, "to-array": { "version": "0.1.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/to-array/-/to-array-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, "to-arraybuffer": { @@ -21237,7 +21242,7 @@ }, "to-object-path": { "version": "0.3.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/to-object-path/-/to-object-path-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { @@ -21246,7 +21251,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -21269,7 +21274,7 @@ }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel@Local/npm/registry/to-regex-range/-/to-regex-range-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { @@ -21454,7 +21459,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -21466,7 +21471,7 @@ }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -21518,7 +21523,7 @@ }, "typedarray": { "version": "0.0.6", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/typedarray/-/typedarray-0.0.6.tgz", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, @@ -21795,7 +21800,7 @@ }, "unpipe": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/unpipe/-/unpipe-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, @@ -21807,7 +21812,7 @@ }, "unset-value": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/unset-value/-/unset-value-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { @@ -21817,7 +21822,7 @@ "dependencies": { "has-value": { "version": "0.3.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/has-value/-/has-value-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { @@ -21828,7 +21833,7 @@ "dependencies": { "isobject": { "version": "2.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/isobject/-/isobject-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { @@ -21839,7 +21844,7 @@ }, "has-values": { "version": "0.1.4", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/has-values/-/has-values-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true } @@ -21861,13 +21866,13 @@ }, "urix": { "version": "0.1.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/urix/-/urix-0.1.0.tgz", + "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://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/url/-/url-0.11.0.tgz", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, "requires": { @@ -21877,7 +21882,7 @@ "dependencies": { "punycode": { "version": "1.3.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/punycode/-/punycode-1.3.2.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true } @@ -21910,12 +21915,12 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util-promisify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/util-promisify/-/util-promisify-2.1.0.tgz", "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", "dev": true, "requires": { @@ -21936,7 +21941,7 @@ }, "utils-merge": { "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/utils-merge/-/utils-merge-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, @@ -21962,7 +21967,7 @@ }, "validate-npm-package-name": { "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "dev": true, "requires": { @@ -21983,7 +21988,7 @@ }, "verror": { "version": "1.10.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/verror/-/verror-1.10.0.tgz", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { "assert-plus": "^1.0.0", @@ -22036,7 +22041,7 @@ }, "void-elements": { "version": "2.0.1", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/void-elements/-/void-elements-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, @@ -22693,7 +22698,7 @@ }, "websocket-client": { "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/websocket-client/-/websocket-client-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/websocket-client/-/websocket-client-1.0.0.tgz", "integrity": "sha1-+HJ6J1ayMk0f0bceTbTJincAfNo=" }, "websocket-driver": { @@ -22898,7 +22903,7 @@ }, "xmlhttprequest-ssl": { "version": "1.5.5", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, "xtend": { @@ -22998,7 +23003,7 @@ }, "yeast": { "version": "0.1.2", - "resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/yeast/-/yeast-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" }, "yn": { diff --git a/package.json b/package.json index d4f6960e5..745fab373 100644 --- a/package.json +++ b/package.json @@ -64,12 +64,13 @@ "intersection-observer": "^0.11.0", "lodash": "^4.17.21", "ng-connection-service": "^1.0.4", - "ngx-device-detector": "^2.0.6", "ng2-pdf-viewer": "^6.4.1", + "ngx-device-detector": "^2.0.6", "ngx-infinite-scroll": "^7.2.0", "ngx-perfect-scrollbar": "^7.2.1", "ngx-toggle-switch": "^2.0.5", "node-sass": "^4.14.1", + "object-hash": "^2.1.1", "rxjs": "~6.6.3", "smoothscroll-polyfill": "^0.4.4", "socket.io": "^2.2.0", @@ -92,6 +93,7 @@ "@types/jasminewd2": "~2.0.3", "@types/lodash": "^4.14.168", "@types/node": "^12.11.1", + "@types/object-hash": "^2.1.0", "@types/uuid": "^8.3.0", "codelyzer": "^5.1.2", "husky": "^4.2.3", diff --git a/tsconfig.json b/tsconfig.json index ba4d7daa8..d94a0d2c9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -230,6 +230,10 @@ ], "@swagger/remi": [ "apps/swagger/remi/src/public-api.ts" + ], + "@core/cache": [ + "dist/core/cache/core-cache", + "dist/core/cache" ] } }