From b51fc8a7d21ce0f1613de9d03f1a9a31764b0cae Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Fri, 29 Mar 2019 09:14:36 +0000 Subject: [PATCH] document list extensions (demo shell) (#4511) * doclist extensibility test page * desktopOnly support * extensions category, custom column * update code * Fix styling for column templates * update package lock --- demo-shell/src/app/app.routes.ts | 5 + .../app-layout/app-layout.component.ts | 5 + .../extension-presets.component.html | 46 +++++++ .../extension-presets.component.ts | 61 +++++++++ .../extension-presets.module.ts | 56 ++++++++ .../name-column/name-column.component.ts | 95 ++++++++++++++ demo-shell/src/assets/app.extensions.json | 48 +++++++ .../library-name-column.component.ts | 2 +- .../library-role-column.component.ts | 2 +- .../library-status-column.component.ts | 2 +- .../name-column/name-column.component.ts | 2 +- .../trashcan-name-column.component.ts | 4 +- .../src/lib/services/app-extension.service.ts | 16 ++- package-lock.json | 120 +++++++++++------- 14 files changed, 414 insertions(+), 50 deletions(-) create mode 100644 demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.html create mode 100644 demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.ts create mode 100644 demo-shell/src/app/components/document-list/extension-presets/extension-presets.module.ts create mode 100644 demo-shell/src/app/components/document-list/extension-presets/name-column/name-column.component.ts diff --git a/demo-shell/src/app/app.routes.ts b/demo-shell/src/app/app.routes.ts index 02ad2ba0b6..e31c401dc0 100644 --- a/demo-shell/src/app/app.routes.ts +++ b/demo-shell/src/app/app.routes.ts @@ -223,6 +223,11 @@ export const appRoutes: Routes = [ component: FilesComponent, canActivate: [AuthGuardEcm] }, + { + path: 'extensions/document-list/presets', + canActivate: [AuthGuardEcm], + loadChildren: './components/document-list/extension-presets/extension-presets.module#ExtensionPresetsModule' + }, { path: 'files/:id', component: FilesComponent, diff --git a/demo-shell/src/app/components/app-layout/app-layout.component.ts b/demo-shell/src/app/components/app-layout/app-layout.component.ts index ebb65ba3fe..5a732acda3 100644 --- a/demo-shell/src/app/components/app-layout/app-layout.component.ts +++ b/demo-shell/src/app/components/app-layout/app-layout.component.ts @@ -32,6 +32,11 @@ export class AppLayoutComponent implements OnInit { links: Array = [ { href: '/home', icon: 'home', title: 'APP_LAYOUT.HOME' }, + { + href: '/extensions', icon: 'extension', title: 'Extensions', children: [ + { href: '/extensions/document-list/presets', icon: 'extension', title: 'Document List' } + ] + }, { href: '/files', icon: 'folder_open', title: 'APP_LAYOUT.CONTENT_SERVICES' }, { href: '/breadcrumb', icon: 'label', title: 'APP_LAYOUT.BREADCRUMB' }, { href: '/notifications', icon: 'alarm', title: 'APP_LAYOUT.NOTIFICATIONS' }, diff --git a/demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.html b/demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.html new file mode 100644 index 0000000000..29330acc92 --- /dev/null +++ b/demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + diff --git a/demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.ts b/demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.ts new file mode 100644 index 0000000000..027bc0cab9 --- /dev/null +++ b/demo-shell/src/app/components/document-list/extension-presets/extension-presets.component.ts @@ -0,0 +1,61 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { AppExtensionService } from '@alfresco/adf-extensions'; +import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + selector: 'app-extension-presets', + templateUrl: './extension-presets.component.html' +}) +export class ExtensionPresetsComponent implements OnInit, OnDestroy { + onDestroy$ = new Subject(); + + columns: any[] = []; + isSmallScreen = false; + + constructor( + private extensions: AppExtensionService, + private breakpointObserver: BreakpointObserver + ) {} + + ngOnInit() { + this.columns = this.extensions.getDocumentListPreset('files'); + + this.breakpointObserver + .observe([ + Breakpoints.HandsetPortrait, + Breakpoints.HandsetLandscape + ]) + .pipe(takeUntil(this.onDestroy$)) + .subscribe((result) => { + this.isSmallScreen = result.matches; + }); + } + + ngOnDestroy() { + this.onDestroy$.next(true); + this.onDestroy$.complete(); + } + + trackById(index: number, obj: { id: string }) { + return obj.id; + } +} diff --git a/demo-shell/src/app/components/document-list/extension-presets/extension-presets.module.ts b/demo-shell/src/app/components/document-list/extension-presets/extension-presets.module.ts new file mode 100644 index 0000000000..c6c8c9006b --- /dev/null +++ b/demo-shell/src/app/components/document-list/extension-presets/extension-presets.module.ts @@ -0,0 +1,56 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { CoreModule } from '@alfresco/adf-core'; +import { ContentModule } from '@alfresco/adf-content-services'; +import { ExtensionPresetsComponent } from './extension-presets.component'; +import { ExtensionsModule, ExtensionService } from '@alfresco/adf-extensions'; +import { NameColumnComponent } from './name-column/name-column.component'; + +const routes: Routes = [ + { + path: '', + component: ExtensionPresetsComponent + } +]; + +@NgModule({ + imports: [ + CommonModule, + CoreModule.forChild(), + RouterModule.forChild(routes), + ContentModule.forChild(), + ExtensionsModule.forChild() + ], + declarations: [ + ExtensionPresetsComponent, + NameColumnComponent + ], + entryComponents: [ + NameColumnComponent + ] +}) +export class ExtensionPresetsModule { + constructor(extensionService: ExtensionService) { + extensionService.setComponents({ + 'app.columns.name': NameColumnComponent + }); + } +} diff --git a/demo-shell/src/app/components/document-list/extension-presets/name-column/name-column.component.ts b/demo-shell/src/app/components/document-list/extension-presets/name-column/name-column.component.ts new file mode 100644 index 0000000000..938c53d450 --- /dev/null +++ b/demo-shell/src/app/components/document-list/extension-presets/name-column/name-column.component.ts @@ -0,0 +1,95 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Component, + Input, + OnInit, + ChangeDetectionStrategy, + ViewEncapsulation, + ElementRef, + OnDestroy +} from '@angular/core'; +import { NodeEntry } from '@alfresco/js-api'; +import { BehaviorSubject, Subscription } from 'rxjs'; +import { AlfrescoApiService } from '@alfresco/adf-core'; +import { Node } from '@alfresco/js-api'; + +@Component({ + selector: 'app-name-column', + template: ` + + {{ displayText$ | async }} + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + host: { class: 'adf-datatable-cell adf-datatable-link adf-name-column' } +}) +export class NameColumnComponent implements OnInit, OnDestroy { + @Input() + context: any; + + displayText$ = new BehaviorSubject(''); + node: NodeEntry; + + private sub: Subscription; + + constructor(private element: ElementRef, private alfrescoApiService: AlfrescoApiService) {} + + ngOnInit() { + this.updateValue(); + + this.sub = this.alfrescoApiService.nodeUpdated.subscribe((node: Node) => { + const row = this.context.row; + if (row) { + const { entry } = row.node; + + if (entry === node) { + row.node = { entry }; + this.updateValue(); + } + } + }); + } + + protected updateValue() { + this.node = this.context.row.node; + + if (this.node && this.node.entry) { + this.displayText$.next(this.node.entry.name || this.node.entry.id); + } + } + + onClick() { + this.element.nativeElement.dispatchEvent( + new CustomEvent('name-click', { + bubbles: true, + detail: { + node: this.node + } + }) + ); + } + + ngOnDestroy() { + if (this.sub) { + this.sub.unsubscribe(); + this.sub = null; + } + } +} diff --git a/demo-shell/src/assets/app.extensions.json b/demo-shell/src/assets/app.extensions.json index 6b2338374f..dd2638a6a2 100644 --- a/demo-shell/src/assets/app.extensions.json +++ b/demo-shell/src/assets/app.extensions.json @@ -10,6 +10,54 @@ "features": { "viewer": { "content": [] + }, + + "documentList": { + "files": [ + { + "id": "app.files.thumbnail", + "key": "$thumbnail", + "type": "image", + "sortable": false, + "desktopOnly": false + }, + { + "id": "app.files.name", + "key": "name", + "title": "Name", + "type": "text", + "class": "adf-ellipsis-cell adf-expand-cell-5", + "sortable": true, + "template": "app.columns.name", + "desktopOnly": false + }, + { + "id": "app.files.size", + "key": "content.sizeInBytes", + "title": "Size", + "type": "fileSize", + "sortable": true, + "desktopOnly": true + }, + { + "id": "app.files.modifiedOn", + "key": "modifiedAt", + "title": "Modified on", + "type": "date", + "format": "timeAgo", + "sortable": true, + "desktopOnly": true + }, + { + "id": "app.files.modifiedBy", + "key": "modifiedByUser.displayName", + "title": "Modified by", + "type": "text", + "class": "adf-ellipsis-cell", + "sortable": true, + "desktopOnly": true + } + ] } } } diff --git a/lib/content-services/document-list/components/library-name-column/library-name-column.component.ts b/lib/content-services/document-list/components/library-name-column/library-name-column.component.ts index a5b3f65595..712fe08e7a 100644 --- a/lib/content-services/document-list/components/library-name-column/library-name-column.component.ts +++ b/lib/content-services/document-list/components/library-name-column/library-name-column.component.ts @@ -32,7 +32,7 @@ import { BehaviorSubject, Subscription } from 'rxjs'; @Component({ selector: 'adf-library-name-column', template: ` - + {{ displayText$ | async }} `, diff --git a/lib/content-services/document-list/components/library-role-column/library-role-column.component.ts b/lib/content-services/document-list/components/library-role-column/library-role-column.component.ts index 39817101ce..90a431efcb 100644 --- a/lib/content-services/document-list/components/library-role-column/library-role-column.component.ts +++ b/lib/content-services/document-list/components/library-role-column/library-role-column.component.ts @@ -31,7 +31,7 @@ import { ShareDataRow } from '../../data/share-data-row.model'; @Component({ selector: 'adf-library-role-column', template: ` - + {{ (displayText$ | async) | translate }} `, diff --git a/lib/content-services/document-list/components/library-status-column/library-status-column.component.ts b/lib/content-services/document-list/components/library-status-column/library-status-column.component.ts index 579d5aa62a..5b009ebe42 100644 --- a/lib/content-services/document-list/components/library-status-column/library-status-column.component.ts +++ b/lib/content-services/document-list/components/library-status-column/library-status-column.component.ts @@ -24,7 +24,7 @@ import { ShareDataRow } from '../../data/share-data-row.model'; @Component({ selector: 'adf-library-status-column', template: ` - + {{ (displayText$ | async) | translate }} `, diff --git a/lib/content-services/document-list/components/name-column/name-column.component.ts b/lib/content-services/document-list/components/name-column/name-column.component.ts index 824e3cb0b6..ad093d99cf 100644 --- a/lib/content-services/document-list/components/name-column/name-column.component.ts +++ b/lib/content-services/document-list/components/name-column/name-column.component.ts @@ -33,7 +33,7 @@ import { ShareDataRow } from '../../data/share-data-row.model'; @Component({ selector: 'adf-name-column', template: ` - + {{ displayText$ | async }} `, diff --git a/lib/content-services/document-list/components/trashcan-name-column/trashcan-name-column.component.ts b/lib/content-services/document-list/components/trashcan-name-column/trashcan-name-column.component.ts index 2a45927267..d2dae7a225 100644 --- a/lib/content-services/document-list/components/trashcan-name-column/trashcan-name-column.component.ts +++ b/lib/content-services/document-list/components/trashcan-name-column/trashcan-name-column.component.ts @@ -29,10 +29,10 @@ import { ShareDataRow } from '../../data/share-data-row.model'; selector: 'adf-trashcan-name-column', template: ` - {{ displayText }} + {{ displayText }} - {{ displayText }} + {{ displayText }} `, changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/lib/extensions/src/lib/services/app-extension.service.ts b/lib/extensions/src/lib/services/app-extension.service.ts index 9b83b7e253..5da3d61b9a 100644 --- a/lib/extensions/src/lib/services/app-extension.service.ts +++ b/lib/extensions/src/lib/services/app-extension.service.ts @@ -20,6 +20,7 @@ import { ExtensionConfig, ExtensionRef } from '../config/extension.config'; import { ExtensionService } from '../services/extension.service'; import { Observable, BehaviorSubject } from 'rxjs'; import { ViewerExtensionRef } from '../config/viewer.extensions'; +import { DocumentListPresetRef } from '../config/document-list.extensions'; @Injectable({ providedIn: 'root' @@ -49,9 +50,22 @@ export class AppExtensionService { this._references.next(references); } + /** + * Provides a collection of document list columns for the particular preset. + * The result is filtered by the **disabled** state. + * @param key Preset key. + */ + getDocumentListPreset(key: string) { + return this.extensionService + .getElements( + `features.documentList.${key}` + ) + .filter((entry) => !entry.disabled); + } + /** * Provides a list of the Viewer content extensions, - * filtered by disabled state and rules. + * filtered by **disabled** state and **rules**. */ getViewerExtensions(): ViewerExtensionRef[] { return this.extensionService diff --git a/package-lock.json b/package-lock.json index af7b38a6b5..7f2abe3339 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,61 +1,61 @@ { "name": "alfresco-components", - "version": "3.2.0-beta1", + "version": "3.2.0-beta2", "lockfileVersion": 1, "requires": true, "dependencies": { "@alfresco/adf-content-services": { - "version": "3.2.0-beta1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-content-services/-/adf-content-services-3.2.0-beta1.tgz", - "integrity": "sha512-IDMvGc9gFMkBuIuvP9pM7WhpWGXTbKGl/Wy/v8ZQUQJKqI+/frDBJLCer1oct22Mw2H+pq9NzAAmHqGOiqh3cw==", + "version": "3.2.0-beta2", + "resolved": "https://registry.npmjs.org/@alfresco/adf-content-services/-/adf-content-services-3.2.0-beta2.tgz", + "integrity": "sha512-1VKsXquJjtWXFcuMmhAbhM2eqcDXWpI28ZFEnE6zOLrRF4qqUyDCEpPTAjfnGcd503rAzT0IKiNftfRzcgphnA==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-core": { - "version": "3.2.0-beta1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-3.2.0-beta1.tgz", - "integrity": "sha512-tWdC2ht65MTcPBn2ILqRTy9T8MbXv5hzJIxzEOqoOSLf1pbuyGBN2dI6vWPzmtbZeLTMJg6B5DMeyHykxJHYkQ==", + "version": "3.2.0-beta2", + "resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-3.2.0-beta2.tgz", + "integrity": "sha512-swIk99PpbTWObq63Dct1kQz+YHLuJ6J+RZu/bkwJkxodATkcpLQcPPO0l7bdMN2/uYduI5vD9zy8Pm6Ssg9izQ==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-extensions": { - "version": "3.2.0-beta1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-extensions/-/adf-extensions-3.2.0-beta1.tgz", - "integrity": "sha512-hkgQ97t/jZYTv1COhjt3RVONF8HmXM9Uo7/fvDDbGoac+hc2nJbQCWKdIwysZwkglHHbBRZSj/DVwppbKuNroQ==", + "version": "3.2.0-beta2", + "resolved": "https://registry.npmjs.org/@alfresco/adf-extensions/-/adf-extensions-3.2.0-beta2.tgz", + "integrity": "sha512-vvT5lO8Jk9hQF9Ky2S6sZKu9w8KDeTHPJhJ/w12z7xN5FybWLuDP8kXVN0UDKplJe6mSPBsMJ0uU0OwLTK/qvA==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-insights": { - "version": "3.2.0-beta1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-insights/-/adf-insights-3.2.0-beta1.tgz", - "integrity": "sha512-9bXFrCCzYbD1/mB7KIwrFKqLBx5UCEZ0+V3+MIpbJRprOU5iTlvzim1uNFbvJX8TNoHi2trEADo+0uSo7F+Zog==", + "version": "3.2.0-beta2", + "resolved": "https://registry.npmjs.org/@alfresco/adf-insights/-/adf-insights-3.2.0-beta2.tgz", + "integrity": "sha512-Jgq76LO3/4+6xkfha0tHWAZKv/EYe0DhdmdNMCzRtJXZlWi63mADA4hcWpwGApw7Gnn80o28TojJ8LGWfYD3Cw==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-process-services": { - "version": "3.2.0-beta1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services/-/adf-process-services-3.2.0-beta1.tgz", - "integrity": "sha512-ljFWeaUn12x5MYBIBk1fEMqtFZJWZk32ivpuxpVMjiKrL55ryxrzSnc6SNddJMpcm1l6wXdO+ljygSUr3yhcDA==", + "version": "3.2.0-beta2", + "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services/-/adf-process-services-3.2.0-beta2.tgz", + "integrity": "sha512-CiCMctQPbRKDYq2UzobSZ/vu0eKLxAvcIxzi8q0up1qOwhEjK/EJ5vpjzsuJ2pJpvjInIWd5iMFLQD02O84Dnw==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-process-services-cloud": { - "version": "3.2.0-beta1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services-cloud/-/adf-process-services-cloud-3.2.0-beta1.tgz", - "integrity": "sha512-yV1V4UzEgaqvbiqFo/m8/bMeiTzWHV9PodaqV9T7j1tDkrf+QFpvWIf/eXpXRtTOqdFZbt2ojcZLEd7drOgM4g==", + "version": "3.2.0-beta2", + "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services-cloud/-/adf-process-services-cloud-3.2.0-beta2.tgz", + "integrity": "sha512-EJVNgbtTHeSTMpg4YdZvVthSmNkG+wA2K5JYfxCayj6jJfFCe0ykyr1g6Z+DmbkfhxOQpgsaR651uya2XdvIbQ==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-testing": { - "version": "3.2.0-beta1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-testing/-/adf-testing-3.2.0-beta1.tgz", - "integrity": "sha512-EL9hmTsCqSNXe4EK0lIw1XUy1utL0ooNltsafr4nsAUI5sFNUbWC/UZynmBv9fLvTGIe4Fd3ubDZgnBNBUNtSw==", + "version": "3.2.0-beta2", + "resolved": "https://registry.npmjs.org/@alfresco/adf-testing/-/adf-testing-3.2.0-beta2.tgz", + "integrity": "sha512-OdQ9QXrwWF0ZE1z6QBJV912pgL0quEph/BMUeMBExMDZjRMW0FF53Rucbul5C6yDu5OpRaHVwYCmJDaAC1D+KQ==", "requires": { "tslib": "^1.9.0" } @@ -2880,6 +2880,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, + "optional": true, "requires": { "hoek": "2.x.x" } @@ -3543,7 +3544,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==", - "dev": true + "dev": true, + "optional": true }, "buffer-xor": { "version": "1.0.3", @@ -6790,7 +6792,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -6811,12 +6814,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6831,17 +6836,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -6958,7 +6966,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -6970,6 +6979,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6984,6 +6994,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6991,12 +7002,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7015,6 +7028,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -7095,7 +7109,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -7107,6 +7122,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -7192,7 +7208,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -7228,6 +7245,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7247,6 +7265,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -7290,12 +7309,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -8062,7 +8083,8 @@ "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "dev": true, + "optional": true }, "homedir-polyfill": { "version": "1.0.3", @@ -8225,6 +8247,7 @@ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", "dev": true, + "optional": true, "requires": { "httpreq": ">=0.4.22", "underscore": "~1.7.0" @@ -8234,7 +8257,8 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "dev": true + "dev": true, + "optional": true }, "https-browserify": { "version": "1.0.0", @@ -9135,7 +9159,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true + "dev": true, + "optional": true }, "is-redirect": { "version": "1.0.0", @@ -10068,13 +10093,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", - "dev": true + "dev": true, + "optional": true }, "libmime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", "dev": true, + "optional": true, "requires": { "iconv-lite": "0.4.15", "libbase64": "0.1.0", @@ -10085,7 +10112,8 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true + "dev": true, + "optional": true } } }, @@ -10093,7 +10121,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "dev": true + "dev": true, + "optional": true }, "license-checker": { "version": "25.0.1", @@ -12158,13 +12187,15 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", - "dev": true + "dev": true, + "optional": true }, "nodemailer-shared": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", "dev": true, + "optional": true, "requires": { "nodemailer-fetch": "1.6.0" } @@ -12197,7 +12228,8 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "dev": true + "dev": true, + "optional": true }, "nopt": { "version": "3.0.6", @@ -15788,6 +15820,7 @@ "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", "dev": true, + "optional": true, "requires": { "httpntlm": "1.6.1", "nodemailer-shared": "1.1.0" @@ -17867,7 +17900,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true + "dev": true, + "optional": true }, "unherit": { "version": "1.1.1",