diff --git a/package.json b/package.json index 302cdd0297bc..570285e8fb85 100644 --- a/package.json +++ b/package.json @@ -48,24 +48,24 @@ "@types/jasmine": "2.5.41", "@types/merge2": "^0.3.29", "@types/minimist": "^1.2.0", - "@types/node": "^7.0.4", + "@types/node": "^7.0.5", "@types/run-sequence": "^0.0.28", "@types/rx": "2.5.33", "axe-core": "^2.1.7", "axe-webdriverjs": "^0.5.0", "conventional-changelog": "^1.1.0", - "dgeni": "^0.4.2", + "dgeni": "^0.4.7", "dgeni-packages": "^0.16.5", - "firebase-admin": "^4.0.6", + "firebase-admin": "^4.1.2", "firebase-tools": "^2.2.1", "fs-extra": "^2.0.0", "glob": "^7.1.1", - "google-cloud": "^0.45.1", + "google-cloud": "^0.48.0", "gulp": "^3.9.1", "gulp-autoprefixer": "^3.1.1", "gulp-better-rollup": "^1.0.2", "gulp-clean": "^0.3.2", - "gulp-clean-css": "^2.3.2", + "gulp-clean-css": "^3.0.3", "gulp-cli": "^1.2.2", "gulp-connect": "^5.0.0", "gulp-flatten": "^0.3.1", @@ -75,35 +75,35 @@ "gulp-markdown": "^1.2.0", "gulp-rename": "^1.2.2", "gulp-sass": "^3.1.0", - "gulp-sourcemaps": "^2.4.0", + "gulp-sourcemaps": "^2.4.1", "gulp-transform": "^1.1.0", "hammerjs": "^2.0.8", "highlight.js": "^9.9.0", "image-diff": "^1.6.3", "jasmine-core": "^2.5.2", - "karma": "^1.4.1", + "karma": "^1.5.0", "karma-browserstack-launcher": "^1.2.0", "karma-chrome-launcher": "^2.0.0", - "karma-firefox-launcher": "^1.0.0", + "karma-firefox-launcher": "^1.0.1", "karma-jasmine": "^1.1.0", "karma-sauce-launcher": "^1.1.0", "karma-sourcemap-loader": "^0.3.7", - "madge": "^1.5.0", + "madge": "^1.6.0", "merge2": "^1.0.2", "minimist": "^1.2.0", - "node-sass": "^4.3.0", - "protractor": "^5.1.0", + "node-sass": "^4.5.0", + "protractor": "^5.1.1", "resolve-bin": "^0.4.0", "run-sequence": "^1.2.2", "sass": "^0.5.0", - "selenium-webdriver": "^3.0.1", + "selenium-webdriver": "^3.1.0", "stylelint": "^7.8.0", "travis-after-modes": "0.0.7", - "ts-node": "^2.0.0", + "ts-node": "^2.1.0", "tslint": "^4.4.2", "tslint-no-unused-var": "0.0.6", "typescript": "~2.0.10", - "uglify-js": "^2.7.5", + "uglify-js": "^2.8.7", "web-animations-js": "^2.2.2" } } diff --git a/src/demo-app/autocomplete/autocomplete-demo.ts b/src/demo-app/autocomplete/autocomplete-demo.ts index 7f9ed2de234b..00fbeeb1a15c 100644 --- a/src/demo-app/autocomplete/autocomplete-demo.ts +++ b/src/demo-app/autocomplete/autocomplete-demo.ts @@ -88,7 +88,8 @@ export class AutocompleteDemo { } filterStates(val: string) { - return val ? this.states.filter((s) => s.name.match(new RegExp(val, 'gi'))) : this.states; + return val ? this.states.filter(s => new RegExp(`^${val}`, 'gi').test(s.name)) + : this.states; } } diff --git a/src/demo-app/checkbox/checkbox-demo.html b/src/demo-app/checkbox/checkbox-demo.html index 73fdfc6e2c91..28760dac161c 100644 --- a/src/demo-app/checkbox/checkbox-demo.html +++ b/src/demo-app/checkbox/checkbox-demo.html @@ -1,7 +1,8 @@

md-checkbox: Basic Example

Textarea Both: - - email -   - - -  @gmail.com - + email  +  @gmail.com

diff --git a/src/examples/autocomplete-overview/autocomplete-overview-example.ts b/src/examples/autocomplete-overview/autocomplete-overview-example.ts index 515e35e9e501..7b28b28b998b 100644 --- a/src/examples/autocomplete-overview/autocomplete-overview-example.ts +++ b/src/examples/autocomplete-overview/autocomplete-overview-example.ts @@ -71,7 +71,8 @@ export class AutocompleteOverviewExample { } filterStates(val: string) { - return val ? this.states.filter((s) => new RegExp(val, 'gi').test(s)) : this.states; + return val ? this.states.filter(s => new RegExp(`^${val}`, 'gi').test(s)) + : this.states; } } diff --git a/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts b/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts index e8538a0f8ed1..b621aaa51e6f 100644 --- a/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts +++ b/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts @@ -7,7 +7,7 @@ import {Component} from '@angular/core'; styleUrls: ['./progress-spinner-configurable-example.css'], }) export class ProgressSpinnerConfigurableExample { - color = 'praimry'; + color = 'primary'; mode = 'determinate'; value = 50; } diff --git a/src/lib/autocomplete/autocomplete.md b/src/lib/autocomplete/autocomplete.md index 19f4acbededa..7d2884c48fa7 100644 --- a/src/lib/autocomplete/autocomplete.md +++ b/src/lib/autocomplete/autocomplete.md @@ -48,15 +48,19 @@ local template variable (here we called it "auto"), and binding that variable to At this point, the autocomplete panel should be toggleable on focus and options should be selectable. But if we want our options to filter when we type, we need to add a custom filter. -You can filter the options in any way you want based on the text input. Here we will do a simple string test on the -input value to see if it matches the option value. We already have access to the built-in `valueChanges` observable on -the `FormControl`, so we can simply map the text input's values to the suggested options by passing them through this -filter. The resulting observable (`filteredOptions`) can be added to the template in place of the `options` property -using the `async` pipe. +You can filter the options in any way you like based on the text input*. Here we will perform a simple string test on +the option value to see if it matches the input value, starting from the option's first letter. We already have access +to the built-in `valueChanges` observable on the `FormControl`, so we can simply map the text input's values to the +suggested options by passing them through this filter. The resulting observable (`filteredOptions`) can be added to the +template in place of the `options` property using the `async` pipe. Below we are also priming our value change stream with `null` so that the options are filtered by that value on init (before there are any value changes). +*For optimal accessibility, you may want to consider adding text guidance on the page to explain filter criteria. +This is especially helpful for screenreader users if you're using a non-standard filter that doesn't limit matches +to the beginning of the string. + *my-comp.ts* ```ts class MyComp { @@ -75,7 +79,7 @@ class MyComp { } filter(val: string): string[] { - return this.options.filter(option => new RegExp(val, 'gi').test(option)); + return this.options.filter(option => new RegExp(`^${val}`, 'gi').test(option)); } } ``` @@ -134,7 +138,7 @@ class MyComp { } filter(name: string): User[] { - return this.options.filter(option => new RegExp(name, 'gi').test(option)); + return this.options.filter(option => new RegExp(`^${name}`, 'gi').test(option)); } displayFn(user: User): string { diff --git a/src/lib/autocomplete/autocomplete.scss b/src/lib/autocomplete/autocomplete.scss index 80fbcc56d6d2..a72841cbbd54 100644 --- a/src/lib/autocomplete/autocomplete.scss +++ b/src/lib/autocomplete/autocomplete.scss @@ -15,7 +15,8 @@ $mat-autocomplete-panel-above-offset: -24px !default; .mat-autocomplete-panel { @include mat-menu-base(); visibility: hidden; - + + max-width: none; max-height: $mat-autocomplete-panel-max-height; position: relative; @@ -34,4 +35,4 @@ $mat-autocomplete-panel-above-offset: -24px !default; &.mat-autocomplete-hidden { visibility: hidden; } -} \ No newline at end of file +} diff --git a/src/lib/autocomplete/index.ts b/src/lib/autocomplete/index.ts index 9cbfc471ee27..7694e665ebbc 100644 --- a/src/lib/autocomplete/index.ts +++ b/src/lib/autocomplete/index.ts @@ -4,8 +4,6 @@ import {MdOptionModule, OverlayModule, OVERLAY_PROVIDERS, CompatibilityModule} f import {CommonModule} from '@angular/common'; import {MdAutocomplete} from './autocomplete'; import {MdAutocompleteTrigger} from './autocomplete-trigger'; -export * from './autocomplete'; -export * from './autocomplete-trigger'; @NgModule({ imports: [MdOptionModule, OverlayModule, CompatibilityModule, CommonModule], @@ -21,3 +19,7 @@ export class MdAutocompleteModule { }; } } + + +export * from './autocomplete'; +export * from './autocomplete-trigger'; diff --git a/src/lib/button-toggle/_button-toggle-theme.scss b/src/lib/button-toggle/_button-toggle-theme.scss index 912ade1b3428..bebdd1e7be3a 100644 --- a/src/lib/button-toggle/_button-toggle-theme.scss +++ b/src/lib/button-toggle/_button-toggle-theme.scss @@ -23,16 +23,16 @@ } .mat-button-toggle-checked { - background-color: mat-color($mat-grey, 300); + background-color: mat-color($background, selected-button); color: mat-color($foreground, base); } .mat-button-toggle-disabled { - background-color: map_get($mat-grey, 200); + background-color: mat-color($background, disabled-button-toggle); color: mat-color($foreground, disabled-button); &.mat-button-toggle-checked { - background-color: mat-color($mat-grey, 400); + background-color: mat-color($background, selected-disabled-button); } } } diff --git a/src/lib/button-toggle/button-toggle.spec.ts b/src/lib/button-toggle/button-toggle.spec.ts index d6907b557ccb..6050dd4449a9 100644 --- a/src/lib/button-toggle/button-toggle.spec.ts +++ b/src/lib/button-toggle/button-toggle.spec.ts @@ -9,11 +9,12 @@ import {NgControl, FormsModule, ReactiveFormsModule, FormControl} from '@angular import {Component, DebugElement} from '@angular/core'; import {By} from '@angular/platform-browser'; import { - MdButtonToggleGroup, - MdButtonToggle, - MdButtonToggleGroupMultiple, - MdButtonToggleChange, MdButtonToggleModule, -} from './button-toggle'; + MdButtonToggleGroup, + MdButtonToggle, + MdButtonToggleGroupMultiple, + MdButtonToggleChange, + MdButtonToggleModule, +} from './index'; describe('MdButtonToggle', () => { diff --git a/src/lib/button-toggle/button-toggle.ts b/src/lib/button-toggle/button-toggle.ts index 7bc964988040..3cc0a0c21209 100644 --- a/src/lib/button-toggle/button-toggle.ts +++ b/src/lib/button-toggle/button-toggle.ts @@ -1,32 +1,24 @@ import { - NgModule, - ModuleWithProviders, - Component, - ContentChildren, - Directive, - ElementRef, - Renderer, - EventEmitter, - HostBinding, - Input, - OnInit, - Optional, - Output, - QueryList, - ViewChild, - ViewEncapsulation, - forwardRef, - AfterViewInit + Component, + ContentChildren, + Directive, + ElementRef, + Renderer, + EventEmitter, + HostBinding, + Input, + OnInit, + Optional, + Output, + QueryList, + ViewChild, + ViewEncapsulation, + forwardRef, + AfterViewInit, } from '@angular/core'; -import {NG_VALUE_ACCESSOR, ControlValueAccessor, FormsModule} from '@angular/forms'; +import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; import {Observable} from 'rxjs/Observable'; -import { - FocusOriginMonitor, - UniqueSelectionDispatcher, - coerceBooleanProperty, - UNIQUE_SELECTION_DISPATCHER_PROVIDER, - CompatibilityModule, -} from '../core'; +import {UniqueSelectionDispatcher, coerceBooleanProperty, FocusOriginMonitor} from '../core'; /** Acceptable types for a button toggle. */ export type ToggleType = 'checkbox' | 'radio'; @@ -469,25 +461,3 @@ export class MdButtonToggle implements OnInit { this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus'); } } - - -@NgModule({ - imports: [FormsModule, CompatibilityModule], - exports: [ - MdButtonToggleGroup, - MdButtonToggleGroupMultiple, - MdButtonToggle, - CompatibilityModule, - ], - declarations: [MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle], - providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, FocusOriginMonitor] -}) -export class MdButtonToggleModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdButtonToggleModule, - providers: [] - }; - } -} diff --git a/src/lib/button-toggle/index.ts b/src/lib/button-toggle/index.ts index 9c447d60f111..a2967210997c 100644 --- a/src/lib/button-toggle/index.ts +++ b/src/lib/button-toggle/index.ts @@ -1 +1,33 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle} from './button-toggle'; +import { + UNIQUE_SELECTION_DISPATCHER_PROVIDER, + CompatibilityModule, + FocusOriginMonitor, +} from '../core'; + + +@NgModule({ + imports: [FormsModule, CompatibilityModule], + exports: [ + MdButtonToggleGroup, + MdButtonToggleGroupMultiple, + MdButtonToggle, + CompatibilityModule, + ], + declarations: [MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle], + providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, FocusOriginMonitor] +}) +export class MdButtonToggleModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdButtonToggleModule, + providers: [] + }; + } +} + + export * from './button-toggle'; diff --git a/src/lib/button/button.spec.ts b/src/lib/button/button.spec.ts index 564a3a29d0f3..aba70a71e02e 100644 --- a/src/lib/button/button.spec.ts +++ b/src/lib/button/button.spec.ts @@ -1,7 +1,7 @@ import {async, TestBed, ComponentFixture} from '@angular/core/testing'; import {Component} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdButtonModule} from './button'; +import {MdButtonModule} from './index'; import {ViewportRuler} from '../core/overlay/position/viewport-ruler'; import {FakeViewportRuler} from '../core/overlay/position/fake-viewport-ruler'; diff --git a/src/lib/button/button.ts b/src/lib/button/button.ts index 029e152a12dc..8cddd0d647a3 100644 --- a/src/lib/button/button.ts +++ b/src/lib/button/button.ts @@ -6,11 +6,9 @@ import { ChangeDetectionStrategy, ElementRef, Renderer, - NgModule, - ModuleWithProviders, Directive, + Directive, } from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {MdRippleModule, coerceBooleanProperty, CompatibilityModule} from '../core'; +import {coerceBooleanProperty} from '../core'; // TODO(jelbourn): Make the `isMouseDown` stuff done with one global listener. @@ -219,35 +217,3 @@ export class MdAnchor extends MdButton { } } } - - -@NgModule({ - imports: [CommonModule, MdRippleModule, CompatibilityModule], - exports: [ - MdButton, MdAnchor, - CompatibilityModule, - MdButtonCssMatStyler, - MdRaisedButtonCssMatStyler, - MdIconButtonCssMatStyler, - MdFabCssMatStyler, - MdMiniFabCssMatStyler - ], - declarations: [ - MdButton, - MdAnchor, - MdButtonCssMatStyler, - MdRaisedButtonCssMatStyler, - MdIconButtonCssMatStyler, - MdFabCssMatStyler, - MdMiniFabCssMatStyler - ], -}) -export class MdButtonModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdButtonModule, - providers: [] - }; - } -} diff --git a/src/lib/button/index.ts b/src/lib/button/index.ts index eaf5eea7f1c1..1f96453f5290 100644 --- a/src/lib/button/index.ts +++ b/src/lib/button/index.ts @@ -1 +1,48 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {MdRippleModule, CompatibilityModule} from '../core'; +import { + MdButton, + MdAnchor, + MdButtonCssMatStyler, + MdRaisedButtonCssMatStyler, + MdIconButtonCssMatStyler, + MdFabCssMatStyler, + MdMiniFabCssMatStyler, +} from './button'; + + +@NgModule({ + imports: [CommonModule, MdRippleModule, CompatibilityModule], + exports: [ + MdButton, + MdAnchor, + CompatibilityModule, + MdButtonCssMatStyler, + MdRaisedButtonCssMatStyler, + MdIconButtonCssMatStyler, + MdFabCssMatStyler, + MdMiniFabCssMatStyler + ], + declarations: [ + MdButton, + MdAnchor, + MdButtonCssMatStyler, + MdRaisedButtonCssMatStyler, + MdIconButtonCssMatStyler, + MdFabCssMatStyler, + MdMiniFabCssMatStyler + ], +}) +export class MdButtonModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdButtonModule, + providers: [] + }; + } +} + + export * from './button'; diff --git a/src/lib/card/card.ts b/src/lib/card/card.ts index 8db5bbabe612..68745e0027b7 100644 --- a/src/lib/card/card.ts +++ b/src/lib/card/card.ts @@ -1,12 +1,9 @@ import { - NgModule, - ModuleWithProviders, Component, ViewEncapsulation, ChangeDetectionStrategy, Directive } from '@angular/core'; -import {CompatibilityModule} from '../core'; /** @@ -188,39 +185,3 @@ export class MdCardHeader {} } }) export class MdCardTitleGroup {} - - -@NgModule({ - imports: [CompatibilityModule], - exports: [ - MdCard, - MdCardHeader, - MdCardTitleGroup, - MdCardContent, - MdCardTitle, - MdCardSubtitle, - MdCardActions, - MdCardFooter, - MdCardSmImage, - MdCardMdImage, - MdCardLgImage, - MdCardImage, - MdCardXlImage, - MdCardAvatar, - CompatibilityModule, - ], - declarations: [ - MdCard, MdCardHeader, MdCardTitleGroup, MdCardContent, MdCardTitle, MdCardSubtitle, - MdCardActions, MdCardFooter, MdCardSmImage, MdCardMdImage, MdCardLgImage, MdCardImage, - MdCardXlImage, MdCardAvatar, - ], -}) -export class MdCardModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdCardModule, - providers: [] - }; - } -} diff --git a/src/lib/card/index.ts b/src/lib/card/index.ts index cb5809fedb2d..1b6a7934ce3e 100644 --- a/src/lib/card/index.ts +++ b/src/lib/card/index.ts @@ -1 +1,57 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CompatibilityModule} from '../core'; +import { + MdCard, + MdCardHeader, + MdCardTitleGroup, + MdCardContent, + MdCardTitle, + MdCardSubtitle, + MdCardActions, + MdCardFooter, + MdCardSmImage, + MdCardMdImage, + MdCardLgImage, + MdCardImage, + MdCardXlImage, + MdCardAvatar, +} from './card'; + + +@NgModule({ + imports: [CompatibilityModule], + exports: [ + MdCard, + MdCardHeader, + MdCardTitleGroup, + MdCardContent, + MdCardTitle, + MdCardSubtitle, + MdCardActions, + MdCardFooter, + MdCardSmImage, + MdCardMdImage, + MdCardLgImage, + MdCardImage, + MdCardXlImage, + MdCardAvatar, + CompatibilityModule, + ], + declarations: [ + MdCard, MdCardHeader, MdCardTitleGroup, MdCardContent, MdCardTitle, MdCardSubtitle, + MdCardActions, MdCardFooter, MdCardSmImage, MdCardMdImage, MdCardLgImage, MdCardImage, + MdCardXlImage, MdCardAvatar, + ], +}) +export class MdCardModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdCardModule, + providers: [] + }; + } +} + + export * from './card'; diff --git a/src/lib/checkbox/checkbox.html b/src/lib/checkbox/checkbox.html index 185e28b16ea9..8c979eff04ef 100644 --- a/src/lib/checkbox/checkbox.html +++ b/src/lib/checkbox/checkbox.html @@ -5,13 +5,13 @@ [id]="inputId" [required]="required" [checked]="checked" + [value]="value" [disabled]="disabled" [name]="name" [tabIndex]="tabIndex" [indeterminate]="indeterminate" [attr.aria-label]="ariaLabel" [attr.aria-labelledby]="ariaLabelledby" - (focus)="_onInputFocus()" (blur)="_onInputBlur()" (change)="_onInteractionEvent($event)" (click)="_onInputClick($event)"> diff --git a/src/lib/checkbox/checkbox.spec.ts b/src/lib/checkbox/checkbox.spec.ts index 47d7a1efbc37..4f75c88051b0 100644 --- a/src/lib/checkbox/checkbox.spec.ts +++ b/src/lib/checkbox/checkbox.spec.ts @@ -1,15 +1,34 @@ -import {async, fakeAsync, flushMicrotasks, ComponentFixture, TestBed} from '@angular/core/testing'; +import { + async, + fakeAsync, + flushMicrotasks, + ComponentFixture, + TestBed, + tick, +} from '@angular/core/testing'; import {NgControl, FormsModule, ReactiveFormsModule, FormControl} from '@angular/forms'; import {Component, DebugElement} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdCheckbox, MdCheckboxChange, MdCheckboxModule} from './checkbox'; +import {MdCheckbox, MdCheckboxChange, MdCheckboxModule} from './index'; import {ViewportRuler} from '../core/overlay/position/viewport-ruler'; import {FakeViewportRuler} from '../core/overlay/position/fake-viewport-ruler'; import {dispatchFakeEvent} from '../core/testing/dispatch-events'; +import {FocusOriginMonitor, FocusOrigin} from '../core'; +import {RIPPLE_FADE_IN_DURATION, RIPPLE_FADE_OUT_DURATION} from '../core/ripple/ripple-renderer'; +import {Subject} from 'rxjs/Subject'; describe('MdCheckbox', () => { let fixture: ComponentFixture; + let fakeFocusOriginMonitorSubject: Subject = new Subject(); + let fakeFocusOriginMonitor = { + monitor: () => fakeFocusOriginMonitorSubject.asObservable(), + unmonitor: () => {}, + focusVia: (element: HTMLElement, renderer: any, focusOrigin: FocusOrigin) => { + element.focus(); + fakeFocusOriginMonitorSubject.next(focusOrigin); + } + }; beforeEach(async(() => { TestBed.configureTestingModule({ @@ -27,6 +46,7 @@ describe('MdCheckbox', () => { ], providers: [ {provide: ViewportRuler, useClass: FakeViewportRuler}, + {provide: FocusOriginMonitor, useValue: fakeFocusOriginMonitor} ] }); @@ -314,6 +334,30 @@ describe('MdCheckbox', () => { expect(document.activeElement).toBe(inputElement); }); + it('should forward the value to input element', () => { + testComponent.checkboxValue = 'basic_checkbox'; + fixture.detectChanges(); + + expect(inputElement.value).toBe('basic_checkbox'); + }); + + it('should show a ripple when focused by a keyboard action', fakeAsync(() => { + expect(fixture.nativeElement.querySelectorAll('.mat-ripple-element').length) + .toBe(0, 'Expected no ripples on load.'); + + fakeFocusOriginMonitorSubject.next('keyboard'); + tick(RIPPLE_FADE_IN_DURATION); + + expect(fixture.nativeElement.querySelectorAll('.mat-ripple-element').length) + .toBe(1, 'Expected ripple after element is focused.'); + + dispatchFakeEvent(checkboxInstance._inputElement.nativeElement, 'blur'); + tick(RIPPLE_FADE_OUT_DURATION); + + expect(fixture.nativeElement.querySelectorAll('.mat-ripple-element').length) + .toBe(0, 'Expected no ripple after element is blurred.'); + })); + describe('ripple elements', () => { it('should show ripples on label mousedown', () => { @@ -349,7 +393,6 @@ describe('MdCheckbox', () => { expect(checkboxNativeElement.querySelectorAll('[md-ripple]').length) .toBe(1, 'Expect [md-ripple] in checkbox'); })); - }); describe('color behaviour', () => { @@ -384,11 +427,11 @@ describe('MdCheckbox', () => { describe('state transition css classes', () => { it('should transition unchecked -> checked -> unchecked', () => { - testComponent.isChecked = true; + inputElement.click(); fixture.detectChanges(); expect(checkboxNativeElement.classList).toContain('mat-checkbox-anim-unchecked-checked'); - testComponent.isChecked = false; + inputElement.click(); fixture.detectChanges(); expect(checkboxNativeElement.classList) .not.toContain('mat-checkbox-anim-unchecked-checked'); @@ -694,6 +737,7 @@ describe('MdCheckbox', () => { [disabled]="isDisabled" [color]="checkboxColor" [disableRipple]="disableRipple" + [value]="checkboxValue" (change)="changeCount = changeCount + 1" (click)="onCheckboxClick($event)" (change)="onCheckboxChange($event)"> @@ -713,6 +757,7 @@ class SingleCheckbox { lastKeydownEvent: Event = null; changeCount: number = 0; checkboxColor: string = 'primary'; + checkboxValue: string = 'single_checkbox'; onCheckboxClick(event: Event) {} onCheckboxChange(event: MdCheckboxChange) {} diff --git a/src/lib/checkbox/checkbox.ts b/src/lib/checkbox/checkbox.ts index 14e7d642be5e..dcbc59074de5 100644 --- a/src/lib/checkbox/checkbox.ts +++ b/src/lib/checkbox/checkbox.ts @@ -1,22 +1,26 @@ import { - ChangeDetectorRef, - ChangeDetectionStrategy, - Component, - ElementRef, - EventEmitter, - Input, - Output, - Renderer, - ViewEncapsulation, - forwardRef, - NgModule, - ModuleWithProviders, - ViewChild, + ChangeDetectorRef, + ChangeDetectionStrategy, + Component, + ElementRef, + EventEmitter, + Input, + Output, + Renderer, + ViewEncapsulation, + forwardRef, + ViewChild, + AfterViewInit, + OnDestroy, } from '@angular/core'; -import {CommonModule} from '@angular/common'; import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; import {coerceBooleanProperty} from '../core/coercion/boolean-property'; -import {MdRippleModule, CompatibilityModule} from '../core'; +import {Subscription} from 'rxjs/Subscription'; +import { + MdRipple, + RippleRef, + FocusOriginMonitor, +} from '../core'; /** Monotonically increasing integer used to auto-generate unique ids for checkbox components. */ @@ -73,13 +77,12 @@ export class MdCheckboxChange { '[class.mat-checkbox-checked]': 'checked', '[class.mat-checkbox-disabled]': 'disabled', '[class.mat-checkbox-label-before]': 'labelPosition == "before"', - '[class.mat-checkbox-focused]': '_hasFocus', }, providers: [MD_CHECKBOX_CONTROL_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush }) -export class MdCheckbox implements ControlValueAccessor { +export class MdCheckbox implements ControlValueAccessor, AfterViewInit, OnDestroy { /** * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will * take precedence so this may be omitted. @@ -151,9 +154,14 @@ export class MdCheckbox implements ControlValueAccessor { /** Event emitted when the checkbox's `indeterminate` value changes. */ @Output() indeterminateChange: EventEmitter = new EventEmitter(); + /** The value attribute of the native input element */ + @Input() value: string ; + /** The native ` element */ @ViewChild('input') _inputElement: ElementRef; + @ViewChild(MdRipple) _ripple: MdRipple; + /** * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor. * @docs-private @@ -172,14 +180,38 @@ export class MdCheckbox implements ControlValueAccessor { private _controlValueAccessorChangeFn: (value: any) => void = (value) => {}; - _hasFocus: boolean = false; + /** Reference to the focused state ripple. */ + private _focusedRipple: RippleRef; + + /** Reference to the focus origin monitor subscription. */ + private _focusedSubscription: Subscription; constructor(private _renderer: Renderer, private _elementRef: ElementRef, - private _changeDetectorRef: ChangeDetectorRef) { + private _changeDetectorRef: ChangeDetectorRef, + private _focusOriginMonitor: FocusOriginMonitor) { this.color = 'accent'; } + ngAfterViewInit() { + this._focusedSubscription = this._focusOriginMonitor + .monitor(this._inputElement.nativeElement, this._renderer, false) + .subscribe(focusOrigin => { + if (!this._focusedRipple && focusOrigin === 'keyboard') { + this._focusedRipple = this._ripple.launch(0, 0, { persistent: true, centered: true }); + } + }); + } + + ngOnDestroy() { + this._focusOriginMonitor.unmonitor(this._inputElement.nativeElement); + + if (this._focusedSubscription) { + this._focusedSubscription.unsubscribe(); + this._focusedSubscription = null; + } + } + /** * Whether the checkbox is checked. Note that setting `checked` will immediately set * `indeterminate` to false. @@ -195,8 +227,6 @@ export class MdCheckbox implements ControlValueAccessor { this.indeterminateChange.emit(this._indeterminate); } this._checked = checked; - this._transitionCheckState( - this._checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked); this._changeDetectorRef.markForCheck(); } } @@ -217,13 +247,14 @@ export class MdCheckbox implements ControlValueAccessor { set indeterminate(indeterminate: boolean) { let changed = indeterminate != this._indeterminate; this._indeterminate = indeterminate; - if (this._indeterminate) { - this._transitionCheckState(TransitionCheckState.Indeterminate); - } else { - this._transitionCheckState( - this.checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked); - } + if (changed) { + if (this._indeterminate) { + this._transitionCheckState(TransitionCheckState.Indeterminate); + } else { + this._transitionCheckState( + this.checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked); + } this.indeterminateChange.emit(this._indeterminate); } } @@ -313,14 +344,9 @@ export class MdCheckbox implements ControlValueAccessor { this.change.emit(event); } - /** Informs the component when the input has focus so that we can style accordingly */ - _onInputFocus() { - this._hasFocus = true; - } - /** Informs the component when we lose focus in order to style accordingly */ _onInputBlur() { - this._hasFocus = false; + this._removeFocusedRipple(); this.onTouched(); } @@ -346,8 +372,12 @@ export class MdCheckbox implements ControlValueAccessor { // Preventing bubbling for the second event will solve that issue. event.stopPropagation(); + this._removeFocusedRipple(); + if (!this.disabled) { this.toggle(); + this._transitionCheckState( + this._checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked); // Emit our custom change event if the native input emitted one. // It is important to only emit it, if the native input triggered one, because @@ -358,8 +388,7 @@ export class MdCheckbox implements ControlValueAccessor { /** Focuses the checkbox. */ focus(): void { - this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus'); - this._onInputFocus(); + this._focusOriginMonitor.focusVia(this._inputElement.nativeElement, this._renderer, 'keyboard'); } _onInteractionEvent(event: Event) { @@ -379,6 +408,8 @@ export class MdCheckbox implements ControlValueAccessor { // [checked] bound to it. if (newState === TransitionCheckState.Checked) { animSuffix = 'unchecked-checked'; + } else if (newState == TransitionCheckState.Indeterminate) { + animSuffix = 'unchecked-indeterminate'; } else { return ''; } @@ -399,20 +430,11 @@ export class MdCheckbox implements ControlValueAccessor { return `mat-checkbox-anim-${animSuffix}`; } -} - - -@NgModule({ - imports: [CommonModule, MdRippleModule, CompatibilityModule], - exports: [MdCheckbox, CompatibilityModule], - declarations: [MdCheckbox], -}) -export class MdCheckboxModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdCheckboxModule, - providers: [] - }; + /** Fades out the focused state ripple. */ + private _removeFocusedRipple(): void { + if (this._focusedRipple) { + this._focusedRipple.fadeOut(); + this._focusedRipple = null; + } } } diff --git a/src/lib/checkbox/index.ts b/src/lib/checkbox/index.ts index 8d78b3e23f25..f468d3a5560c 100644 --- a/src/lib/checkbox/index.ts +++ b/src/lib/checkbox/index.ts @@ -1 +1,24 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {MdRippleModule, CompatibilityModule, FocusOriginMonitor} from '../core'; +import {MdCheckbox} from './checkbox'; + + +@NgModule({ + imports: [CommonModule, MdRippleModule, CompatibilityModule], + exports: [MdCheckbox, CompatibilityModule], + declarations: [MdCheckbox], + providers: [FocusOriginMonitor] +}) +export class MdCheckboxModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdCheckboxModule, + providers: [] + }; + } +} + + export * from './checkbox'; diff --git a/src/lib/chips/chip-list.ts b/src/lib/chips/chip-list.ts index af563c4660c6..7c4a396cf84c 100644 --- a/src/lib/chips/chip-list.ts +++ b/src/lib/chips/chip-list.ts @@ -5,8 +5,6 @@ import { ContentChildren, ElementRef, Input, - ModuleWithProviders, - NgModule, QueryList, ViewEncapsulation } from '@angular/core'; @@ -208,18 +206,3 @@ export class MdChipList implements AfterContentInit { } } - -@NgModule({ - imports: [], - exports: [MdChipList, MdChip], - declarations: [MdChipList, MdChip] -}) -export class MdChipsModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdChipsModule, - providers: [] - }; - } -} diff --git a/src/lib/chips/index.ts b/src/lib/chips/index.ts index 938151ce2bea..6b6d4e4e3192 100644 --- a/src/lib/chips/index.ts +++ b/src/lib/chips/index.ts @@ -1,2 +1,23 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {MdChipList} from './chip-list'; +import {MdChip} from './chip'; + + +@NgModule({ + imports: [], + exports: [MdChipList, MdChip], + declarations: [MdChipList, MdChip] +}) +export class MdChipsModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdChipsModule, + providers: [] + }; + } +} + + export * from './chip-list'; export * from './chip'; diff --git a/src/lib/core/a11y/focus-trap.spec.ts b/src/lib/core/a11y/focus-trap.spec.ts index 136137f8af84..49900604f4ff 100644 --- a/src/lib/core/a11y/focus-trap.spec.ts +++ b/src/lib/core/a11y/focus-trap.spec.ts @@ -7,24 +7,30 @@ import {Platform} from '../platform/platform'; describe('FocusTrap', () => { - describe('with default element', () => { - - let fixture: ComponentFixture; - let focusTrapInstance: FocusTrap; - let platform: Platform = new Platform(); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + FocusTrapDirective, + FocusTrapWithBindings, + SimpleFocusTrap, + FocusTrapTargets, + FocusTrapWithSvg + ], + providers: [InteractivityChecker, Platform, FocusTrapFactory] + }); - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [FocusTrapDirective, FocusTrapTestApp], - providers: [InteractivityChecker, Platform, FocusTrapFactory] - }); + TestBed.compileComponents(); + })); - TestBed.compileComponents(); + describe('with default element', () => { + let fixture: ComponentFixture; + let focusTrapInstance: FocusTrap; - fixture = TestBed.createComponent(FocusTrapTestApp); + beforeEach(() => { + fixture = TestBed.createComponent(SimpleFocusTrap); fixture.detectChanges(); focusTrapInstance = fixture.componentInstance.focusTrapDirective.focusTrap; - })); + }); it('wrap focus from end to start', () => { // Because we can't mimic a real tab press focus change in a unit test, just call the @@ -41,12 +47,28 @@ describe('FocusTrap', () => { focusTrapInstance.focusLastTabbableElement(); // In iOS button elements are never tabbable, so the last element will be the input. - let lastElement = platform.IOS ? 'input' : 'button'; + let lastElement = new Platform().IOS ? 'input' : 'button'; expect(document.activeElement.nodeName.toLowerCase()) .toBe(lastElement, `Expected ${lastElement} element to be focused`); }); + it('should be enabled by default', () => { + expect(focusTrapInstance.enabled).toBe(true); + }); + + }); + + describe('with bindings', () => { + let fixture: ComponentFixture; + let focusTrapInstance: FocusTrap; + + beforeEach(() => { + fixture = TestBed.createComponent(FocusTrapWithBindings); + fixture.detectChanges(); + focusTrapInstance = fixture.componentInstance.focusTrapDirective.focusTrap; + }); + it('should clean up its anchor sibling elements on destroy', () => { const rootElement = fixture.debugElement.nativeElement as HTMLElement; @@ -73,21 +95,14 @@ describe('FocusTrap', () => { }); describe('with focus targets', () => { - let fixture: ComponentFixture; + let fixture: ComponentFixture; let focusTrapInstance: FocusTrap; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [FocusTrapDirective, FocusTrapTargetTestApp], - providers: [InteractivityChecker, Platform, FocusTrapFactory] - }); - - TestBed.compileComponents(); - - fixture = TestBed.createComponent(FocusTrapTargetTestApp); + beforeEach(() => { + fixture = TestBed.createComponent(FocusTrapTargets); fixture.detectChanges(); focusTrapInstance = fixture.componentInstance.focusTrapDirective.focusTrap; - })); + }); it('should be able to prioritize the first focus target', () => { // Because we can't mimic a real tab press focus change in a unit test, just call the @@ -103,9 +118,36 @@ describe('FocusTrap', () => { expect(document.activeElement.id).toBe('last'); }); }); + + describe('special cases', () => { + it('should not throw when it has a SVG child', () => { + let fixture = TestBed.createComponent(FocusTrapWithSvg); + + fixture.detectChanges(); + + let focusTrapInstance = fixture.componentInstance.focusTrapDirective.focusTrap; + + expect(() => focusTrapInstance.focusFirstTabbableElement()).not.toThrow(); + expect(() => focusTrapInstance.focusLastTabbableElement()).not.toThrow(); + }); + }); + }); +@Component({ + template: ` +
+ + +
+ ` +}) +class SimpleFocusTrap { + @ViewChild(FocusTrapDirective) focusTrapDirective: FocusTrapDirective; +} + + @Component({ template: `
@@ -114,7 +156,7 @@ describe('FocusTrap', () => {
` }) -class FocusTrapTestApp { +class FocusTrapWithBindings { @ViewChild(FocusTrapDirective) focusTrapDirective: FocusTrapDirective; renderFocusTrap = true; isFocusTrapEnabled = true; @@ -131,6 +173,20 @@ class FocusTrapTestApp { ` }) -class FocusTrapTargetTestApp { +class FocusTrapTargets { + @ViewChild(FocusTrapDirective) focusTrapDirective: FocusTrapDirective; +} + + +@Component({ + template: ` +
+ + + +
+ ` +}) +class FocusTrapWithSvg { @ViewChild(FocusTrapDirective) focusTrapDirective: FocusTrapDirective; } diff --git a/src/lib/core/a11y/focus-trap.ts b/src/lib/core/a11y/focus-trap.ts index f8289d42b75a..cd4fb72780d4 100644 --- a/src/lib/core/a11y/focus-trap.ts +++ b/src/lib/core/a11y/focus-trap.ts @@ -72,13 +72,11 @@ export class FocusTrap { } this._ngZone.runOutsideAngular(() => { - this._element - .insertAdjacentElement('beforebegin', this._startAnchor) - .addEventListener('focus', () => this.focusLastTabbableElement()); + this._startAnchor.addEventListener('focus', () => this.focusLastTabbableElement()); + this._endAnchor.addEventListener('focus', () => this.focusFirstTabbableElement()); - this._element - .insertAdjacentElement('afterend', this._endAnchor) - .addEventListener('focus', () => this.focusFirstTabbableElement()); + this._element.parentNode.insertBefore(this._startAnchor, this._element); + this._element.parentNode.insertBefore(this._endAnchor, this._element.nextSibling); }); } @@ -130,10 +128,15 @@ export class FocusTrap { return root; } - // Iterate in DOM order. - let childCount = root.children.length; - for (let i = 0; i < childCount; i++) { - let tabbableChild = this._getFirstTabbableElement(root.children[i] as HTMLElement); + // Iterate in DOM order. Note that IE doesn't have `children` for SVG so we fall + // back to `childNodes` which includes text nodes, comments etc. + let children = root.children || root.childNodes; + + for (let i = 0; i < children.length; i++) { + let tabbableChild = children[i].nodeType === Node.ELEMENT_NODE ? + this._getFirstTabbableElement(children[i] as HTMLElement) : + null; + if (tabbableChild) { return tabbableChild; } @@ -149,8 +152,13 @@ export class FocusTrap { } // Iterate in reverse DOM order. - for (let i = root.children.length - 1; i >= 0; i--) { - let tabbableChild = this._getLastTabbableElement(root.children[i] as HTMLElement); + let children = root.children || root.childNodes; + + for (let i = children.length - 1; i >= 0; i--) { + let tabbableChild = children[i].nodeType === Node.ELEMENT_NODE ? + this._getLastTabbableElement(children[i] as HTMLElement) : + null; + if (tabbableChild) { return tabbableChild; } @@ -222,7 +230,7 @@ export class FocusTrapDirective implements OnDestroy, AfterContentInit { /** Whether the focus trap is active. */ @Input('cdkTrapFocus') get enabled(): boolean { return this.focusTrap.enabled; } - set enabled(val: boolean) { this.focusTrap.enabled = val; } + set enabled(value: boolean) { this.focusTrap.enabled = coerceBooleanProperty(value); } constructor(private _elementRef: ElementRef, private _focusTrapFactory: FocusTrapFactory) { this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true); diff --git a/src/lib/core/a11y/list-key-manager.spec.ts b/src/lib/core/a11y/list-key-manager.spec.ts index 2f6bd8657f8e..4a64bac10cd1 100644 --- a/src/lib/core/a11y/list-key-manager.spec.ts +++ b/src/lib/core/a11y/list-key-manager.spec.ts @@ -240,6 +240,16 @@ describe('Key managers', () => { expect(TAB_EVENT.defaultPrevented).toBe(false); }); + it('should activate the first item when pressing down on a clean key manager', () => { + keyManager = new ListKeyManager(itemList); + + expect(keyManager.activeItemIndex).toBeNull('Expected active index to default to null.'); + + keyManager.onKeydown(DOWN_ARROW_EVENT); + + expect(keyManager.activeItemIndex).toBe(0, 'Expected first item to become active.'); + }); + }); describe('programmatic focus', () => { diff --git a/src/lib/core/a11y/list-key-manager.ts b/src/lib/core/a11y/list-key-manager.ts index 308e10a67dca..d54bf1a1521d 100644 --- a/src/lib/core/a11y/list-key-manager.ts +++ b/src/lib/core/a11y/list-key-manager.ts @@ -16,7 +16,7 @@ export interface CanDisable { * of items, it will set the active item correctly when arrow events occur. */ export class ListKeyManager { - private _activeItemIndex: number; + private _activeItemIndex: number = null; private _activeItem: T; private _tabOut: Subject = new Subject(); private _wrap: boolean = false; diff --git a/src/lib/core/compatibility/compatibility.spec.ts b/src/lib/core/compatibility/compatibility.spec.ts index 4e9e754fac81..479ee3b13bf0 100644 --- a/src/lib/core/compatibility/compatibility.spec.ts +++ b/src/lib/core/compatibility/compatibility.spec.ts @@ -1,6 +1,6 @@ import {Component, NgModule} from '@angular/core'; import {async, TestBed} from '@angular/core/testing'; -import {MdCheckboxModule} from '../../checkbox/checkbox'; +import {MdCheckboxModule} from '../../checkbox/index'; import { NoConflictStyleCompatibilityMode, MAT_ELEMENTS_SELECTOR, diff --git a/src/lib/core/platform/index.ts b/src/lib/core/platform/index.ts index edb7dae39703..0009bf35f80f 100644 --- a/src/lib/core/platform/index.ts +++ b/src/lib/core/platform/index.ts @@ -1,9 +1,6 @@ import {NgModule, ModuleWithProviders} from '@angular/core'; import {Platform} from './platform'; -export * from './platform'; -export * from './features'; - @NgModule({ providers: [Platform] @@ -17,3 +14,7 @@ export class PlatformModule { }; } } + + +export * from './platform'; +export * from './features'; diff --git a/src/lib/core/ripple/index.ts b/src/lib/core/ripple/index.ts index 9625c70743c9..aab611db0302 100644 --- a/src/lib/core/ripple/index.ts +++ b/src/lib/core/ripple/index.ts @@ -4,8 +4,8 @@ import {CompatibilityModule} from '../compatibility/compatibility'; import {VIEWPORT_RULER_PROVIDER} from '../overlay/position/viewport-ruler'; import {SCROLL_DISPATCHER_PROVIDER} from '../overlay/scroll/scroll-dispatcher'; -export {MdRipple} from './ripple'; -export {RippleRef} from './ripple-ref'; +export {MdRipple, MD_DISABLE_RIPPLES} from './ripple'; +export {RippleRef, RippleState} from './ripple-ref'; export {RippleConfig} from './ripple-renderer'; @NgModule({ diff --git a/src/lib/core/ripple/ripple-ref.ts b/src/lib/core/ripple/ripple-ref.ts index 78a293802be1..91dbc430c4ad 100644 --- a/src/lib/core/ripple/ripple-ref.ts +++ b/src/lib/core/ripple/ripple-ref.ts @@ -1,10 +1,18 @@ import {RippleConfig, RippleRenderer} from './ripple-renderer'; +/** Possible states for a ripple element. */ +export enum RippleState { + FADING_IN, VISIBLE, FADING_OUT, HIDDEN +} + /** * Reference to a previously launched ripple element. */ export class RippleRef { + /** Current state of the ripple reference. */ + state: RippleState = RippleState.HIDDEN; + constructor( private _renderer: RippleRenderer, public element: HTMLElement, diff --git a/src/lib/core/ripple/ripple-renderer.ts b/src/lib/core/ripple/ripple-renderer.ts index 6b31dbd2473d..f4e15d869213 100644 --- a/src/lib/core/ripple/ripple-renderer.ts +++ b/src/lib/core/ripple/ripple-renderer.ts @@ -1,6 +1,6 @@ import {ElementRef, NgZone} from '@angular/core'; import {ViewportRuler} from '../overlay/position/viewport-ruler'; -import {RippleRef} from './ripple-ref'; +import {RippleRef, RippleState} from './ripple-ref'; /** Fade-in duration for the ripples. Can be modified with the speedFactor option. */ export const RIPPLE_FADE_IN_DURATION = 450; @@ -101,12 +101,17 @@ export class RippleRenderer { // Exposed reference to the ripple that will be returned. let rippleRef = new RippleRef(this, ripple, config); + rippleRef.state = RippleState.FADING_IN; + + // Add the ripple reference to the list of all active ripples. + this._activeRipples.add(rippleRef); + // Wait for the ripple element to be completely faded in. // Once it's faded in, the ripple can be hidden immediately if the mouse is released. this.runTimeoutOutsideZone(() => { - if (config.persistent || this._isMousedown) { - this._activeRipples.add(rippleRef); - } else { + rippleRef.state = RippleState.VISIBLE; + + if (!config.persistent && !this._isMousedown) { rippleRef.fadeOut(); } }, duration); @@ -115,16 +120,22 @@ export class RippleRenderer { } /** Fades out a ripple reference. */ - fadeOutRipple(ripple: RippleRef) { - let rippleEl = ripple.element; + fadeOutRipple(rippleRef: RippleRef) { + // For ripples that are not active anymore, don't re-un the fade-out animation. + if (!this._activeRipples.delete(rippleRef)) { + return; + } - this._activeRipples.delete(ripple); + let rippleEl = rippleRef.element; rippleEl.style.transitionDuration = `${RIPPLE_FADE_OUT_DURATION}ms`; rippleEl.style.opacity = '0'; + rippleRef.state = RippleState.FADING_OUT; + // Once the ripple faded out, the ripple can be safely removed from the DOM. this.runTimeoutOutsideZone(() => { + rippleRef.state = RippleState.HIDDEN; rippleEl.parentNode.removeChild(rippleEl); }, RIPPLE_FADE_OUT_DURATION); } @@ -163,9 +174,9 @@ export class RippleRenderer { private onMouseup() { this._isMousedown = false; - // On mouseup, fade-out all ripples that are active and not persistent. + // Fade-out all ripples that are completely visible and not persistent. this._activeRipples.forEach(ripple => { - if (!ripple.config.persistent) { + if (!ripple.config.persistent && ripple.state === RippleState.VISIBLE) { ripple.fadeOut(); } }); diff --git a/src/lib/core/ripple/ripple.spec.ts b/src/lib/core/ripple/ripple.spec.ts index 71531a9abbff..330da08fea53 100644 --- a/src/lib/core/ripple/ripple.spec.ts +++ b/src/lib/core/ripple/ripple.spec.ts @@ -1,6 +1,6 @@ import {TestBed, ComponentFixture, fakeAsync, tick, inject} from '@angular/core/testing'; import {Component, ViewChild} from '@angular/core'; -import {MdRipple, MdRippleModule} from './index'; +import {MdRipple, MdRippleModule, MD_DISABLE_RIPPLES, RippleState} from './index'; import {ViewportRuler} from '../overlay/position/viewport-ruler'; import {RIPPLE_FADE_OUT_DURATION, RIPPLE_FADE_IN_DURATION} from './ripple-renderer'; import {dispatchMouseEvent} from '../testing/dispatch-events'; @@ -18,7 +18,7 @@ describe('MdRipple', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [MdRippleModule.forRoot()], + imports: [MdRippleModule], declarations: [ BasicRippleContainer, RippleContainerWithInputBindings, @@ -77,6 +77,39 @@ describe('MdRipple', () => { expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); })); + it('should remove ripples after mouseup', fakeAsync(() => { + dispatchMouseEvent(rippleTarget, 'mousedown'); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + // Fakes the duration of fading-in and fading-out normal ripples. + // The fade-out duration has been added to ensure that didn't start fading out. + tick(RIPPLE_FADE_IN_DURATION + RIPPLE_FADE_OUT_DURATION); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + dispatchMouseEvent(rippleTarget, 'mouseup'); + tick(RIPPLE_FADE_OUT_DURATION); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + })); + + it('should not hide ripples while animating.', fakeAsync(() => { + // Calculates the duration for fading-in and fading-out the ripple. + let hideDuration = RIPPLE_FADE_IN_DURATION + RIPPLE_FADE_OUT_DURATION; + + dispatchMouseEvent(rippleTarget, 'mousedown'); + dispatchMouseEvent(rippleTarget, 'mouseup'); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + tick(hideDuration - 10); + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + tick(10); + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + })); + it('creates ripples when manually triggered', () => { expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); @@ -270,6 +303,91 @@ describe('MdRipple', () => { expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); })); + it('should remove ripples that are not done fading-in', fakeAsync(() => { + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + + rippleDirective.launch(0, 0); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + tick(RIPPLE_FADE_IN_DURATION / 2); + + rippleDirective.fadeOutAll(); + + tick(RIPPLE_FADE_OUT_DURATION); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length) + .toBe(0, 'Expected no ripples to be active after calling fadeOutAll.'); + })); + + it('should properly set ripple states', fakeAsync(() => { + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + + let rippleRef = rippleDirective.launch(0, 0, { persistent: true }); + + expect(rippleRef.state).toBe(RippleState.FADING_IN); + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + tick(RIPPLE_FADE_IN_DURATION); + + expect(rippleRef.state).toBe(RippleState.VISIBLE); + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + rippleRef.fadeOut(); + + expect(rippleRef.state).toBe(RippleState.FADING_OUT); + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + + tick(RIPPLE_FADE_OUT_DURATION); + + expect(rippleRef.state).toBe(RippleState.HIDDEN); + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + })); + + }); + + describe('with ripples disabled', () => { + let rippleDirective: MdRipple; + + beforeEach(() => { + // Reset the previously configured testing module to be able to disable ripples globally. + // The testing module has been initialized in the root describe group for the ripples. + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + imports: [MdRippleModule], + declarations: [BasicRippleContainer], + providers: [{ provide: MD_DISABLE_RIPPLES, useValue: true }] + }); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicRippleContainer); + fixture.detectChanges(); + + rippleTarget = fixture.nativeElement.querySelector('[mat-ripple]'); + rippleDirective = fixture.componentInstance.ripple; + }); + + it('should not show any ripples on mousedown', () => { + dispatchMouseEvent(rippleTarget, 'mousedown'); + dispatchMouseEvent(rippleTarget, 'mouseup'); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + + dispatchMouseEvent(rippleTarget, 'mousedown'); + dispatchMouseEvent(rippleTarget, 'mouseup'); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + }); + + it('should still allow manual ripples', () => { + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0); + + rippleDirective.launch(0, 0); + + expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1); + }); + }); describe('configuring behavior', () => { diff --git a/src/lib/core/ripple/ripple.ts b/src/lib/core/ripple/ripple.ts index 5218e7e75e94..844cf20144b7 100644 --- a/src/lib/core/ripple/ripple.ts +++ b/src/lib/core/ripple/ripple.ts @@ -2,15 +2,20 @@ import { Directive, ElementRef, Input, + Inject, NgZone, OnChanges, SimpleChanges, OnDestroy, + OpaqueToken, + Optional, } from '@angular/core'; import {RippleConfig, RippleRenderer} from './ripple-renderer'; import {ViewportRuler} from '../overlay/position/viewport-ruler'; import {RippleRef} from './ripple-ref'; +/** OpaqueToken that can be used to globally disable all ripples. Except programmatic ones. */ +export const MD_DISABLE_RIPPLES = new OpaqueToken('md-disable-ripples'); @Directive({ selector: '[md-ripple], [mat-ripple]', @@ -65,7 +70,9 @@ export class MdRipple implements OnChanges, OnDestroy { /** Renderer for the ripple DOM manipulations. */ private _rippleRenderer: RippleRenderer; - constructor(elementRef: ElementRef, ngZone: NgZone, ruler: ViewportRuler) { + constructor(elementRef: ElementRef, ngZone: NgZone, ruler: ViewportRuler, + @Optional() @Inject(MD_DISABLE_RIPPLES) private _forceDisableRipples: boolean) { + this._rippleRenderer = new RippleRenderer(elementRef, ngZone, ruler); } @@ -74,7 +81,7 @@ export class MdRipple implements OnChanges, OnDestroy { this._rippleRenderer.setTriggerElement(this.trigger); } - this._rippleRenderer.rippleDisabled = this.disabled; + this._rippleRenderer.rippleDisabled = this._forceDisableRipples || this.disabled; this._rippleRenderer.rippleConfig = this.rippleConfig; } diff --git a/src/lib/core/selection/index.ts b/src/lib/core/selection/index.ts index 4ebd17960d72..5a6f826091fd 100644 --- a/src/lib/core/selection/index.ts +++ b/src/lib/core/selection/index.ts @@ -1,10 +1,12 @@ import {NgModule} from '@angular/core'; import {MdPseudoCheckbox} from './pseudo-checkbox/pseudo-checkbox'; -export * from './pseudo-checkbox/pseudo-checkbox'; @NgModule({ exports: [MdPseudoCheckbox], declarations: [MdPseudoCheckbox] }) export class MdSelectionModule { } + + +export * from './pseudo-checkbox/pseudo-checkbox'; diff --git a/src/lib/core/style/focus-origin-monitor.ts b/src/lib/core/style/focus-origin-monitor.ts index bbb61f284700..42d83bb012cd 100644 --- a/src/lib/core/style/focus-origin-monitor.ts +++ b/src/lib/core/style/focus-origin-monitor.ts @@ -102,12 +102,15 @@ export class FocusOriginMonitor { * @param element The element to stop monitoring. */ unmonitor(element: Element): void { - if (!this._elementInfo.has(element)) { - return; + let elementInfo = this._elementInfo.get(element); + + if (elementInfo) { + elementInfo.unlisten(); + elementInfo.subject.complete(); + + this._setClasses(element, null); + this._elementInfo.delete(element); } - this._elementInfo.get(element).unlisten(); - this._setClasses(element, null); - this._elementInfo.delete(element); } /** diff --git a/src/lib/core/style/index.ts b/src/lib/core/style/index.ts index b5f487f54223..a61a25dbb43a 100644 --- a/src/lib/core/style/index.ts +++ b/src/lib/core/style/index.ts @@ -1,9 +1,6 @@ import {NgModule} from '@angular/core'; import {CdkMonitorFocus, FOCUS_ORIGIN_MONITOR_PROVIDER} from './focus-origin-monitor'; -export * from './focus-origin-monitor'; -export * from './apply-transform'; - @NgModule({ declarations: [CdkMonitorFocus], @@ -11,3 +8,7 @@ export * from './apply-transform'; providers: [FOCUS_ORIGIN_MONITOR_PROVIDER], }) export class StyleModule {} + + +export * from './focus-origin-monitor'; +export * from './apply-transform'; diff --git a/src/lib/core/theming/_palette.scss b/src/lib/core/theming/_palette.scss index e30ce6d2a9ad..ffba34784659 100644 --- a/src/lib/core/theming/_palette.scss +++ b/src/lib/core/theming/_palette.scss @@ -656,6 +656,9 @@ $mat-light-theme-background: ( disabled-button: $black-12-opacity, raised-button: white, focused-button: $black-6-opacity, + selected-button: map_get($mat-grey, 300), + selected-disabled-button: map_get($mat-grey, 400), + disabled-button-toggle: map_get($mat-grey, 200), ); // Background palette for dark themes. @@ -669,6 +672,9 @@ $mat-dark-theme-background: ( disabled-button: $white-12-opacity, raised-button: map-get($mat-grey, 800), focused-button: $white-6-opacity, + selected-button: map_get($mat-grey, 900), + selected-disabled-button: map_get($mat-grey, 800), + disabled-button-toggle: map_get($mat-grey, 1000), ); // Foreground palette for light themes. diff --git a/src/lib/dialog/dialog.md b/src/lib/dialog/dialog.md index 3b858bf38e39..622f4b724294 100644 --- a/src/lib/dialog/dialog.md +++ b/src/lib/dialog/dialog.md @@ -17,7 +17,7 @@ The `MdDialogRef` provides a handle on the opened dialog. It can be used to clos receive notification when the dialog has been closed. ```ts -dialogRef.afterClosed.subscribe(result => { +dialogRef.afterClosed().subscribe(result => { console.log(`Dialog result: ${result}`); // Pizza! }); @@ -76,4 +76,4 @@ that the AOT compiler knows to create the `ComponentFactory` for it. bootstrap: [AppComponent] }) export class AppModule() {} -``` \ No newline at end of file +``` diff --git a/src/lib/grid-list/grid-list.spec.ts b/src/lib/grid-list/grid-list.spec.ts index 8683f55d8c85..5cc78dacb03b 100644 --- a/src/lib/grid-list/grid-list.spec.ts +++ b/src/lib/grid-list/grid-list.spec.ts @@ -1,7 +1,7 @@ import {async, TestBed} from '@angular/core/testing'; import {Component, DebugElement} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdGridList, MdGridListModule} from './grid-list'; +import {MdGridList, MdGridListModule} from './index'; import {MdGridTile, MdGridTileText} from './grid-tile'; diff --git a/src/lib/grid-list/grid-list.ts b/src/lib/grid-list/grid-list.ts index 92064ed024f4..8da4a76bceae 100644 --- a/src/lib/grid-list/grid-list.ts +++ b/src/lib/grid-list/grid-list.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, Component, ViewEncapsulation, AfterContentChecked, @@ -12,14 +10,11 @@ import { ElementRef, Optional, } from '@angular/core'; -import { - MdGridTile, MdGridTileText, MdGridTileFooterCssMatStyler, - MdGridTileHeaderCssMatStyler, MdGridAvatarCssMatStyler -} from './grid-tile'; +import {MdGridTile} from './grid-tile'; import {TileCoordinator} from './tile-coordinator'; import {TileStyler, FitTileStyler, RatioTileStyler, FixedTileStyler} from './tile-styler'; import {MdGridListColsError} from './grid-list-errors'; -import {Dir, MdLineModule, CompatibilityModule} from '../core'; +import {Dir} from '../core'; import { coerceToString, coerceToNumber, @@ -145,34 +140,3 @@ export class MdGridList implements OnInit, AfterContentChecked { } } } - - -@NgModule({ - imports: [MdLineModule, CompatibilityModule], - exports: [ - MdGridList, - MdGridTile, - MdGridTileText, - MdLineModule, - CompatibilityModule, - MdGridTileHeaderCssMatStyler, - MdGridTileFooterCssMatStyler, - MdGridAvatarCssMatStyler - ], - declarations: [ - MdGridList, - MdGridTile, - MdGridTileText, - MdGridTileHeaderCssMatStyler, - MdGridTileFooterCssMatStyler, - MdGridAvatarCssMatStyler], -}) -export class MdGridListModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdGridListModule, - providers: [] - }; - } -} diff --git a/src/lib/grid-list/index.ts b/src/lib/grid-list/index.ts index 981d0024533e..5206d2f7134c 100644 --- a/src/lib/grid-list/index.ts +++ b/src/lib/grid-list/index.ts @@ -1 +1,42 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {MdLineModule, CompatibilityModule} from '../core'; +import { + MdGridTile, MdGridTileText, MdGridTileFooterCssMatStyler, + MdGridTileHeaderCssMatStyler, MdGridAvatarCssMatStyler +} from './grid-tile'; +import {MdGridList} from './grid-list'; + + +@NgModule({ + imports: [MdLineModule, CompatibilityModule], + exports: [ + MdGridList, + MdGridTile, + MdGridTileText, + MdLineModule, + CompatibilityModule, + MdGridTileHeaderCssMatStyler, + MdGridTileFooterCssMatStyler, + MdGridAvatarCssMatStyler + ], + declarations: [ + MdGridList, + MdGridTile, + MdGridTileText, + MdGridTileHeaderCssMatStyler, + MdGridTileFooterCssMatStyler, + MdGridAvatarCssMatStyler + ], +}) +export class MdGridListModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdGridListModule, + providers: [] + }; + } +} + + export * from './grid-list'; diff --git a/src/lib/icon/icon.spec.ts b/src/lib/icon/icon.spec.ts index 156cd20408fc..ec94136d117f 100644 --- a/src/lib/icon/icon.spec.ts +++ b/src/lib/icon/icon.spec.ts @@ -3,7 +3,7 @@ import {SafeResourceUrl, DomSanitizer} from '@angular/platform-browser'; import {XHRBackend} from '@angular/http'; import {MockBackend} from '@angular/http/testing'; import {Component} from '@angular/core'; -import {MdIconModule} from './icon'; +import {MdIconModule} from './index'; import {MdIconRegistry} from './icon-registry'; import {getFakeSvgHttpResponse} from './fake-svgs'; diff --git a/src/lib/icon/icon.ts b/src/lib/icon/icon.ts index d5922050f5a7..d9e0e038ca6d 100644 --- a/src/lib/icon/icon.ts +++ b/src/lib/icon/icon.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, ChangeDetectionStrategy, Component, ElementRef, @@ -14,11 +12,10 @@ import { Optional, SkipSelf, } from '@angular/core'; -import {HttpModule, Http} from '@angular/http'; +import {Http} from '@angular/http'; import {DomSanitizer} from '@angular/platform-browser'; -import {MdError, CompatibilityModule} from '../core'; +import {MdError} from '../core'; import {MdIconRegistry, MdIconNameNotFoundError} from './icon-registry'; -export {MdIconRegistry} from './icon-registry'; /** Exception thrown when an invalid icon name is passed to an md-icon component. */ export class MdIconInvalidNameError extends MdError { @@ -261,19 +258,3 @@ export const ICON_REGISTRY_PROVIDER = { deps: [[new Optional(), new SkipSelf(), MdIconRegistry], Http, DomSanitizer], useFactory: ICON_REGISTRY_PROVIDER_FACTORY, }; - -@NgModule({ - imports: [HttpModule, CompatibilityModule], - exports: [MdIcon, CompatibilityModule], - declarations: [MdIcon], - providers: [ICON_REGISTRY_PROVIDER], -}) -export class MdIconModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdIconModule, - providers: [], - }; - } -} diff --git a/src/lib/icon/index.ts b/src/lib/icon/index.ts index af77d84efccf..c2b2f7bcba31 100644 --- a/src/lib/icon/index.ts +++ b/src/lib/icon/index.ts @@ -1 +1,25 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {HttpModule} from '@angular/http'; +import {CompatibilityModule} from '../core'; +import {MdIcon, ICON_REGISTRY_PROVIDER} from './icon'; + + +@NgModule({ + imports: [HttpModule, CompatibilityModule], + exports: [MdIcon, CompatibilityModule], + declarations: [MdIcon], + providers: [ICON_REGISTRY_PROVIDER], +}) +export class MdIconModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdIconModule, + providers: [], + }; + } +} + + export * from './icon'; +export {MdIconRegistry} from './icon-registry'; diff --git a/src/lib/input/index.ts b/src/lib/input/index.ts index db45cf0dde0e..d0a7d8a6532f 100644 --- a/src/lib/input/index.ts +++ b/src/lib/input/index.ts @@ -6,11 +6,6 @@ import {FormsModule} from '@angular/forms'; import {PlatformModule} from '../core/platform/index'; -export * from './autosize' -export * from './input-container'; -export * from './input-container-errors'; - - @NgModule({ declarations: [ MdPlaceholder, @@ -41,3 +36,9 @@ export class MdInputModule { }; } } + + +export * from './autosize' +export * from './input-container'; +export * from './input-container-errors'; + diff --git a/src/lib/input/input-container.scss b/src/lib/input/input-container.scss index 4f8fc4f17659..134a05e9df1f 100644 --- a/src/lib/input/input-container.scss +++ b/src/lib/input/input-container.scss @@ -234,8 +234,16 @@ $mat-input-underline-disabled-background-image: } } -// Prevents the prefix and suffix from stretching together with the container. .mat-input-prefix, .mat-input-suffix { + // Prevents the prefix and suffix from stretching together with the container. width: 0.1px; white-space: nowrap; + + // Allow icons in a prefix/suffix to adapt to the correct size. + & .mat-icon { + width: auto; + height: auto; + font-size: 100%; + vertical-align: top; + } } diff --git a/src/lib/list/index.ts b/src/lib/list/index.ts index 71825137f468..78100824d63f 100644 --- a/src/lib/list/index.ts +++ b/src/lib/list/index.ts @@ -1 +1,54 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {MdLineModule, CompatibilityModule} from '../core'; +import { + MdList, + MdListItem, + MdListDivider, + MdListAvatarCssMatStyler, + MdListIconCssMatStyler, + MdListCssMatStyler, + MdNavListCssMatStyler, + MdDividerCssMatStyler, + MdListSubheaderCssMatStyler, +} from './list'; + + +@NgModule({ + imports: [MdLineModule, CompatibilityModule], + exports: [ + MdList, + MdListItem, + MdListDivider, + MdListAvatarCssMatStyler, + MdLineModule, + CompatibilityModule, + MdListIconCssMatStyler, + MdListCssMatStyler, + MdNavListCssMatStyler, + MdDividerCssMatStyler, + MdListSubheaderCssMatStyler + ], + declarations: [ + MdList, + MdListItem, + MdListDivider, + MdListAvatarCssMatStyler, + MdListIconCssMatStyler, + MdListCssMatStyler, + MdNavListCssMatStyler, + MdDividerCssMatStyler, + MdListSubheaderCssMatStyler + ], +}) +export class MdListModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdListModule, + providers: [] + }; + } +} + + export * from './list'; diff --git a/src/lib/list/list.spec.ts b/src/lib/list/list.spec.ts index c4f1c43c6331..db1937370472 100644 --- a/src/lib/list/list.spec.ts +++ b/src/lib/list/list.spec.ts @@ -1,7 +1,7 @@ import {async, TestBed} from '@angular/core/testing'; import {Component} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdListItem, MdListModule} from './list'; +import {MdListItem, MdListModule} from './index'; describe('MdList', () => { diff --git a/src/lib/list/list.ts b/src/lib/list/list.ts index a6a675065367..7a2c2c6929d5 100644 --- a/src/lib/list/list.ts +++ b/src/lib/list/list.ts @@ -1,17 +1,15 @@ import { - Component, - ViewEncapsulation, - ContentChildren, - ContentChild, - QueryList, - Directive, - ElementRef, - Renderer, - AfterContentInit, - NgModule, - ModuleWithProviders, + Component, + ViewEncapsulation, + ContentChildren, + ContentChild, + QueryList, + Directive, + ElementRef, + Renderer, + AfterContentInit, } from '@angular/core'; -import {MdLine, MdLineSetter, MdLineModule, CompatibilityModule} from '../core'; +import {MdLine, MdLineSetter} from '../core'; @Directive({ selector: 'md-divider, mat-divider' @@ -130,41 +128,3 @@ export class MdListItem implements AfterContentInit { this._hasFocus = false; } } - - -@NgModule({ - imports: [MdLineModule, CompatibilityModule], - exports: [ - MdList, - MdListItem, - MdListDivider, - MdListAvatarCssMatStyler, - MdLineModule, - CompatibilityModule, - MdListIconCssMatStyler, - MdListCssMatStyler, - MdNavListCssMatStyler, - MdDividerCssMatStyler, - MdListSubheaderCssMatStyler - ], - declarations: [ - MdList, - MdListItem, - MdListDivider, - MdListAvatarCssMatStyler, - MdListIconCssMatStyler, - MdListCssMatStyler, - MdNavListCssMatStyler, - MdDividerCssMatStyler, - MdListSubheaderCssMatStyler - ], -}) -export class MdListModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdListModule, - providers: [] - }; - } -} diff --git a/src/lib/menu/index.ts b/src/lib/menu/index.ts index e85efa8bca0a..87b541aca49e 100644 --- a/src/lib/menu/index.ts +++ b/src/lib/menu/index.ts @@ -1,3 +1,28 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {OverlayModule, CompatibilityModule} from '../core'; +import {MdMenu} from './menu-directive'; +import {MdMenuItem} from './menu-item'; +import {MdMenuTrigger} from './menu-trigger'; +import {MdRippleModule} from '../core/ripple/index'; + + +@NgModule({ + imports: [OverlayModule, CommonModule, MdRippleModule, CompatibilityModule], + exports: [MdMenu, MdMenuItem, MdMenuTrigger, CompatibilityModule], + declarations: [MdMenu, MdMenuItem, MdMenuTrigger], +}) +export class MdMenuModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdMenuModule, + providers: [], + }; + } +} + + export * from './menu'; export {MdMenuTrigger} from './menu-trigger'; export {fadeInItems, transformMenu} from './menu-animations'; diff --git a/src/lib/menu/menu-item.ts b/src/lib/menu/menu-item.ts index bb6f14811bcc..76d00955ce67 100644 --- a/src/lib/menu/menu-item.ts +++ b/src/lib/menu/menu-item.ts @@ -1,5 +1,6 @@ -import {Component, ElementRef, Input, HostBinding, Renderer} from '@angular/core'; +import {Component, ElementRef, Input, Renderer} from '@angular/core'; import {Focusable} from '../core/a11y/focus-key-manager'; +import {coerceBooleanProperty} from '../core/coercion/boolean-property'; /** * This directive is intended to be used inside an md-menu tag. @@ -11,40 +12,49 @@ import {Focusable} from '../core/a11y/focus-key-manager'; host: { 'role': 'menuitem', '[class.mat-menu-item]': 'true', + '[attr.tabindex]': '_getTabIndex()', + '[attr.aria-disabled]': 'disabled.toString()', + '[attr.disabled]': '_getDisabledAttr()', '(click)': '_checkDisabled($event)', - '[attr.tabindex]': '_tabindex' }, templateUrl: 'menu-item.html', exportAs: 'mdMenuItem' }) export class MdMenuItem implements Focusable { - _disabled: boolean; + /** Whether the menu item is disabled */ + private _disabled: boolean = false; constructor(private _renderer: Renderer, private _elementRef: ElementRef) {} + /** Focuses the menu item. */ focus(): void { - this._renderer.invokeElementMethod(this._elementRef.nativeElement, 'focus'); + this._renderer.invokeElementMethod(this._getHostElement(), 'focus'); } - // this is necessary to support anchors /** Whether the menu item is disabled. */ - @HostBinding('attr.disabled') @Input() - get disabled(): boolean { return this._disabled; } - set disabled(value: boolean) { - this._disabled = (value === false || value === undefined) ? null : true; + get disabled() { return this._disabled; } + set disabled(value: any) { + this._disabled = coerceBooleanProperty(value); } - /** Sets the aria-disabled property on the menu item. */ - @HostBinding('attr.aria-disabled') - get isAriaDisabled(): string { return String(!!this.disabled); } - get _tabindex() { return this.disabled ? '-1' : '0'; } + /** Used to set the `tabindex`. */ + _getTabIndex(): string { + return this._disabled ? '-1' : '0'; + } + + /** Used to set the HTML `disabled` attribute. Necessary for links to be disabled properly. */ + _getDisabledAttr(): boolean { + return this._disabled ? true : null; + } + /** Returns the host DOM element. */ _getHostElement(): HTMLElement { return this._elementRef.nativeElement; } - _checkDisabled(event: Event) { + /** Prevents the default element actions if it is disabled. */ + _checkDisabled(event: Event): void { if (this.disabled) { event.preventDefault(); event.stopPropagation(); diff --git a/src/lib/menu/menu.spec.ts b/src/lib/menu/menu.spec.ts index fbf23d4bed85..1ccdbc698d3a 100644 --- a/src/lib/menu/menu.spec.ts +++ b/src/lib/menu/menu.spec.ts @@ -15,7 +15,7 @@ import { MdMenuPanel, MenuPositionX, MenuPositionY -} from './menu'; +} from './index'; import {OverlayContainer} from '../core/overlay/overlay-container'; import {ViewportRuler} from '../core/overlay/position/viewport-ruler'; import {Dir, LayoutDirection} from '../core/rtl/dir'; diff --git a/src/lib/menu/menu.ts b/src/lib/menu/menu.ts index 262ca5e7623e..d5041a9068f7 100644 --- a/src/lib/menu/menu.ts +++ b/src/lib/menu/menu.ts @@ -1,28 +1,5 @@ -import {NgModule, ModuleWithProviders} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {OverlayModule, CompatibilityModule} from '../core'; -import {MdMenu} from './menu-directive'; -import {MdMenuItem} from './menu-item'; -import {MdMenuTrigger} from './menu-trigger'; -import {MdRippleModule} from '../core/ripple/index'; export {MdMenu} from './menu-directive'; export {MdMenuItem} from './menu-item'; export {MdMenuTrigger} from './menu-trigger'; export {MdMenuPanel} from './menu-panel'; export {MenuPositionX, MenuPositionY} from './menu-positions'; - - -@NgModule({ - imports: [OverlayModule, CommonModule, MdRippleModule, CompatibilityModule], - exports: [MdMenu, MdMenuItem, MdMenuTrigger, CompatibilityModule], - declarations: [MdMenu, MdMenuItem, MdMenuTrigger], -}) -export class MdMenuModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdMenuModule, - providers: [], - }; - } -} diff --git a/src/lib/progress-bar/index.ts b/src/lib/progress-bar/index.ts index d71d9b1bf740..89730762bd34 100644 --- a/src/lib/progress-bar/index.ts +++ b/src/lib/progress-bar/index.ts @@ -1 +1,23 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {CompatibilityModule} from '../core/compatibility/compatibility'; +import {MdProgressBar} from './progress-bar'; + + +@NgModule({ + imports: [CommonModule, CompatibilityModule], + exports: [MdProgressBar, CompatibilityModule], + declarations: [MdProgressBar], +}) +export class MdProgressBarModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdProgressBarModule, + providers: [] + }; + } +} + + export * from './progress-bar'; diff --git a/src/lib/progress-bar/progress-bar.spec.ts b/src/lib/progress-bar/progress-bar.spec.ts index 264977087de9..d071e0fee566 100644 --- a/src/lib/progress-bar/progress-bar.spec.ts +++ b/src/lib/progress-bar/progress-bar.spec.ts @@ -1,7 +1,7 @@ import {TestBed, async, ComponentFixture} from '@angular/core/testing'; import {Component} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdProgressBarModule} from './progress-bar'; +import {MdProgressBarModule} from './index'; describe('MdProgressBar', () => { diff --git a/src/lib/progress-bar/progress-bar.ts b/src/lib/progress-bar/progress-bar.ts index 38d67f0c2975..a5dc0184b1e9 100644 --- a/src/lib/progress-bar/progress-bar.ts +++ b/src/lib/progress-bar/progress-bar.ts @@ -1,13 +1,9 @@ import { - NgModule, - ModuleWithProviders, - Component, - ChangeDetectionStrategy, - HostBinding, - Input, + Component, + ChangeDetectionStrategy, + HostBinding, + Input, } from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {CompatibilityModule} from '../core/compatibility/compatibility'; // TODO(josephperrott): Benchpress tests. // TODO(josephperrott): Add ARIA attributes for progressbar "for". @@ -84,19 +80,3 @@ export class MdProgressBar { function clamp(v: number, min = 0, max = 100) { return Math.max(min, Math.min(max, v)); } - - -@NgModule({ - imports: [CommonModule, CompatibilityModule], - exports: [MdProgressBar, CompatibilityModule], - declarations: [MdProgressBar], -}) -export class MdProgressBarModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdProgressBarModule, - providers: [] - }; - } -} diff --git a/src/lib/progress-spinner/index.ts b/src/lib/progress-spinner/index.ts index 03eb3d7fcc76..113dc6f84d66 100644 --- a/src/lib/progress-spinner/index.ts +++ b/src/lib/progress-spinner/index.ts @@ -1,2 +1,42 @@ -export * from './progress-circle'; +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CompatibilityModule} from '../core'; +import { + MdProgressSpinner, + MdSpinner, + MdProgressSpinnerCssMatStyler, + MdProgressCircleCssMatStyler +} from './progress-spinner'; + + +@NgModule({ + imports: [CompatibilityModule], + exports: [ + MdProgressSpinner, + MdSpinner, + CompatibilityModule, + MdProgressSpinnerCssMatStyler, + MdProgressCircleCssMatStyler + ], + declarations: [ + MdProgressSpinner, + MdSpinner, + MdProgressSpinnerCssMatStyler, + MdProgressCircleCssMatStyler + ], +}) +class MdProgressSpinnerModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdProgressSpinnerModule, + providers: [] + }; + } +} + +export {MdProgressSpinnerModule}; export * from './progress-spinner'; + +/** @deprecated */ +export {MdProgressSpinnerModule as MdProgressCircleModule}; +export {MdProgressSpinner as MdProgressCircle}; diff --git a/src/lib/progress-spinner/progress-circle.ts b/src/lib/progress-spinner/progress-circle.ts deleted file mode 100644 index 4b8d8bb0d906..000000000000 --- a/src/lib/progress-spinner/progress-circle.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** @deprecated */ -export {MdProgressSpinner as MdProgressCircle} from './progress-spinner'; -/** @deprecated */ -export {MdProgressSpinnerModule as MdProgressCircleModule} from './progress-spinner'; diff --git a/src/lib/progress-spinner/progress-spinner.spec.ts b/src/lib/progress-spinner/progress-spinner.spec.ts index 7153eebfb5fe..0db59707ec16 100644 --- a/src/lib/progress-spinner/progress-spinner.spec.ts +++ b/src/lib/progress-spinner/progress-spinner.spec.ts @@ -1,7 +1,7 @@ import {TestBed, async} from '@angular/core/testing'; import {Component} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdProgressSpinnerModule} from './progress-spinner'; +import {MdProgressSpinnerModule} from './index'; describe('MdProgressSpinner', () => { diff --git a/src/lib/progress-spinner/progress-spinner.ts b/src/lib/progress-spinner/progress-spinner.ts index 2ebdeb8d3c06..1f56143478f0 100644 --- a/src/lib/progress-spinner/progress-spinner.ts +++ b/src/lib/progress-spinner/progress-spinner.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, Component, HostBinding, ChangeDetectionStrategy, @@ -10,7 +8,6 @@ import { NgZone, Renderer, Directive } from '@angular/core'; -import {CompatibilityModule} from '../core'; // TODO(josephperrott): Benchpress tests. @@ -382,30 +379,3 @@ function getSvgArc(currentValue: number, rotation: number) { return `M${start}A${pathRadius},${pathRadius} 0 ${largeArcFlag},${arcSweep} ${end}`; } - - -@NgModule({ - imports: [CompatibilityModule], - exports: [ - MdProgressSpinner, - MdSpinner, - CompatibilityModule, - MdProgressSpinnerCssMatStyler, - MdProgressCircleCssMatStyler - ], - declarations: [ - MdProgressSpinner, - MdSpinner, - MdProgressSpinnerCssMatStyler, - MdProgressCircleCssMatStyler - ], -}) -export class MdProgressSpinnerModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdProgressSpinnerModule, - providers: [] - }; - } -} diff --git a/src/lib/radio/index.ts b/src/lib/radio/index.ts index 1140e08e216f..586a2734c855 100644 --- a/src/lib/radio/index.ts +++ b/src/lib/radio/index.ts @@ -1 +1,30 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler'; +import { + MdRippleModule, + CompatibilityModule, + UNIQUE_SELECTION_DISPATCHER_PROVIDER, + FocusOriginMonitor, +} from '../core'; +import {MdRadioGroup, MdRadioButton} from './radio'; + + +@NgModule({ + imports: [CommonModule, MdRippleModule, CompatibilityModule], + exports: [MdRadioGroup, MdRadioButton, CompatibilityModule], + providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, VIEWPORT_RULER_PROVIDER, FocusOriginMonitor], + declarations: [MdRadioGroup, MdRadioButton], +}) +export class MdRadioModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdRadioModule, + providers: [], + }; + } +} + + export * from './radio'; diff --git a/src/lib/radio/radio.html b/src/lib/radio/radio.html index d4293cbee92d..02423b631eec 100644 --- a/src/lib/radio/radio.html +++ b/src/lib/radio/radio.html @@ -18,7 +18,6 @@ [attr.aria-label]="ariaLabel" [attr.aria-labelledby]="ariaLabelledby" (change)="_onInputChange($event)" - (focus)="_onInputFocus()" (blur)="_onInputBlur()" (click)="_onInputClick($event)"> diff --git a/src/lib/radio/radio.spec.ts b/src/lib/radio/radio.spec.ts index 92d0ee86d414..238949c9488a 100644 --- a/src/lib/radio/radio.spec.ts +++ b/src/lib/radio/radio.spec.ts @@ -2,13 +2,25 @@ import {async, ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/t import {NgControl, FormsModule, ReactiveFormsModule, FormControl} from '@angular/forms'; import {Component, DebugElement} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdRadioGroup, MdRadioButton, MdRadioChange, MdRadioModule} from './radio'; +import {MdRadioGroup, MdRadioButton, MdRadioChange, MdRadioModule} from './index'; import {ViewportRuler} from '../core/overlay/position/viewport-ruler'; import {FakeViewportRuler} from '../core/overlay/position/fake-viewport-ruler'; import {dispatchFakeEvent} from '../core/testing/dispatch-events'; +import {FocusOriginMonitor, FocusOrigin} from '../core'; +import {RIPPLE_FADE_IN_DURATION, RIPPLE_FADE_OUT_DURATION} from '../core/ripple/ripple-renderer'; +import {Subject} from 'rxjs/Subject'; describe('MdRadio', () => { + let fakeFocusOriginMonitorStream = new Subject(); + let fakeFocusOriginMonitor = { + monitor: () => fakeFocusOriginMonitorStream.asObservable(), + unmonitor: () => {}, + focusVia: (element: HTMLElement, renderer: any, origin: FocusOrigin) => { + element.focus(); + fakeFocusOriginMonitorStream.next(origin); + } + }; beforeEach(async(() => { TestBed.configureTestingModule({ @@ -21,6 +33,7 @@ describe('MdRadio', () => { ], providers: [ {provide: ViewportRuler, useClass: FakeViewportRuler}, + {provide: FocusOriginMonitor, useValue: fakeFocusOriginMonitor} ] }); @@ -177,37 +190,22 @@ describe('MdRadio', () => { expect(changeSpy).toHaveBeenCalledTimes(1); }); - // TODO(jelbourn): test this in an e2e test with *real* focus, rather than faking - // a focus / blur event. - it('should focus individual radio buttons', () => { - let nativeRadioInput = radioNativeElements[0].querySelector('input'); - - expect(nativeRadioInput.classList).not.toContain('mat-radio-focused'); - - dispatchFakeEvent(nativeRadioInput, 'focus'); - fixture.detectChanges(); + it('should show a ripple when focusing via the keyboard', fakeAsync(() => { + expect(radioNativeElements[0].querySelectorAll('.mat-ripple-element').length) + .toBe(0, 'Expected no ripples on init.'); - expect(radioNativeElements[0].classList).toContain('mat-radio-focused'); + fakeFocusOriginMonitorStream.next('keyboard'); + tick(RIPPLE_FADE_IN_DURATION); - dispatchFakeEvent(nativeRadioInput, 'blur'); - fixture.detectChanges(); - - expect(radioNativeElements[0].classList).not.toContain('mat-radio-focused'); - }); + expect(radioNativeElements[0].querySelectorAll('.mat-ripple-element').length) + .toBe(1, 'Expected one ripple after keyboard focus.'); - it('should focus individual radio buttons', () => { - let nativeRadioInput = radioNativeElements[0].querySelector('input'); + dispatchFakeEvent(radioNativeElements[0].querySelector('input'), 'blur'); + tick(RIPPLE_FADE_OUT_DURATION); - radioInstances[0].focus(); - fixture.detectChanges(); - - expect(radioNativeElements[0].classList).toContain('mat-radio-focused'); - - dispatchFakeEvent(nativeRadioInput, 'blur'); - fixture.detectChanges(); - - expect(radioNativeElements[0].classList).not.toContain('mat-radio-focused'); - }); + expect(radioNativeElements[0].querySelectorAll('.mat-ripple-element').length) + .toBe(0, 'Expected no ripples on blur.'); + })); it('should update the group and radios when updating the group value', () => { expect(groupInstance.value).toBeFalsy(); diff --git a/src/lib/radio/radio.ts b/src/lib/radio/radio.ts index 4e0809eb0bf3..9bf104b21af1 100644 --- a/src/lib/radio/radio.ts +++ b/src/lib/radio/radio.ts @@ -6,7 +6,6 @@ import { ElementRef, Renderer, EventEmitter, - HostBinding, Input, OnInit, Optional, @@ -14,20 +13,19 @@ import { QueryList, ViewEncapsulation, forwardRef, - NgModule, - ModuleWithProviders, ViewChild, + OnDestroy, + AfterViewInit, } from '@angular/core'; -import {CommonModule} from '@angular/common'; import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; import { - MdRippleModule, + RippleRef, UniqueSelectionDispatcher, - CompatibilityModule, - UNIQUE_SELECTION_DISPATCHER_PROVIDER, + MdRipple, + FocusOriginMonitor, } from '../core'; import {coerceBooleanProperty} from '../core/coercion/boolean-property'; -import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler'; +import {Subscription} from 'rxjs/Subscription'; /** @@ -265,24 +263,21 @@ export class MdRadioGroup implements AfterContentInit, ControlValueAccessor { encapsulation: ViewEncapsulation.None, host: { '[class.mat-radio-button]': 'true', + '[class.mat-radio-checked]': 'checked', + '[class.mat-radio-disabled]': 'disabled', + '[attr.id]': 'id', } }) -export class MdRadioButton implements OnInit { - - @HostBinding('class.mat-radio-focused') - _isFocused: boolean; +export class MdRadioButton implements OnInit, AfterViewInit, OnDestroy { /** Whether this radio is checked. */ private _checked: boolean = false; /** The unique ID for the radio button. */ - @HostBinding('id') - @Input() - id: string = `md-radio-${_uniqueIdCounter++}`; + @Input() id: string = `md-radio-${_uniqueIdCounter++}`; /** Analog to HTML 'name' attribute used to group radios for unique selection. */ - @Input() - name: string; + @Input() name: string; /** Used to set the 'aria-label' attribute on the underlying input element. */ @Input('aria-label') ariaLabel: string; @@ -299,6 +294,15 @@ export class MdRadioButton implements OnInit { /** Whether the ripple effect on click should be disabled. */ private _disableRipple: boolean; + /** The child ripple instance. */ + @ViewChild(MdRipple) _ripple: MdRipple; + + /** Stream of focus event from the focus origin monitor. */ + private _focusOriginMonitorSubscription: Subscription; + + /** Reference to the current focus ripple. */ + private _focusedRippleRef: RippleRef; + /** The parent radio group. May or may not be present. */ radioGroup: MdRadioGroup; @@ -321,6 +325,7 @@ export class MdRadioButton implements OnInit { constructor(@Optional() radioGroup: MdRadioGroup, private _elementRef: ElementRef, private _renderer: Renderer, + private _focusOriginMonitor: FocusOriginMonitor, public radioDispatcher: UniqueSelectionDispatcher) { // Assertions. Ideally these should be stripped out by the compiler. // TODO(jelbourn): Assert that there's no name binding AND a parent radio group. @@ -340,7 +345,6 @@ export class MdRadioButton implements OnInit { } /** Whether this radio button is checked. */ - @HostBinding('class.mat-radio-checked') @Input() get checked(): boolean { return this._checked; @@ -415,7 +419,6 @@ export class MdRadioButton implements OnInit { } /** Whether the radio button is disabled. */ - @HostBinding('class.mat-radio-disabled') @Input() get disabled(): boolean { return this._disabled || (this.radioGroup != null && this.radioGroup.disabled); @@ -435,6 +438,25 @@ export class MdRadioButton implements OnInit { } } + ngAfterViewInit() { + this._focusOriginMonitorSubscription = this._focusOriginMonitor + .monitor(this._inputElement.nativeElement, this._renderer, false) + .subscribe(focusOrigin => { + if (focusOrigin === 'keyboard' && !this._focusedRippleRef) { + this._focusedRippleRef = this._ripple.launch(0, 0, { persistent: true, centered: true }); + } + }); + } + + ngOnDestroy() { + this._focusOriginMonitor.unmonitor(this._inputElement.nativeElement); + + if (this._focusOriginMonitorSubscription) { + this._focusOriginMonitorSubscription.unsubscribe(); + this._focusOriginMonitorSubscription = null; + } + } + /** Dispatch change event with current value. */ private _emitChangeEvent(): void { let event = new MdRadioChange(); @@ -447,23 +469,16 @@ export class MdRadioButton implements OnInit { return this.disableRipple || this.disabled; } - /** - * We use a hidden native input field to handle changes to focus state via keyboard navigation, - * with visual rendering done separately. The native element is kept in sync with the overall - * state of the component. - */ - _onInputFocus() { - this._isFocused = true; - } - /** Focuses the radio button. */ focus(): void { - this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus'); - this._onInputFocus(); + this._focusOriginMonitor.focusVia(this._inputElement.nativeElement, this._renderer, 'keyboard'); } _onInputBlur() { - this._isFocused = false; + if (this._focusedRippleRef) { + this._focusedRippleRef.fadeOut(); + this._focusedRippleRef = null; + } if (this.radioGroup) { this.radioGroup._touch(); @@ -503,21 +518,5 @@ export class MdRadioButton implements OnInit { } } } -} - -@NgModule({ - imports: [CommonModule, MdRippleModule, CompatibilityModule], - exports: [MdRadioGroup, MdRadioButton, CompatibilityModule], - providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, VIEWPORT_RULER_PROVIDER], - declarations: [MdRadioGroup, MdRadioButton], -}) -export class MdRadioModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdRadioModule, - providers: [], - }; - } } diff --git a/src/lib/select/index.ts b/src/lib/select/index.ts index 1a2e4afe6a88..c1e58f3ed157 100644 --- a/src/lib/select/index.ts +++ b/src/lib/select/index.ts @@ -6,8 +6,6 @@ import { CompatibilityModule, OverlayModule, } from '../core'; -export * from './select'; -export {fadeInContent, transformPanel, transformPlaceholder} from './select-animations'; @NgModule({ @@ -24,3 +22,7 @@ export class MdSelectModule { }; } } + + +export * from './select'; +export {fadeInContent, transformPanel, transformPlaceholder} from './select-animations'; diff --git a/src/lib/select/select.spec.ts b/src/lib/select/select.spec.ts index 63e1f8f848f6..868e5e3c71ba 100644 --- a/src/lib/select/select.spec.ts +++ b/src/lib/select/select.spec.ts @@ -39,7 +39,8 @@ describe('MdSelect', () => { FloatPlaceholderSelect, SelectWithErrorSibling, ThrowsErrorOnInit, - BasicSelectOnPush + BasicSelectOnPush, + BasicSelectOnPushPreselected ], providers: [ {provide: OverlayContainer, useFactory: () => { @@ -1322,16 +1323,25 @@ describe('MdSelect', () => { }); describe('with OnPush change detection', () => { - let fixture: ComponentFixture; - let trigger: HTMLElement; + it('should set the trigger text based on the value when initialized', async(() => { + let fixture = TestBed.createComponent(BasicSelectOnPushPreselected); - beforeEach(() => { - fixture = TestBed.createComponent(BasicSelectOnPush); fixture.detectChanges(); - trigger = fixture.debugElement.query(By.css('.mat-select-trigger')).nativeElement; - }); + + fixture.whenStable().then(() => { + let trigger = fixture.debugElement.query(By.css('.mat-select-trigger')).nativeElement; + + fixture.detectChanges(); + + expect(trigger.textContent).toContain('Pizza'); + }); + })); it('should update the trigger based on the value', () => { + let fixture = TestBed.createComponent(BasicSelectOnPush); + fixture.detectChanges(); + let trigger = fixture.debugElement.query(By.css('.mat-select-trigger')).nativeElement; + fixture.componentInstance.control.setValue('pizza-1'); fixture.detectChanges(); @@ -1342,7 +1352,9 @@ describe('MdSelect', () => { expect(trigger.textContent).not.toContain('Pizza'); }); + }); + }); @@ -1561,9 +1573,26 @@ class BasicSelectOnPush { { value: 'tacos-2', viewValue: 'Tacos' }, ]; control = new FormControl(); +} - @ViewChild(MdSelect) select: MdSelect; - @ViewChildren(MdOption) options: QueryList; +@Component({ + selector: 'basic-select-on-push-preselected', + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + + + {{ food.viewValue }} + + + ` +}) +class BasicSelectOnPushPreselected { + foods: any[] = [ + { value: 'steak-0', viewValue: 'Steak' }, + { value: 'pizza-1', viewValue: 'Pizza' }, + { value: 'tacos-2', viewValue: 'Tacos' }, + ]; + control = new FormControl('pizza-1'); } @Component({ diff --git a/src/lib/select/select.ts b/src/lib/select/select.ts index 1a92699e5437..ca7b390038ae 100644 --- a/src/lib/select/select.ts +++ b/src/lib/select/select.ts @@ -313,7 +313,6 @@ export class MdSelect implements AfterContentInit, ControlValueAccessor, OnDestr writeValue(value: any): void { if (this.options) { this._setSelectionByValue(value); - this._changeDetectorRef.markForCheck(); } } @@ -430,17 +429,9 @@ export class MdSelect implements AfterContentInit, ControlValueAccessor, OnDestr * found with the designated value, the select trigger is cleared. */ private _setSelectionByValue(value: any): void { - const options = this.options.toArray(); - - for (let i = 0; i < this.options.length; i++) { - if (options[i].value === value) { - options[i].select(); - return; - } - } - - // Clear selection if no item was selected. - this._clearSelection(); + const correspondingOption = this.options.find(option => option.value === value); + correspondingOption ? correspondingOption.select() : this._clearSelection(); + this._changeDetectorRef.markForCheck(); } /** Clears the select trigger and deselects every option in the list. */ diff --git a/src/lib/sidenav/index.ts b/src/lib/sidenav/index.ts index b126f2c842e3..cd2f2a879f1a 100644 --- a/src/lib/sidenav/index.ts +++ b/src/lib/sidenav/index.ts @@ -1 +1,25 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {CompatibilityModule} from '../core'; +import {A11yModule} from '../core/a11y/index'; +import {OverlayModule} from '../core/overlay/overlay-directives'; +import {MdSidenav, MdSidenavContainer} from './sidenav'; + + +@NgModule({ + imports: [CommonModule, CompatibilityModule, A11yModule, OverlayModule], + exports: [MdSidenavContainer, MdSidenav, CompatibilityModule], + declarations: [MdSidenavContainer, MdSidenav], +}) +export class MdSidenavModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdSidenavModule, + providers: [] + }; + } +} + + export * from './sidenav'; diff --git a/src/lib/sidenav/sidenav.spec.ts b/src/lib/sidenav/sidenav.spec.ts index 31a59669134e..073a3f5378b5 100644 --- a/src/lib/sidenav/sidenav.spec.ts +++ b/src/lib/sidenav/sidenav.spec.ts @@ -1,7 +1,7 @@ import {fakeAsync, async, tick, ComponentFixture, TestBed} from '@angular/core/testing'; import {Component} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {MdSidenav, MdSidenavModule, MdSidenavToggleResult} from './sidenav'; +import {MdSidenav, MdSidenavModule, MdSidenavToggleResult} from './index'; import {A11yModule} from '../core/a11y/index'; import {PlatformModule} from '../core/platform/index'; import {ESCAPE} from '../core/keyboard/keycodes'; diff --git a/src/lib/sidenav/sidenav.ts b/src/lib/sidenav/sidenav.ts index c81e797d9224..b86b0c156d82 100644 --- a/src/lib/sidenav/sidenav.ts +++ b/src/lib/sidenav/sidenav.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, AfterContentInit, Component, ContentChildren, @@ -16,12 +14,9 @@ import { NgZone, OnDestroy, } from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {Dir, MdError, coerceBooleanProperty, CompatibilityModule} from '../core'; -import {A11yModule} from '../core/a11y/index'; +import {Dir, MdError, coerceBooleanProperty} from '../core'; import {FocusTrapFactory, FocusTrap} from '../core/a11y/focus-trap'; import {ESCAPE} from '../core/keyboard/keycodes'; -import {OverlayModule} from '../core/overlay/overlay-directives'; import 'rxjs/add/operator/first'; @@ -507,19 +502,3 @@ export class MdSidenavContainer implements AfterContentInit { }; } } - - -@NgModule({ - imports: [CommonModule, CompatibilityModule, A11yModule, OverlayModule], - exports: [MdSidenavContainer, MdSidenav, CompatibilityModule], - declarations: [MdSidenavContainer, MdSidenav], -}) -export class MdSidenavModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdSidenavModule, - providers: [] - }; - } -} diff --git a/src/lib/slide-toggle/index.ts b/src/lib/slide-toggle/index.ts index e2f2f602f25c..2c7409e1c60d 100644 --- a/src/lib/slide-toggle/index.ts +++ b/src/lib/slide-toggle/index.ts @@ -1 +1,26 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; +import {GestureConfig, CompatibilityModule} from '../core'; +import {MdSlideToggle} from './slide-toggle'; +import {MdRippleModule} from '../core/ripple/index'; + + +@NgModule({ + imports: [FormsModule, MdRippleModule, CompatibilityModule], + exports: [MdSlideToggle, CompatibilityModule], + declarations: [MdSlideToggle], + providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}], +}) +export class MdSlideToggleModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdSlideToggleModule, + providers: [] + }; + } +} + + export * from './slide-toggle'; diff --git a/src/lib/slide-toggle/slide-toggle.spec.ts b/src/lib/slide-toggle/slide-toggle.spec.ts index 2d2441909dbf..92d851c950f5 100644 --- a/src/lib/slide-toggle/slide-toggle.spec.ts +++ b/src/lib/slide-toggle/slide-toggle.spec.ts @@ -1,8 +1,8 @@ -import {async, ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing'; -import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; import {Component} from '@angular/core'; -import {MdSlideToggle, MdSlideToggleChange, MdSlideToggleModule} from './slide-toggle'; +import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; +import {async, ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing'; import {FormsModule, NgControl, ReactiveFormsModule, FormControl} from '@angular/forms'; +import {MdSlideToggle, MdSlideToggleChange, MdSlideToggleModule} from './index'; import {TestGestureConfig} from '../slider/test-gesture-config'; import {dispatchFakeEvent} from '../core/testing/dispatch-events'; diff --git a/src/lib/slide-toggle/slide-toggle.ts b/src/lib/slide-toggle/slide-toggle.ts index 2cc0edde5064..ab4a5de00d66 100644 --- a/src/lib/slide-toggle/slide-toggle.ts +++ b/src/lib/slide-toggle/slide-toggle.ts @@ -8,22 +8,12 @@ import { Output, EventEmitter, AfterContentInit, - NgModule, - ModuleWithProviders, ViewChild, ViewEncapsulation, } from '@angular/core'; -import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; -import {FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms'; -import { - applyCssTransform, - coerceBooleanProperty, - GestureConfig, - HammerInput, - CompatibilityModule, -} from '../core'; +import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms'; +import {applyCssTransform, coerceBooleanProperty, HammerInput} from '../core'; import {Observable} from 'rxjs/Observable'; -import {MdRippleModule} from '../core/ripple/index'; export const MD_SLIDE_TOGGLE_VALUE_ACCESSOR: any = { @@ -352,20 +342,3 @@ class SlideToggleRenderer { } } - - -@NgModule({ - imports: [FormsModule, MdRippleModule, CompatibilityModule], - exports: [MdSlideToggle, CompatibilityModule], - declarations: [MdSlideToggle], - providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}], -}) -export class MdSlideToggleModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdSlideToggleModule, - providers: [] - }; - } -} diff --git a/src/lib/slider/index.ts b/src/lib/slider/index.ts index eb0742f8019b..a37d19c4c8cf 100644 --- a/src/lib/slider/index.ts +++ b/src/lib/slider/index.ts @@ -1 +1,26 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; +import {CommonModule} from '@angular/common'; +import {FormsModule} from '@angular/forms'; +import {GestureConfig, CompatibilityModule} from '../core'; +import {MdSlider} from './slider'; + + +@NgModule({ + imports: [CommonModule, FormsModule, CompatibilityModule], + exports: [MdSlider, CompatibilityModule], + declarations: [MdSlider], + providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}] +}) +export class MdSliderModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdSliderModule, + providers: [] + }; + } +} + + export * from './slider'; diff --git a/src/lib/slider/slider.spec.ts b/src/lib/slider/slider.spec.ts index e029442694db..35ce2babed86 100644 --- a/src/lib/slider/slider.spec.ts +++ b/src/lib/slider/slider.spec.ts @@ -2,7 +2,7 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {ReactiveFormsModule, FormControl, FormsModule} from '@angular/forms'; import {Component, DebugElement} from '@angular/core'; import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; -import {MdSlider, MdSliderModule} from './slider'; +import {MdSlider, MdSliderModule} from './index'; import {TestGestureConfig} from './test-gesture-config'; import {RtlModule} from '../core/rtl/dir'; import { diff --git a/src/lib/slider/slider.ts b/src/lib/slider/slider.ts index c6158f55c477..758a4ffd5ba1 100644 --- a/src/lib/slider/slider.ts +++ b/src/lib/slider/slider.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, Component, ElementRef, Input, @@ -10,17 +8,9 @@ import { EventEmitter, Optional } from '@angular/core'; -import {NG_VALUE_ACCESSOR, ControlValueAccessor, FormsModule} from '@angular/forms'; -import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; -import { - GestureConfig, - HammerInput, - coerceBooleanProperty, - coerceNumberProperty, - CompatibilityModule, -} from '../core'; +import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; +import {HammerInput, coerceBooleanProperty, coerceNumberProperty} from '../core'; import {Dir} from '../core/rtl/dir'; -import {CommonModule} from '@angular/common'; import { PAGE_UP, PAGE_DOWN, @@ -652,20 +642,3 @@ export class SliderRenderer { this._sliderElement.focus(); } } - - -@NgModule({ - imports: [CommonModule, FormsModule, CompatibilityModule], - exports: [MdSlider, CompatibilityModule], - declarations: [MdSlider], - providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}] -}) -export class MdSliderModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdSliderModule, - providers: [] - }; - } -} diff --git a/src/lib/snack-bar/index.ts b/src/lib/snack-bar/index.ts index 2425ecce98e9..99dfe54532c1 100644 --- a/src/lib/snack-bar/index.ts +++ b/src/lib/snack-bar/index.ts @@ -5,6 +5,7 @@ import {MdSnackBar} from './snack-bar'; import {MdSnackBarContainer} from './snack-bar-container'; import {SimpleSnackBar} from './simple-snack-bar'; + @NgModule({ imports: [OverlayModule, PortalModule, CommonModule, CompatibilityModule], exports: [MdSnackBarContainer, CompatibilityModule], @@ -22,6 +23,7 @@ export class MdSnackBarModule { } } + export * from './snack-bar'; export * from './snack-bar-container'; export * from './snack-bar-config'; diff --git a/src/lib/tabs/index.ts b/src/lib/tabs/index.ts index 47c6cb9c3587..51dcf3760728 100644 --- a/src/lib/tabs/index.ts +++ b/src/lib/tabs/index.ts @@ -1,3 +1,39 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {PortalModule} from '../core'; +import {MdRippleModule} from '../core/ripple/index'; +import {ObserveContentModule} from '../core/observe-content/observe-content'; +import {MdTab} from './tab'; +import {MdTabGroup} from './tab-group'; +import {MdTabLabel} from './tab-label'; +import {MdTabLabelWrapper} from './tab-label-wrapper'; +import {MdTabNavBar, MdTabLink, MdTabLinkRipple} from './tab-nav-bar/tab-nav-bar'; +import {MdInkBar} from './ink-bar'; +import {MdTabBody} from './tab-body'; +import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler'; +import {MdTabHeader} from './tab-header'; +import {SCROLL_DISPATCHER_PROVIDER} from '../core/overlay/scroll/scroll-dispatcher'; + + +@NgModule({ + imports: [CommonModule, PortalModule, MdRippleModule, ObserveContentModule], + // Don't export all components because some are only to be used internally. + exports: [MdTabGroup, MdTabLabel, MdTab, MdTabNavBar, MdTabLink, MdTabLinkRipple], + declarations: [MdTabGroup, MdTabLabel, MdTab, MdInkBar, MdTabLabelWrapper, + MdTabNavBar, MdTabLink, MdTabBody, MdTabLinkRipple, MdTabHeader], + providers: [VIEWPORT_RULER_PROVIDER, SCROLL_DISPATCHER_PROVIDER], +}) +export class MdTabsModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdTabsModule, + providers: [] + }; + } +} + + export * from './tab-group'; export {MdInkBar} from './ink-bar'; export {MdTabBody, MdTabBodyOriginState, MdTabBodyPositionState} from './tab-body'; diff --git a/src/lib/tabs/tab-body.spec.ts b/src/lib/tabs/tab-body.spec.ts index 4ff41baf642a..4d6840097c4a 100644 --- a/src/lib/tabs/tab-body.spec.ts +++ b/src/lib/tabs/tab-body.spec.ts @@ -169,7 +169,7 @@ describe('MdTabBody', () => { })); }); - it('it should toggle the canBeAnimated flag', () => { + it('should toggle the canBeAnimated flag', () => { let fixture: ComponentFixture; let tabBody: MdTabBody; diff --git a/src/lib/tabs/tab-group.spec.ts b/src/lib/tabs/tab-group.spec.ts index 661ed10d8e17..3ae944edcfc9 100644 --- a/src/lib/tabs/tab-group.spec.ts +++ b/src/lib/tabs/tab-group.spec.ts @@ -1,7 +1,7 @@ import { async, fakeAsync, tick, ComponentFixture, TestBed } from '@angular/core/testing'; -import {MdTabGroup, MdTabsModule, MdTabHeaderPosition} from './tab-group'; +import {MdTabGroup, MdTabsModule, MdTabHeaderPosition} from './index'; import {Component, ViewChild} from '@angular/core'; import {By} from '@angular/platform-browser'; import {Observable} from 'rxjs/Observable'; diff --git a/src/lib/tabs/tab-group.ts b/src/lib/tabs/tab-group.ts index 3b7b8d62d639..751767813409 100644 --- a/src/lib/tabs/tab-group.ts +++ b/src/lib/tabs/tab-group.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, ViewChild, Component, Input, @@ -11,24 +9,10 @@ import { ElementRef, Renderer } from '@angular/core'; -import {CommonModule} from '@angular/common'; -import { - PortalModule, - coerceBooleanProperty -} from '../core'; -import {MdTabLabel} from './tab-label'; -import {MdTabLabelWrapper} from './tab-label-wrapper'; -import {MdTabNavBar, MdTabLink, MdTabLinkRipple} from './tab-nav-bar/tab-nav-bar'; -import {MdInkBar} from './ink-bar'; +import {coerceBooleanProperty} from '../core'; import {Observable} from 'rxjs/Observable'; -import 'rxjs/add/operator/map'; -import {MdRippleModule} from '../core/ripple/index'; -import {ObserveContentModule} from '../core/observe-content/observe-content'; import {MdTab} from './tab'; -import {MdTabBody} from './tab-body'; -import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler'; -import {MdTabHeader} from './tab-header'; -import {SCROLL_DISPATCHER_PROVIDER} from '../core/overlay/scroll/scroll-dispatcher'; +import 'rxjs/add/operator/map'; /** Used to generate unique ID's for each tab component */ @@ -209,21 +193,3 @@ export class MdTabGroup { this._renderer.setElementStyle(this._tabBodyWrapper.nativeElement, 'height', ''); } } - -@NgModule({ - imports: [CommonModule, PortalModule, MdRippleModule, ObserveContentModule], - // Don't export all components because some are only to be used internally. - exports: [MdTabGroup, MdTabLabel, MdTab, MdTabNavBar, MdTabLink, MdTabLinkRipple], - declarations: [MdTabGroup, MdTabLabel, MdTab, MdInkBar, MdTabLabelWrapper, - MdTabNavBar, MdTabLink, MdTabBody, MdTabLinkRipple, MdTabHeader], - providers: [VIEWPORT_RULER_PROVIDER, SCROLL_DISPATCHER_PROVIDER], -}) -export class MdTabsModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdTabsModule, - providers: [] - }; - } -} diff --git a/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts b/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts index facdca13203a..54d98ad04de5 100644 --- a/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts +++ b/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts @@ -1,5 +1,5 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing'; -import {MdTabsModule} from '../tab-group'; +import {MdTabsModule} from '../index'; import {Component} from '@angular/core'; import {By} from '@angular/platform-browser'; import {ViewportRuler} from '../../core/overlay/position/viewport-ruler'; diff --git a/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts b/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts index 930f8a9a2f1e..5a0968b36f7f 100644 --- a/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts +++ b/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts @@ -5,11 +5,9 @@ import { ElementRef, ViewEncapsulation, Directive, - NgZone, } from '@angular/core'; import {MdInkBar} from '../ink-bar'; import {MdRipple} from '../../core/ripple/index'; -import {ViewportRuler} from '../../core/overlay/position/viewport-ruler'; /** * Navigation component matching the styles of the tab group header. @@ -81,9 +79,4 @@ export class MdTabLink { '[class.mat-tab-link]': 'true', }, }) -export class MdTabLinkRipple extends MdRipple { - constructor(elementRef: ElementRef, ngZone: NgZone, ruler: ViewportRuler) { - super(elementRef, ngZone, ruler); - } - -} +export class MdTabLinkRipple extends MdRipple {} diff --git a/src/lib/toolbar/index.ts b/src/lib/toolbar/index.ts index 316a52a324ed..ac40454a80ce 100644 --- a/src/lib/toolbar/index.ts +++ b/src/lib/toolbar/index.ts @@ -1 +1,22 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {CompatibilityModule} from '../core'; +import {MdToolbar, MdToolbarRow} from './toolbar'; + + +@NgModule({ + imports: [CompatibilityModule], + exports: [MdToolbar, MdToolbarRow, CompatibilityModule], + declarations: [MdToolbar, MdToolbarRow], +}) +export class MdToolbarModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdToolbarModule, + providers: [] + }; + } +} + + export * from './toolbar'; diff --git a/src/lib/toolbar/toolbar.spec.ts b/src/lib/toolbar/toolbar.spec.ts index bb142afdd8e7..b688ae430c57 100644 --- a/src/lib/toolbar/toolbar.spec.ts +++ b/src/lib/toolbar/toolbar.spec.ts @@ -1,7 +1,7 @@ import {Component} from '@angular/core'; import {TestBed, async, ComponentFixture} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; -import {MdToolbarModule} from './toolbar'; +import {MdToolbarModule} from './index'; describe('MdToolbar', () => { diff --git a/src/lib/toolbar/toolbar.ts b/src/lib/toolbar/toolbar.ts index 1b1212010b4d..49f6620437fb 100644 --- a/src/lib/toolbar/toolbar.ts +++ b/src/lib/toolbar/toolbar.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, Component, ChangeDetectionStrategy, Input, @@ -9,7 +7,6 @@ import { ElementRef, Renderer } from '@angular/core'; -import {CompatibilityModule} from '../core'; @Directive({ @@ -61,19 +58,3 @@ export class MdToolbar { } } - - -@NgModule({ - imports: [CompatibilityModule], - exports: [MdToolbar, MdToolbarRow, CompatibilityModule], - declarations: [MdToolbar, MdToolbarRow], -}) -export class MdToolbarModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdToolbarModule, - providers: [] - }; - } -} diff --git a/src/lib/tooltip/index.ts b/src/lib/tooltip/index.ts index ed8326d5e7c1..50d1e0df12dc 100644 --- a/src/lib/tooltip/index.ts +++ b/src/lib/tooltip/index.ts @@ -1 +1,24 @@ +import {NgModule, ModuleWithProviders} from '@angular/core'; +import {OverlayModule, CompatibilityModule} from '../core'; +import {PlatformModule} from '../core/platform/index'; +import {MdTooltip, TooltipComponent} from './tooltip'; + + +@NgModule({ + imports: [OverlayModule, CompatibilityModule, PlatformModule], + exports: [MdTooltip, TooltipComponent, CompatibilityModule], + declarations: [MdTooltip, TooltipComponent], + entryComponents: [TooltipComponent], +}) +export class MdTooltipModule { + /** @deprecated */ + static forRoot(): ModuleWithProviders { + return { + ngModule: MdTooltipModule, + providers: [] + }; + } +} + + export * from './tooltip'; diff --git a/src/lib/tooltip/tooltip.spec.ts b/src/lib/tooltip/tooltip.spec.ts index 81f4c0c9e816..f13af21eca89 100644 --- a/src/lib/tooltip/tooltip.spec.ts +++ b/src/lib/tooltip/tooltip.spec.ts @@ -14,7 +14,7 @@ import { ChangeDetectionStrategy } from '@angular/core'; import {By} from '@angular/platform-browser'; -import {TooltipPosition, MdTooltip, MdTooltipModule, SCROLL_THROTTLE_MS} from './tooltip'; +import {TooltipPosition, MdTooltip, MdTooltipModule, SCROLL_THROTTLE_MS} from './index'; import {OverlayContainer} from '../core'; import {Dir, LayoutDirection} from '../core/rtl/dir'; import {OverlayModule} from '../core/overlay/overlay-directives'; diff --git a/src/lib/tooltip/tooltip.ts b/src/lib/tooltip/tooltip.ts index fc621826beaf..65817c0aa6db 100644 --- a/src/lib/tooltip/tooltip.ts +++ b/src/lib/tooltip/tooltip.ts @@ -1,6 +1,4 @@ import { - NgModule, - ModuleWithProviders, Component, Directive, Input, @@ -22,18 +20,16 @@ import { import { Overlay, OverlayState, - OverlayModule, OverlayRef, ComponentPortal, OverlayConnectionPosition, OriginConnectionPosition, - CompatibilityModule } from '../core'; import {MdTooltipInvalidPositionError} from './tooltip-errors'; import {Observable} from 'rxjs/Observable'; import {Subject} from 'rxjs/Subject'; import {Dir} from '../core/rtl/dir'; -import {PlatformModule, Platform} from '../core/platform/index'; +import {Platform} from '../core/platform/index'; import 'rxjs/add/operator/first'; import {ScrollDispatcher} from '../core/overlay/scroll/scroll-dispatcher'; import {Subscription} from 'rxjs/Subscription'; @@ -445,20 +441,3 @@ export class TooltipComponent { } } } - - -@NgModule({ - imports: [OverlayModule, CompatibilityModule, PlatformModule], - exports: [MdTooltip, TooltipComponent, CompatibilityModule], - declarations: [MdTooltip, TooltipComponent], - entryComponents: [TooltipComponent], -}) -export class MdTooltipModule { - /** @deprecated */ - static forRoot(): ModuleWithProviders { - return { - ngModule: MdTooltipModule, - providers: [] - }; - } -} diff --git a/tools/gulp/tasks/docs.ts b/tools/gulp/tasks/docs.ts index 551ebcff984f..9007f9df2334 100644 --- a/tools/gulp/tasks/docs.ts +++ b/tools/gulp/tasks/docs.ts @@ -1,12 +1,14 @@ -import gulp = require('gulp'); +import {task, src, dest} from 'gulp'; +import {Dgeni} from 'dgeni'; +import * as path from 'path'; + +// Node packages that lack of types. const markdown = require('gulp-markdown'); const transform = require('gulp-transform'); const highlight = require('gulp-highlight-files'); const rename = require('gulp-rename'); const flatten = require('gulp-flatten'); const hljs = require('highlight.js'); -import {task} from 'gulp'; -import * as path from 'path'; // Our docs contain comments of the form `` which serve as placeholders where // example code should be inserted. We replace these comments with divs that have a @@ -19,10 +21,10 @@ const EXAMPLE_PATTERN = //g; // documentation page. Using a RegExp to rewrite links in HTML files to work in the docs. const LINK_PATTERN = /(]*) href="([^"]*)"/g; -gulp.task('docs', ['markdown-docs', 'highlight-docs', 'api-docs']) +task('docs', ['markdown-docs', 'highlight-docs', 'api-docs']); -gulp.task('markdown-docs', () => { - return gulp.src(['src/lib/**/*.md', 'guides/*.md']) +task('markdown-docs', () => { + return src(['src/lib/**/*.md', 'guides/*.md']) .pipe(markdown({ // Add syntax highlight using highlight.js highlight: (code: string, language: string) => { @@ -36,28 +38,27 @@ gulp.task('markdown-docs', () => { } })) .pipe(transform(transformMarkdownFiles)) - .pipe(gulp.dest('dist/docs/markdown')); + .pipe(dest('dist/docs/markdown')); }); -gulp.task('highlight-docs', () => { +task('highlight-docs', () => { // rename files to fit format: [filename]-[filetype].html const renameFile = (path: any) => { const extension = path.extname.slice(1); path.basename = `${path.basename}-${extension}`; }; - return gulp.src('src/examples/**/*.+(html|css|ts)') + return src('src/examples/**/*.+(html|css|ts)') .pipe(flatten()) .pipe(rename(renameFile)) .pipe(highlight()) - .pipe(gulp.dest('dist/docs/examples')); + .pipe(dest('dist/docs/examples')); }); task('api-docs', () => { - const Dgeni = require('dgeni'); const docsPackage = require(path.resolve(__dirname, '../../dgeni')); - const dgeni = new Dgeni([docsPackage]); - return dgeni.generate(); + const docs = new Dgeni([docsPackage]); + return docs.generate(); }); /** Updates the markdown file's content to work inside of the docs app. */ diff --git a/tools/gulp/tasks/e2e.ts b/tools/gulp/tasks/e2e.ts index ccc1d0f4901c..5b5a87f1ab4c 100644 --- a/tools/gulp/tasks/e2e.ts +++ b/tools/gulp/tasks/e2e.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import {SOURCE_ROOT, DIST_ROOT, PROJECT_ROOT} from '../constants'; import { - tsBuildTask, sassBuildTask, copyTask, buildAppTask, execNodeTask, + tsBuildTask, copyTask, buildAppTask, execNodeTask, vendorTask, sequenceTask, serverTask } from '../task_helpers'; diff --git a/tools/gulp/tasks/lint.ts b/tools/gulp/tasks/lint.ts index 971c417267e1..3de5960740f1 100644 --- a/tools/gulp/tasks/lint.ts +++ b/tools/gulp/tasks/lint.ts @@ -12,4 +12,4 @@ gulp.task('stylelint', execNodeTask( )); /** Task to run TSLint against the e2e/ and src/ directories. */ -gulp.task('tslint', execNodeTask('tslint', ['-c', 'tslint.json', 'src/**/*.ts', 'e2e/**/*.ts'])); +gulp.task('tslint', execNodeTask('tslint', ['-c', 'tslint.json', '+(src|e2e|tools)/**/*.ts'])); diff --git a/tools/gulp/tasks/screenshots.ts b/tools/gulp/tasks/screenshots.ts index 699a77b14fde..f9cfc0ab0b0d 100644 --- a/tools/gulp/tasks/screenshots.ts +++ b/tools/gulp/tasks/screenshots.ts @@ -5,7 +5,6 @@ import * as admin from 'firebase-admin'; import {openScreenshotsBucket, openFirebaseScreenshotsDatabase} from '../task_helpers'; import {updateGithubStatus} from '../util-functions'; -const request = require('request'); const imageDiff = require('image-diff'); const SCREENSHOT_DIR = './screenshots'; @@ -37,12 +36,15 @@ task('screenshots', () => { function updateFileResult(database: admin.database.Database, prNumber: string, filenameKey: string, result: boolean) { - return database.ref(FIREBASE_REPORT).child(prNumber).child('results').child(filenameKey).set(result); + return getPullRequestRef(database, prNumber).child('results').child(filenameKey).set(result); } -function updateResult(database: admin.database.Database, prNumber: string, - result: boolean) { - return database.ref(FIREBASE_REPORT).child(prNumber).child('result').set(result).then(() => result); +function updateResult(database: admin.database.Database, prNumber: string, result: boolean) { + return getPullRequestRef(database, prNumber).child('result').set(result).then(() => result); +} + +function getPullRequestRef(database: admin.database.Database, prNumber: string) { + return database.ref(FIREBASE_REPORT).child(prNumber); } function updateTravis(database: admin.database.Database, @@ -58,7 +60,7 @@ function updateTravis(database: admin.database.Database, function getScreenshotFiles(database: admin.database.Database) { let bucket = openScreenshotsBucket(); return bucket.getFiles({ prefix: 'golds/' }).then(function(data: any) { - return data[0].filter((file:any) => file.name.endsWith('.screenshot.png')); + return data[0].filter((file: any) => file.name.endsWith('.screenshot.png')); }); } diff --git a/tools/gulp/util-functions.ts b/tools/gulp/util-functions.ts index e78f9b94b07d..8acc5d4ca3b6 100644 --- a/tools/gulp/util-functions.ts +++ b/tools/gulp/util-functions.ts @@ -9,7 +9,7 @@ export function updateGithubStatus(result: boolean, prNumber: string) { let data = JSON.stringify({ state: state, target_url: `http://material2-screenshots.firebaseapp.com/${prNumber}`, - context: "screenshot-diff", + context: 'screenshot-diff', description: `Screenshot test ${state}` }); @@ -20,13 +20,13 @@ export function updateGithubStatus(result: boolean, prNumber: string) { 'Content-Length': Buffer.byteLength(data) }; - return new Promise((resolve, reject) => { + return new Promise((resolve) => { request({ url: `https://api.github.com/repos/angular/material2/statuses/${sha}`, method: 'POST', form: data, headers: headers - }, function (error: any, response: any, body: any){ + }, function (error: any, response: any) { resolve(response.statusCode); }); }); diff --git a/yarn.lock b/yarn.lock index 980e90d50879..65e91a9da026 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,6 +54,286 @@ dependencies: tsickle "^0.2" +"@google-cloud/bigquery@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@google-cloud/bigquery/-/bigquery-0.8.0.tgz#670b09540b8cace72924637800228ba313d1bf52" + dependencies: + "@google-cloud/common" "^0.12.0" + arrify "^1.0.0" + duplexify "^3.2.0" + extend "^3.0.0" + is "^3.0.1" + stream-events "^1.0.1" + string-format-obj "^1.0.0" + +"@google-cloud/bigtable@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@google-cloud/bigtable/-/bigtable-0.8.0.tgz#b1ee7cc639ca35a2099e5f1927266327b145f7b4" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.1" + arrify "^1.0.0" + concat-stream "^1.5.0" + create-error-class "^3.0.2" + dot-prop "^3.0.0" + extend "^3.0.0" + google-proto-files "^0.8.0" + is "^3.0.1" + lodash.flatten "^4.2.0" + node-int64 "^0.4.0" + prop-assign "^1.0.0" + pumpify "^1.3.3" + string-format-obj "^1.0.0" + through2 "^2.0.0" + +"@google-cloud/common-grpc@^0.1.1", "@google-cloud/common-grpc@^0.1.4": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@google-cloud/common-grpc/-/common-grpc-0.1.6.tgz#4f7ed73e63eda13e02d9572be8c56166aa3e2055" + dependencies: + "@google-cloud/common" "^0.12.0" + dot-prop "^2.4.0" + duplexify "^3.5.0" + extend "^3.0.0" + google-proto-files "^0.10.0" + grpc "^1.1.1" + is "^3.2.0" + modelo "^4.2.0" + retry-request "^1.3.2" + through2 "^2.0.3" + +"@google-cloud/common@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.12.1.tgz#fbf19bc74f5aecb80810447e33de1a3812c6aee3" + dependencies: + array-uniq "^1.0.3" + arrify "^1.0.1" + concat-stream "^1.6.0" + create-error-class "^3.0.2" + duplexify "^3.5.0" + ent "^2.2.0" + extend "^3.0.0" + google-auto-auth "^0.5.2" + is "^3.2.0" + log-driver "^1.2.5" + methmeth "^1.1.0" + modelo "^4.2.0" + request "^2.79.0" + retry-request "^1.3.2" + split-array-stream "^1.0.0" + stream-events "^1.0.1" + string-format-obj "^1.1.0" + through2 "^2.0.3" + +"@google-cloud/compute@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@google-cloud/compute/-/compute-0.5.0.tgz#3b4420e0a09b5e99e4487439f1d9948b3aec3553" + dependencies: + "@google-cloud/common" "^0.12.0" + arrify "^1.0.0" + async "^2.0.1" + create-error-class "^3.0.2" + extend "^3.0.0" + gce-images "^0.3.0" + is "^3.0.1" + string-format-obj "^1.0.0" + +"@google-cloud/datastore@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@google-cloud/datastore/-/datastore-0.7.0.tgz#d7f7888e16cd3903bec6e8b5a2b0aefdfa82a154" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.1" + arrify "^1.0.0" + concat-stream "^1.5.0" + create-error-class "^3.0.2" + extend "^3.0.0" + is "^3.0.1" + lodash.flatten "^4.2.0" + modelo "^4.2.0" + prop-assign "^1.0.0" + propprop "^0.3.0" + split-array-stream "^1.0.0" + +"@google-cloud/dns@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@google-cloud/dns/-/dns-0.5.0.tgz#44e0725f42078b2638d9989ae4b4b9d595e1f6e5" + dependencies: + "@google-cloud/common" "^0.12.0" + arrify "^1.0.0" + dns-zonefile "0.1.18" + extend "^3.0.0" + is "^3.0.1" + methmeth "^1.0.0" + string-format-obj "^1.0.0" + +"@google-cloud/language@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@google-cloud/language/-/language-0.8.0.tgz#0ee3ec6988b952b8d9acbbe980093f83663be7b6" + dependencies: + "@google-cloud/common" "^0.12.0" + arrify "^1.0.1" + extend "^3.0.0" + google-gax "^0.10.0" + google-proto-files "^0.8.5" + is "^3.0.1" + propprop "^0.3.1" + string-format-obj "^1.1.0" + +"@google-cloud/logging@^0.7.0": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@google-cloud/logging/-/logging-0.7.1.tgz#a57020ad2573ec425886b490a2b0bbfa866547ec" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.1" + arrify "^1.0.0" + async "^2.1.4" + extend "^3.0.0" + google-gax "^0.12.2" + google-proto-files "^0.10.0" + is "^3.0.1" + is-circular "^1.0.1" + string-format-obj "^1.0.0" + +"@google-cloud/monitoring@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@google-cloud/monitoring/-/monitoring-0.1.4.tgz#d2629045150289ae6eef385f68f6e1b93cce2967" + dependencies: + extend "^3.0.0" + google-gax "^0.10.0" + google-proto-files "^0.8.3" + +"@google-cloud/prediction@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@google-cloud/prediction/-/prediction-0.5.0.tgz#f26b0a2ddb6a9a8375acb771096acfc1af43c43c" + dependencies: + "@google-cloud/common" "^0.12.0" + JSONStream "^1.0.7" + arrify "^1.0.0" + extend "^3.0.0" + is "^3.0.1" + pumpify "^1.3.3" + stream-events "^1.0.1" + string-format-obj "^1.0.0" + through2 "^2.0.0" + +"@google-cloud/pubsub@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-0.8.1.tgz#1bd002494ee0ede9e67758bc177ed21dab76c1a9" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.1" + arrify "^1.0.0" + extend "^3.0.0" + google-gax "^0.12.2" + google-proto-files "^0.10.0" + is "^3.0.1" + modelo "^4.2.0" + propprop "^0.3.0" + uuid "^3.0.1" + +"@google-cloud/resource@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@google-cloud/resource/-/resource-0.6.0.tgz#9404b54827563c9f87ec5dd93bec71801f054ea9" + dependencies: + "@google-cloud/common" "^0.12.0" + extend "^3.0.0" + is "^3.0.1" + +"@google-cloud/spanner@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@google-cloud/spanner/-/spanner-0.1.1.tgz#55551edde5b75d0220b8350dc6a0178e7ec36f47" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.4" + arrify "^1.0.1" + checkpoint-stream "^0.1.0" + events-intercept "^2.0.0" + extend "^3.0.0" + generic-pool "^3.1.4" + google-gax "^0.10.0" + google-proto-files "^0.9.0" + is "^3.1.0" + lodash.chunk "^4.2.0" + lodash.snakecase "^4.1.1" + merge-stream "^1.0.1" + split-array-stream "^1.0.0" + stream-events "^1.0.1" + string-format-obj "^1.1.0" + through2 "^2.0.3" + +"@google-cloud/speech@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@google-cloud/speech/-/speech-0.7.0.tgz#82ecedede123920a49f99990ad7592a80676fcf7" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.1" + events-intercept "^2.0.0" + extend "^3.0.0" + google-gax "^0.12.0" + google-proto-files "^0.10.0" + is "^3.1.0" + propprop "^0.3.1" + pumpify "^1.3.5" + request "^2.74.0" + stream-events "^1.0.1" + string-format-obj "^1.1.0" + through2 "^2.0.1" + +"@google-cloud/storage@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-0.7.0.tgz#87eb7bde35a1597511cba7b651e666178ac90fe1" + dependencies: + "@google-cloud/common" "^0.12.0" + arrify "^1.0.0" + async "^2.0.1" + concat-stream "^1.5.0" + create-error-class "^3.0.2" + duplexify "^3.2.0" + extend "^3.0.0" + gcs-resumable-upload "^0.7.1" + hash-stream-validation "^0.2.1" + is "^3.0.1" + mime-types "^2.0.8" + once "^1.3.1" + pumpify "^1.3.3" + stream-events "^1.0.1" + string-format-obj "^1.0.0" + through2 "^2.0.0" + +"@google-cloud/translate@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@google-cloud/translate/-/translate-0.7.0.tgz#acb3b2690b946e6f5a65f51958f31cab3779d1e3" + dependencies: + "@google-cloud/common" "^0.12.0" + arrify "^1.0.0" + extend "^3.0.0" + is "^3.0.1" + is-html "^1.0.0" + propprop "^0.3.0" + +"@google-cloud/vision@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@google-cloud/vision/-/vision-0.9.0.tgz#cc0159af9477cee31c3c26f1a3d4e8a8fdda8292" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.1" + arrify "^1.0.0" + async "^2.0.1" + extend "^3.0.0" + google-gax "^0.12.1" + google-proto-files "^0.10.0" + is "^3.0.1" + prop-assign "^1.0.0" + propprop "^0.3.0" + rgb-hex "^1.0.0" + string-format-obj "^1.0.0" + +"@types/fs-extra@0.0.37": + version "0.0.37" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-0.0.37.tgz#195f11bcd9a1b97d9e412c6b66899b545471a1f7" + dependencies: + "@types/node" "*" + "@types/glob@^5.0.30": version "5.0.30" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.30.tgz#1026409c5625a8689074602808d082b2867b8a51" @@ -73,7 +353,7 @@ version "2.0.34" resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.34.tgz#9cbac4f41cb039436141785e1be50b3ab10a04a9" -"@types/jasmine@^2.5.41": +"@types/jasmine@2.5.41": version "2.5.41" resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.41.tgz#d5e86161a0af80d52062b310a33ed65b051a0713" @@ -97,7 +377,7 @@ version "1.2.0" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" -"@types/node@*", "@types/node@^7.0.4": +"@types/node@*": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.4.tgz#9aabc135979ded383325749f508894c662948c8b" @@ -105,6 +385,10 @@ version "6.0.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.60.tgz#e7e134ebc674ae6ed93c36c767739b110d2c57fc" +"@types/node@^7.0.5": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.5.tgz#96a0f0a618b7b606f1ec547403c00650210bfbb7" + "@types/orchestrator@*": version "0.0.30" resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.0.30.tgz#dcdda8d647b568b7b1e34178cb1f0b44ac9a98e5" @@ -143,7 +427,7 @@ JSONStream@^0.8.4: jsonparse "0.0.5" through ">=2.2.7 <3" -JSONStream@^1.0.4: +JSONStream@^1.0.4, JSONStream@^1.0.7: version "1.3.0" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.0.tgz#680ab9ac6572a8a1a207e0b38721db1c77b215e5" dependencies: @@ -300,6 +584,10 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arguejs@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/arguejs/-/arguejs-0.2.3.tgz#b6f939f5fe0e3cd1f3f93e2aa9262424bf312af7" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -330,6 +618,14 @@ array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" +array-parallel@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d" + +array-series@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f" + array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" @@ -340,7 +636,7 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" -array-uniq@^1.0.1, array-uniq@^1.0.2: +array-uniq@^1.0.1, array-uniq@^1.0.2, array-uniq@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -352,7 +648,7 @@ arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -372,6 +668,13 @@ asap@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" +ascli@~1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc" + dependencies: + colour "~0.7.1" + optjs "~3.2.2" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -396,7 +699,7 @@ async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" -async@0.2.x, async@~0.2.6: +async@0.2.x, async@~0.2.6, async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -404,20 +707,30 @@ async@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/async/-/async-1.4.0.tgz#35f86f83c59e0421d099cd9a91d8278fb578c00d" -async@2.0.1, async@^2.0.0: +async@2.0.1, async@^2.0.0, async@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" dependencies: lodash "^4.8.0" -async@^1.3.0, async@^1.4.0, async@^1.5.2: +async@^1.3.0, async@^1.4.0, async@^1.4.2, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +async@^2.1.2, async@^2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" + dependencies: + lodash "^4.14.0" + async@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" +async@~1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.4.2.tgz#6c9edcb11ced4f0dd2f2d40db0d49a109c088aab" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -453,6 +766,14 @@ axe-webdriverjs@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/axe-webdriverjs/-/axe-webdriverjs-0.5.0.tgz#8e314941f0642001d4802d812dc833b580a008ce" +babel-code-frame@^6.20.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + babel-runtime@^6.0.0: version "6.20.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" @@ -494,6 +815,17 @@ base64url@2.0.0, base64url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" +base64url@~0.0.4: + version "0.0.6" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-0.0.6.tgz#9597b36b330db1c42477322ea87ea8027499b82b" + +base64url@~1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-1.0.6.tgz#d64d375d68a7c640d912e2358d170dca5bb54681" + dependencies: + concat-stream "~1.4.7" + meow "~2.0.0" + basic-auth-connect@1.0.0, basic-auth-connect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" @@ -549,9 +881,9 @@ block-stream@*: dependencies: inherits "~2.0.0" -blocking-proxy@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.4.tgz#49016732ac38e8d53a2c7dcd502520aa0e58e044" +blocking-proxy@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b" dependencies: minimist "^1.2.0" @@ -559,20 +891,20 @@ bluebird@^3.3.0, bluebird@^3.4.1: version "3.4.7" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" -body-parser@^1.12.4, body-parser@~1.14.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" +body-parser@^1.16.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.0.tgz#d956ae2d756ae10bb784187725ea5a249430febd" dependencies: - bytes "2.2.0" - content-type "~1.0.1" - debug "~2.2.0" + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.1" depd "~1.1.0" - http-errors "~1.3.1" - iconv-lite "0.4.13" + http-errors "~1.6.1" + iconv-lite "0.4.15" on-finished "~2.3.0" - qs "5.2.0" - raw-body "~2.1.5" - type-is "~1.6.10" + qs "6.3.1" + raw-body "~2.2.0" + type-is "~1.6.14" body-parser@~1.13.3: version "1.13.3" @@ -589,6 +921,21 @@ body-parser@~1.13.3: raw-body "~2.1.2" type-is "~1.6.6" +body-parser@~1.14.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" + dependencies: + bytes "2.2.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.3.1" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "5.2.0" + raw-body "~2.1.5" + type-is "~1.6.10" + boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -609,6 +956,18 @@ boxen@^0.6.0: string-width "^1.0.1" widest-line "^1.0.0" +boxen@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.0.0.tgz#b2694baf1f605f708ff0177c12193b22f29aaaab" + dependencies: + ansi-align "^1.1.0" + camelcase "^4.0.0" + chalk "^1.1.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^0.1.0" + widest-line "^1.0.0" + brace-expansion@^1.0.0: version "1.1.6" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" @@ -652,14 +1011,26 @@ buffer-crc32@^0.2.1: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" -buffer-equal-constant-time@1.0.1: +buffer-equal-constant-time@1.0.1, buffer-equal-constant-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" +buffered-spawn@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffered-spawn/-/buffered-spawn-1.1.2.tgz#21ad9735dfbf6576745be0d74a23ef257bf3c58d" + dependencies: + cross-spawn-async "^1.0.1" + err-code "^0.1.0" + q "^1.0.1" + buffers@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" @@ -674,6 +1045,12 @@ builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +bytebuffer@~5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" + dependencies: + long "~3" + bytes@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4" @@ -697,6 +1074,13 @@ camel-case@3.0.x, camel-case@^3.0.0: no-case "^2.2.0" upper-case "^1.1.1" +camelcase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-1.0.0.tgz#bd1a11bf9b31a1ce493493a930de1a0baf4ad7ec" + dependencies: + camelcase "^1.0.1" + map-obj "^1.0.0" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -704,7 +1088,7 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: +camelcase@^1.0.1, camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -716,6 +1100,10 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +camelcase@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.0.0.tgz#8b0f90d44be5e281b903b9887349b92595ef07f2" + caniuse-db@^1.0.30000187, caniuse-db@^1.0.30000604: version "1.0.30000607" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000607.tgz#f9d5b542f30d064c305544ff8938b217c67b88e9" @@ -798,6 +1186,15 @@ char-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" +checkpoint-stream@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/checkpoint-stream/-/checkpoint-stream-0.1.1.tgz#59088511fbe23b6d2c1e82eaf02f28459667f637" + dependencies: + events-intercept "^2.0.0" + pumpify "^1.3.5" + split-array-stream "^1.0.0" + through2 "^2.0.3" + chokidar@^1.4.1, chokidar@^1.6.0: version "1.6.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" @@ -819,17 +1216,33 @@ cjson@^0.3.1: dependencies: json-parse-helpfulerror "^1.0.3" -clean-css@3.4.x, clean-css@^3.4.23: +clean-css@3.4.x: version "3.4.23" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.23.tgz#604fbbca24c12feb59b02f00b84f1fb7ded6d001" dependencies: commander "2.8.x" source-map "0.4.x" +clean-css@^4.0.7: + version "4.0.8" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.0.8.tgz#063dfd593404d3a3d1db494d4b6d0f378b0781b6" + dependencies: + source-map "0.5.x" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.0.0.tgz#ef987ed3d48391ac3dab9180b406a742180d6e6a" + cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" @@ -910,6 +1323,10 @@ colors@^1.1.0, colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +colour@~0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" + combine-lists@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" @@ -928,7 +1345,7 @@ commander@2.8.x, commander@~2.8.1: dependencies: graceful-readlink ">= 1.0.0" -commander@2.9.x, commander@^2.8.1, commander@^2.9.0: +commander@2.9.x, commander@^2.8.1, commander@^2.9.0, commander@~2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -1001,7 +1418,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -1009,7 +1426,15 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^1.0.0, configstore@^1.2.0: +concat-stream@~1.4.7: + version "1.4.10" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.9" + typedarray "~0.0.5" + +configstore@^1.0.0, configstore@^1.2.0, configstore@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" dependencies: @@ -1036,6 +1461,17 @@ configstore@^2.0.0: write-file-atomic "^1.1.2" xdg-basedir "^2.0.0" +configstore@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + unique-string "^1.0.0" + write-file-atomic "^1.1.2" + xdg-basedir "^3.0.0" + connect-livereload@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.5.4.tgz#80157d1371c9f37cc14039ab1895970d119dc3bc" @@ -1091,7 +1527,7 @@ connect@^2.30.0: utils-merge "1.0.0" vhost "~3.0.1" -connect@^3.3.3, connect@^3.3.5: +connect@^3.3.3: version "3.5.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" dependencies: @@ -1100,6 +1536,15 @@ connect@^3.3.3, connect@^3.3.5: parseurl "~1.3.1" utils-merge "1.0.0" +connect@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.0.tgz#f09a4f7dcd17324b663b725c815bdb1c4158a46e" + dependencies: + debug "2.6.1" + finalhandler "1.0.0" + parseurl "~1.3.1" + utils-merge "1.0.0" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -1111,7 +1556,7 @@ constant-case@^2.0.0: snake-case "^2.1.0" upper-case "^1.1.1" -content-type@~1.0.1: +content-type@~1.0.1, content-type@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" @@ -1292,12 +1737,33 @@ crc@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/crc/-/crc-3.3.0.tgz#fa622e1bc388bf257309082d6b65200ce67090ba" -create-error-class@^3.0.1: +create-error-class@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-2.0.1.tgz#a8759ed5c8d214a461e81d18e70aacb33dd63c9c" + dependencies: + capture-stack-trace "^1.0.0" + inherits "^2.0.1" + +create-error-class@^3.0.0, create-error-class@^3.0.1, create-error-class@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" dependencies: capture-stack-trace "^1.0.0" +cross-spawn-async@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-1.0.1.tgz#bb525c1e420d9942552e04791a3eb2d9887a105f" + dependencies: + lru-cache "^2.6.5" + which "^1.1.1" + +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -1311,6 +1777,10 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + csrf@~3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.0.4.tgz#ba01423e5b5bea7b655e38b0bdd1323954cbdaa5" @@ -1415,6 +1885,12 @@ debug@2.2.0, debug@~2.2.0: dependencies: ms "0.7.1" +debug@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" + dependencies: + ms "0.7.2" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1453,21 +1929,21 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + depd@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa" -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" - dependency-graph@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.4.1.tgz#302e58218d85c51a97638730dbf9b7d852a19693" -dependency-tree@^5.7.6: - version "5.7.6" - resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-5.7.6.tgz#e4f6f26fe580362e6cf2d3c5f9fabddc81580ed8" +dependency-tree@5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-5.8.0.tgz#0abd5aee789b49be5121a92cf6697bb7a1332d70" dependencies: commander "~2.6.0" debug "~2.2.0" @@ -1580,14 +2056,14 @@ didyoumean@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff" -diff@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" - -diff@^3.1.0: +diff@^3.0.1, diff@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" +dns-zonefile@0.1.18: + version "0.1.18" + resolved "https://registry.yarnpkg.com/dns-zonefile/-/dns-zonefile-0.1.18.tgz#7569c7371dbdfd50bf8e53e2da0740679292299e" + doiuse@^2.4.1: version "2.5.0" resolved "https://registry.yarnpkg.com/doiuse/-/doiuse-2.5.0.tgz#c7f156965d054bf4d699a4067af1cadbc7350b7c" @@ -1648,12 +2124,24 @@ dot-case@^2.1.0: dependencies: no-case "^2.2.0" +dot-prop@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-2.4.0.tgz#848e28f7f1d50740c6747ab3cb07670462b6f89c" + dependencies: + is-obj "^1.0.0" + dot-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" dependencies: is-obj "^1.0.0" +dot-prop@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + dependencies: + is-obj "^1.0.0" + duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" @@ -1666,11 +2154,15 @@ duplexer2@^0.1.4: dependencies: readable-stream "^2.0.2" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" -duplexify@^3.2.0, duplexify@^3.5.0: +duplexify@^3.1.2, duplexify@^3.2.0, duplexify@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" dependencies: @@ -1685,7 +2177,7 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -ecdsa-sig-formatter@1.0.9: +ecdsa-sig-formatter@1.0.9, ecdsa-sig-formatter@^1.0.0: version "1.0.9" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" dependencies: @@ -1696,21 +2188,31 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + end-of-stream@1.0.0, end-of-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" dependencies: once "~1.3.0" +end-of-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" + dependencies: + once "~1.3.0" + end-of-stream@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" dependencies: once "~1.3.0" -engine.io-client@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766" +engine.io-client@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -1721,7 +2223,7 @@ engine.io-client@1.8.2: parsejson "0.0.3" parseqs "0.0.5" parseuri "0.0.5" - ws "1.1.1" + ws "1.1.2" xmlhttprequest-ssl "1.5.3" yeast "0.1.2" @@ -1736,16 +2238,16 @@ engine.io-parser@1.3.2: has-binary "0.1.7" wtf-8 "1.0.0" -engine.io@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.2.tgz#6b59be730b348c0125b0a4589de1c355abcf7a7e" +engine.io@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" dependencies: accepts "1.3.3" base64id "1.0.0" cookie "0.3.1" debug "2.3.3" engine.io-parser "1.3.2" - ws "1.1.1" + ws "1.1.2" enhanced-resolve@^3.0.2: version "3.0.3" @@ -1756,7 +2258,7 @@ enhanced-resolve@^3.0.2: object-assign "^4.0.1" tapable "^0.2.5" -ent@~2.2.0: +ent@^2.2.0, ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" @@ -1764,6 +2266,10 @@ entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" +err-code@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-0.1.2.tgz#122a92b3342b9899da02b5ac994d30f95d4763ee" + errno@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" @@ -1854,6 +2360,21 @@ eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" +events-intercept@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/events-intercept/-/events-intercept-2.0.0.tgz#adbf38681c5a4b2011c41ee41f61a34cba448897" + +execa@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + dependencies: + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" + npm-run-path "^1.0.0" + object-assign "^4.0.1" + path-key "^1.0.0" + strip-eof "^1.0.0" + execall@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" @@ -2031,6 +2552,18 @@ finalhandler@0.5.0: statuses "~1.3.0" unpipe "~1.0.0" +finalhandler@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.0.tgz#b5691c2c0912092f18ac23e9416bde5cd7dc6755" + dependencies: + debug "2.6.1" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + find-index@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" @@ -2079,9 +2612,9 @@ fined@^1.0.1: lodash.pick "^4.2.1" parse-filepath "^1.0.1" -firebase-admin@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-4.0.6.tgz#c75c36be55c41de731920d5c3a81a5f31d4d0721" +firebase-admin@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-4.1.2.tgz#2cd5d4d9616269112da62c527a30050b76551ecb" dependencies: "@types/jsonwebtoken" "^7.1.33" faye-websocket "0.9.3" @@ -2167,6 +2700,14 @@ fork-stream@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" +form-data@~1.0.0-rc4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" + dependencies: + async "^2.0.1" + combined-stream "^1.0.5" + mime-types "^2.1.11" + form-data@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" @@ -2303,6 +2844,28 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" +gce-images@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/gce-images/-/gce-images-0.3.1.tgz#fcc268ee7b2489d457bc55345c214669fcd560e9" + dependencies: + arrify "^1.0.0" + async "^1.4.2" + google-auto-auth "^0.1.0" + got "^4.1.1" + object-assign "^3.0.0" + +gcs-resumable-upload@^0.7.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-0.7.4.tgz#6633967badf7a4aed2d79337e7badfe889cfd617" + dependencies: + buffer-equal "0.0.1" + configstore "^1.2.1" + google-auto-auth "^0.2.1" + pumpify "^1.3.3" + request "^2.61.0" + stream-events "^1.0.1" + through2 "^2.0.0" + generate-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" @@ -2313,6 +2876,10 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +generic-pool@^3.1.4: + version "3.1.7" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.1.7.tgz#dac22b2c7a7a04e41732f7d8d2d25a303c88f662" + get-amd-module-type@^2.0.4: version "2.0.5" resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-2.0.5.tgz#e671ec5a96ad5fbf53a3a22a289e9238c772ddb0" @@ -2342,6 +2909,10 @@ get-stdin@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + getpass@^0.1.1: version "0.1.6" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" @@ -2531,12 +3102,118 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" +gm@~1.21.1: + version "1.21.1" + resolved "https://registry.yarnpkg.com/gm/-/gm-1.21.1.tgz#7ed5ed05db36d30c1943f39c3bc1c839b8f2361d" + dependencies: + array-parallel "~0.1.3" + array-series "~0.1.5" + debug "~2.2.0" + gonzales-pe@^3.4.4: version "3.4.7" resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-3.4.7.tgz#17c7be67ad6caff6277a3e387ac736e983d280ec" dependencies: minimist "1.1.x" +google-auth-library@^0.9.10, google-auth-library@^0.9.6: + version "0.9.10" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.9.10.tgz#4993dc07bb4834b8ca0350213a6873a32c6051b9" + dependencies: + async "~1.4.2" + gtoken "^1.1.0" + jws "~3.0.0" + lodash.noop "~3.0.0" + request "~2.74.0" + string-template "~0.2.0" + +google-auto-auth@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.1.1.tgz#69e061ac54484c11e8a971a5e76d4239dbee6910" + dependencies: + google-auth-library "^0.9.6" + object-assign "^3.0.0" + +google-auto-auth@^0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.2.4.tgz#16dafbf150d353a42190979c6803ffc75f6455fa" + dependencies: + google-auth-library "^0.9.6" + object-assign "^3.0.0" + +google-auto-auth@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.5.2.tgz#4c9f38574e69fb55a3c516ab0415e9fa33e67602" + dependencies: + async "^2.1.2" + google-auth-library "^0.9.10" + object-assign "^3.0.0" + request "^2.79.0" + +google-cloud@^0.48.0: + version "0.48.0" + resolved "https://registry.yarnpkg.com/google-cloud/-/google-cloud-0.48.0.tgz#1c4046b95a3db5b195a1e7bab74cdf3f75713ecf" + dependencies: + "@google-cloud/bigquery" "^0.8.0" + "@google-cloud/bigtable" "^0.8.0" + "@google-cloud/compute" "^0.5.0" + "@google-cloud/datastore" "^0.7.0" + "@google-cloud/dns" "^0.5.0" + "@google-cloud/language" "^0.8.0" + "@google-cloud/logging" "^0.7.0" + "@google-cloud/monitoring" "^0.1.4" + "@google-cloud/prediction" "^0.5.0" + "@google-cloud/pubsub" "^0.8.1" + "@google-cloud/resource" "^0.6.0" + "@google-cloud/spanner" "^0.1.0" + "@google-cloud/speech" "^0.7.0" + "@google-cloud/storage" "^0.7.0" + "@google-cloud/translate" "^0.7.0" + "@google-cloud/vision" "^0.9.0" + extend "^3.0.0" + +google-gax@^0.10.0: + version "0.10.8" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-0.10.8.tgz#20a6acdc8fcf01d71c1c990b85e665761e36ddf0" + dependencies: + extend "^3.0.0" + google-auto-auth "^0.5.2" + google-proto-files "^0.9.1" + grpc "^1.1" + lodash "^4.17.2" + process-nextick-args "^1.0.7" + readable-stream "^2.2.2" + +google-gax@^0.12.0, google-gax@^0.12.1, google-gax@^0.12.2: + version "0.12.2" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-0.12.2.tgz#cc25834cca5aa4cb06bbe90e56274c4d80476772" + dependencies: + extend "^3.0.0" + google-auto-auth "^0.5.2" + google-proto-files "^0.9.1" + grpc "^1.1" + lodash "^4.17.2" + process-nextick-args "^1.0.7" + readable-stream "^2.2.2" + +google-p12-pem@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-0.1.1.tgz#66ef8946ee97e8da37f1beb1d8ec5c3be2ba4539" + dependencies: + node-forge "^0.6.46" + +google-proto-files@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.10.0.tgz#980ecc04383671540f1d8453d00a68950d73728a" + +google-proto-files@^0.8.0, google-proto-files@^0.8.3, google-proto-files@^0.8.5: + version "0.8.6" + resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.8.6.tgz#a7c8ddccd2179690d270b0ebfc42994d56da0ee6" + +google-proto-files@^0.9.0, google-proto-files@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.9.1.tgz#c760c79059bf62ba3ac56e1d1ba7b8d4560803be" + got@^3.2.0: version "3.3.1" resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" @@ -2552,6 +3229,25 @@ got@^3.2.0: read-all-stream "^3.0.0" timed-out "^2.0.0" +got@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/got/-/got-4.2.0.tgz#af59f461834bfafd722cba01acf4c14a9dd5da06" + dependencies: + create-error-class "^2.0.0" + duplexify "^3.2.0" + is-plain-obj "^1.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^3.0.0" + parse-json "^2.1.0" + pinkie-promise "^1.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + unzip-response "^1.0.0" + got@^5.0.0: version "5.7.1" resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" @@ -2572,6 +3268,22 @@ got@^5.0.0: unzip-response "^1.0.2" url-parse-lax "^1.0.0" +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + graceful-fs@4.X, graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2596,6 +3308,25 @@ graphviz@^0.0.8: dependencies: temp "~0.4.0" +grpc@^1.1, grpc@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.1.2.tgz#a6dc02d659fcd802554a210f7906a49f59e1e353" + dependencies: + arguejs "^0.2.3" + lodash "^4.15.0" + nan "^2.0.0" + node-pre-gyp "^0.6.0" + protobufjs "^5.0.0" + +gtoken@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.1.tgz#90153a547c2fc1cd24a4d3d2ab3b5aba0a26897a" + dependencies: + google-p12-pem "^0.1.0" + jws "^3.0.0" + mime "^1.2.11" + request "^2.72.0" + gulp-autoprefixer@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-3.1.1.tgz#75230051cd0d171343d783b7e9b5d1120eeef9b0" @@ -2614,13 +3345,12 @@ gulp-better-rollup@^1.0.2: rollup "^0.36.0" vinyl-sourcemaps-apply "^0.2.1" -gulp-clean-css@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-2.3.2.tgz#7410769c4474c12ccd55e98ea74b1898d428acd0" +gulp-clean-css@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.0.3.tgz#dcd6767413d51a9de9e4bc47b8ae7e02b43b1c4a" dependencies: - clean-css "^3.4.23" - gulp-util "^3.0.7" - object-assign "^4.1.0" + clean-css "^4.0.7" + gulp-util "^3.0.8" through2 "^2.0.3" vinyl-sourcemaps-apply "^0.2.1" @@ -2727,9 +3457,9 @@ gulp-sass@^3.1.0: through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" -gulp-sourcemaps@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.4.0.tgz#9ce8fcf9ab29769819dff04ca781976072838979" +gulp-sourcemaps@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.4.1.tgz#8f65dc5c0d07b2fd5c88bc60ec7f13e56716bf74" dependencies: acorn "4.X" convert-source-map "1.X" @@ -2869,6 +3599,12 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +hash-stream-validation@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz#ecc9b997b218be5bb31298628bb807869b73dcd1" + dependencies: + through2 "^2.0.0" + hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -2924,7 +3660,7 @@ html-minifier@^3.0.3: relateurl "0.2.x" uglify-js "2.7.x" -html-tags@^1.1.1: +html-tags@^1.0.0, html-tags@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.1.1.tgz#869f43859f12d9bdc3892419e494a628aa1b204e" @@ -2946,6 +3682,15 @@ http-errors@~1.3.1: inherits "~2.0.1" statuses "1" +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + http-proxy@^1.13.0: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" @@ -2977,10 +3722,25 @@ iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + ignore@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" +image-diff@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/image-diff/-/image-diff-1.6.3.tgz#818a0e656ae89480e802e7ef14db460826f730fc" + dependencies: + async "~0.2.9" + buffered-spawn "~1.1.1" + commander "~2.9.0" + gm "~1.21.1" + mkdirp "~0.3.5" + tmp "0.0.23" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2989,6 +3749,14 @@ in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" +indent-string@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-1.2.2.tgz#db99bcc583eb6abbb1e48dcbb1999a986041cb6b" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -3018,7 +3786,7 @@ inherits@1: version "1.0.2" resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -3078,6 +3846,10 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-circular@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.1.tgz#65b0476a8588e546b8087c1d66d4c08d82a31679" + is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -3096,7 +3868,7 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-finite@^1.0.0: +is-finite@^1.0.0, is-finite@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" dependencies: @@ -3116,7 +3888,13 @@ is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" dependencies: - is-extglob "^1.0.0" + is-extglob "^1.0.0" + +is-html@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464" + dependencies: + html-tags "^1.0.0" is-lower-case@^1.1.0: version "1.1.3" @@ -3167,6 +3945,10 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -3201,7 +3983,11 @@ is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" -is-stream@^1.0.0: +is-stream-ended@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.0.tgz#40f058df6b044ee598fee4df7dc1ec2bcdd8df60" + +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3247,6 +4033,10 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is@^3.0.1, is@^3.1.0, is@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3324,6 +4114,10 @@ js-base64@^2.1.9: version "2.1.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + js-yaml@^3.4.3: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -3425,7 +4219,15 @@ jwa@^1.1.4: ecdsa-sig-formatter "1.0.9" safe-buffer "^5.0.1" -jws@^3.1.3: +jwa@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.0.2.tgz#fd79609f1e772e299dce8ddb76d00659dd83511f" + dependencies: + base64url "~0.0.4" + buffer-equal-constant-time "^1.0.1" + ecdsa-sig-formatter "^1.0.0" + +jws@^3.0.0, jws@^3.1.3: version "3.1.4" resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" dependencies: @@ -3433,6 +4235,13 @@ jws@^3.1.3: jwa "^1.1.4" safe-buffer "^5.0.1" +jws@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.0.0.tgz#da5f267897dd4e9cf8137979db33fc54a3c05418" + dependencies: + base64url "~1.0.4" + jwa "~1.0.0" + karma-browserstack-launcher@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/karma-browserstack-launcher/-/karma-browserstack-launcher-1.2.0.tgz#acfa534835ba590041eef009c1169a219120bb5b" @@ -3448,9 +4257,9 @@ karma-chrome-launcher@^2.0.0: fs-access "^1.0.0" which "^1.2.1" -karma-firefox-launcher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.0.0.tgz#e08af3ce42e39860c2952ea7b7eaa64d63508bdc" +karma-firefox-launcher@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.0.1.tgz#ce58f47c2013a88156d55a5d61337c099cf5bb51" karma-jasmine@^1.1.0: version "1.1.0" @@ -3471,16 +4280,16 @@ karma-sourcemap-loader@^0.3.7: dependencies: graceful-fs "^4.1.2" -karma@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/karma/-/karma-1.4.1.tgz#41981a71d54237606b0a3ea8c58c90773f41650e" +karma@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/karma/-/karma-1.5.0.tgz#9c4c14f0400bef2c04c8e8e6bff59371025cc009" dependencies: bluebird "^3.3.0" - body-parser "^1.12.4" + body-parser "^1.16.1" chokidar "^1.4.1" colors "^1.1.0" combine-lists "^1.0.0" - connect "^3.3.5" + connect "^3.6.0" core-js "^2.2.0" di "^0.0.1" dom-serialize "^2.2.0" @@ -3496,12 +4305,12 @@ karma@^1.4.1: optimist "^0.6.1" qjobs "^1.1.4" range-parser "^1.2.0" - rimraf "^2.3.3" + rimraf "^2.6.0" safe-buffer "^5.0.1" - socket.io "1.7.2" + socket.io "1.7.3" source-map "^0.5.3" - tmp "0.0.28" - useragent "^2.1.10" + tmp "0.0.31" + useragent "^2.1.12" kind-of@^3.0.2: version "3.1.0" @@ -3531,6 +4340,12 @@ latest-version@^2.0.0: dependencies: package-json "^2.0.0" +latest-version@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.0.0.tgz#3104f008c0c391084107f85a344bc61e38970649" + dependencies: + package-json "^3.0.0" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -3543,6 +4358,10 @@ lazy-req@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" +lazy-req@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" + lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" @@ -3680,6 +4499,10 @@ lodash.assignwith@^4.0.7: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" +lodash.chunk@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" + lodash.clonedeep@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -3705,6 +4528,10 @@ lodash.escape@~2.4.1: lodash._reunescapedhtml "~2.4.1" lodash.keys "~2.4.1" +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + lodash.isarguments@2.4.x: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-2.4.1.tgz#4931a9c08253adf091ae7ca192258a973876ecca" @@ -3767,6 +4594,10 @@ lodash.mergewith@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" +lodash.noop@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" + lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -3779,6 +4610,10 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + lodash.sortby@^4.5.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -3854,7 +4689,7 @@ lodash@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.11.2, lodash@^4.13.1, lodash@^4.2.1, lodash@^4.5.0, lodash@^4.8.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.11.2, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.2.1, lodash@^4.5.0, lodash@^4.8.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3866,6 +4701,10 @@ lodash@~4.16.4: version "4.16.6" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" +log-driver@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -3879,6 +4718,10 @@ log4js@^0.6.31: readable-stream "~1.0.2" semver "~4.3.3" +long@~3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -3908,24 +4751,31 @@ lru-cache@2, lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" -lru-cache@^4.0.1: +lru-cache@^2.6.5: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^4.0.0, lru-cache@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" dependencies: pseudomap "^1.0.1" yallist "^2.0.0" -madge@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/madge/-/madge-1.5.0.tgz#6245ff76aa0e26ca668153b9b3f3d05d62db8a8b" +madge@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/madge/-/madge-1.6.0.tgz#f5d0a48027bee2eb9245b93423f9741f888aeb65" dependencies: chalk "^1.1.3" commander "^2.9.0" commondir "^1.0.1" debug "^2.2.0" - dependency-tree "^5.7.6" + dependency-tree "5.8.0" graphviz "^0.0.8" mz "^2.4.0" + ora "1.1.0" + pluralize "^3.1.0" + pretty-ms "2.1.0" rc "^1.1.6" walkdir "^0.0.11" @@ -3991,7 +4841,16 @@ meow@^3.3.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -merge-stream@^1.0.0: +meow@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-2.0.0.tgz#8f530a8ecf5d40d3f4b4df93c3472900fba2a8f1" + dependencies: + camelcase-keys "^1.0.0" + indent-string "^1.1.0" + minimist "^1.1.0" + object-assign "^1.0.0" + +merge-stream@^1.0.0, merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" dependencies: @@ -4001,6 +4860,10 @@ merge2@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.0.3.tgz#fa44f8b2262615ab72f0808a401d478a70e394db" +methmeth@^1.0.0, methmeth@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/methmeth/-/methmeth-1.1.0.tgz#e80a26618e52f5c4222861bb748510bd10e29089" + method-override@~2.3.5: version "2.3.7" resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.7.tgz#8e1d47ac480fb0cd8777083f11c896901166b2e5" @@ -4036,16 +4899,20 @@ micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "1.25.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" -mime-types@^2.0.4, mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: +mime-types@^2.0.4, mime-types@^2.0.8, mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: version "2.1.13" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" dependencies: mime-db "~1.25.0" -mime@1.3.4, mime@^1.3.4: +mime@1.3.4, mime@^1.2.11, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" @@ -4089,7 +4956,7 @@ mkdirp-promise@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.0.tgz#b8bc7d6eab71c2b2e37cb06ea48a459d14366ea2" -mkdirp@0.3.x: +mkdirp@0.3.x, mkdirp@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" @@ -4099,6 +4966,10 @@ mkdirp@0.5, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" +modelo@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/modelo/-/modelo-4.2.0.tgz#3b4b420023a66ca7e32bdba16e710937e14d1b0b" + modify-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" @@ -4181,7 +5052,7 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.3.0, nan@^2.3.2: +nan@^2.0.0, nan@^2.3.0, nan@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" @@ -4228,6 +5099,10 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-forge@^0.6.46: + version "0.6.49" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.49.tgz#f1ee95d5d74623938fe19d698aa5a26d54d2f60f" + node-gyp@^3.3.1: version "3.5.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.5.0.tgz#a8fe5e611d079ec16348a3eb960e78e11c85274a" @@ -4250,7 +5125,11 @@ node-html-encoder@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/node-html-encoder/-/node-html-encoder-0.0.2.tgz#8973618d727da5526a830b47d07c0d803e0a15c6" -node-pre-gyp@^0.6.29: +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-pre-gyp@^0.6.0, node-pre-gyp@^0.6.29: version "0.6.32" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" dependencies: @@ -4264,7 +5143,7 @@ node-pre-gyp@^0.6.29: tar "~2.2.1" tar-pack "~3.3.0" -node-sass@^4.2.0, node-sass@^4.3.0: +node-sass@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.3.0.tgz#d014f64595d77b26af99e9f7a7e74704d9976bda" dependencies: @@ -4287,6 +5166,29 @@ node-sass@^4.2.0, node-sass@^4.3.0: sass-graph "^2.1.1" stdout-stream "^1.4.0" +node-sass@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.0.tgz#532e37bad0ce587348c831535dbc98ea4289508b" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.3.2" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "^2.61.0" + sass-graph "^2.1.1" + stdout-stream "^1.4.0" + node-source-walk@^3.0.0, node-source-walk@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-3.2.0.tgz#3c605cc53abdee4b45ab65e947dfb1db7c90f0e3" @@ -4328,6 +5230,12 @@ normalize-selector@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" +npm-run-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + dependencies: + path-key "^1.0.0" + "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" @@ -4365,6 +5273,10 @@ object-assign@4.1.0, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" +object-assign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-1.0.0.tgz#e65dc8766d3b47b4b8307465c8311da030b070a6" + object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" @@ -4398,7 +5310,7 @@ on-headers@^1.0.0, on-headers@~1.0.0, on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0: +once@^1.3.0, once@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -4414,6 +5326,12 @@ onecolor@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/onecolor/-/onecolor-3.0.4.tgz#75a46f80da6c7aaa5b4daae17a47198bd9652494" +onetime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.0.tgz#52aa8110e52fc5126ffc667bd8ec21c2ed209ce6" + dependencies: + mimic-fn "^1.0.0" + open@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" @@ -4440,6 +5358,19 @@ options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" +optjs@~3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee" + +ora@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.1.0.tgz#69aaa4a209630e43b142c5f7ff41820da87e2faf" + dependencies: + chalk "^1.1.1" + cli-cursor "^2.1.0" + cli-spinners "^1.0.0" + log-symbols "^1.0.2" + orchestrator@^0.3.0: version "0.3.8" resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" @@ -4493,6 +5424,15 @@ package-json@^2.0.0: registry-url "^3.0.3" semver "^5.1.0" +package-json@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-3.1.0.tgz#ce281900fe8052150cc6709c6c006c18fdb2f379" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + param-case@2.1.x, param-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.0.tgz#2619f90fd6c829ed0b958f1c84ed03a745a6d70a" @@ -4526,6 +5466,10 @@ parse-json@^2.1.0, parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -4583,6 +5527,10 @@ path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" @@ -4625,12 +5573,22 @@ pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pinkie-promise@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" + dependencies: + pinkie "^1.0.0" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" dependencies: pinkie "^2.0.0" +pinkie@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4" + pinkie@^2.0.0, pinkie@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" @@ -4646,12 +5604,20 @@ pkginfo@0.3.x: version "0.3.1" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" +plur@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" + plur@^2.0.0, plur@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" dependencies: irregular-plurals "^1.0.0" +pluralize@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-3.1.0.tgz#84213d0a12356069daa84060c559242633161368" + postcss-less@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-0.14.0.tgz#c631b089c6cce422b9a10f3a958d2bedd3819324" @@ -4742,7 +5708,15 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" -process-nextick-args@~1.0.6: +pretty-ms@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" + dependencies: + is-finite "^1.0.1" + parse-ms "^1.0.0" + plur "^1.0.0" + +process-nextick-args@^1.0.7, process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -4750,14 +5724,31 @@ progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" -protractor@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.1.0.tgz#d2650f2f1fe69031aad35284eec1ef79a50625a1" +prop-assign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prop-assign/-/prop-assign-1.0.0.tgz#9767a1fbfd7093908647a6e846d31b4feaa70459" + +propprop@^0.3.0, propprop@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/propprop/-/propprop-0.3.1.tgz#a049a3568b896440067d15d8ec9f33735e570178" + +protobufjs@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.2.tgz#59748d7dcf03d2db22c13da9feb024e16ab80c91" + dependencies: + ascli "~1" + bytebuffer "~5" + glob "^7.0.5" + yargs "^3.10.0" + +protractor@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.1.1.tgz#10c4e336571b28875b8acc3ae3e4e1e40ef7e986" dependencies: "@types/node" "^6.0.46" "@types/q" "^0.0.32" "@types/selenium-webdriver" "~2.53.39" - blocking-proxy "0.0.4" + blocking-proxy "0.0.5" chalk "^1.1.3" glob "^7.0.3" jasmine "^2.5.3" @@ -4787,11 +5778,26 @@ pseudomap@^1.0.1: setimmediate ">= 1.0.2 < 2" slice-stream ">= 1.0.0 < 2" +pump@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3, pumpify@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" + dependencies: + duplexify "^3.1.2" + inherits "^2.0.1" + pump "^1.0.0" + punycode@^1.3.2, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@1.4.1, q@^1.4.1, q@~1.4.1: +q@1.4.1, q@^1.0.1, q@^1.4.1, q@~1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" @@ -4807,6 +5813,10 @@ qs@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" +qs@6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.1.tgz#918c0b3bcd36679772baf135b1acb4c1651ed79d" + qs@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/qs/-/qs-1.1.0.tgz#2845cd9df462b2db28a90370e142d492c5a45dde" @@ -4850,6 +5860,14 @@ raw-body@~2.1.2, raw-body@~2.1.5: iconv-lite "0.4.13" unpipe "1.0.0" +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + rc@^1.0.1, rc@^1.1.6, rc@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" @@ -5012,7 +6030,7 @@ repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -repeating@^1.1.2: +repeating@^1.1.0, repeating@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" dependencies: @@ -5042,7 +6060,7 @@ request-promise@^4.1.1: request-promise-core "1.1.1" stealthy-require "^1.0.0" -request@2, request@2.x, request@^2.58.0, request@^2.61.0, request@^2.78.0, request@^2.79.0: +request@2, request@2.x, request@^2.58.0, request@^2.61.0, request@^2.72.0, request@^2.74.0, request@^2.78.0, request@^2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -5093,6 +6111,57 @@ request@2.75.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" +request@2.76.0: + version "2.76.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +request@~2.74.0: + version "2.74.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc4" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -5161,13 +6230,31 @@ response-time@~2.3.1: depd "~1.1.0" on-headers "~1.0.1" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +retry-request@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-1.3.2.tgz#59ad24e71f8ae3f312d5f7b4bcf467a5e5a57bd6" + dependencies: + request "2.76.0" + through2 "^2.0.0" + +rgb-hex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgb-hex/-/rgb-hex-1.0.0.tgz#bfaf8cd9cd9164b5a26d71eb4f15a0965324b3c1" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@~2.5.1, rimraf@~2.5.4: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@~2.5.1, rimraf@~2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: @@ -5179,6 +6266,12 @@ rimraf@2.4.3: dependencies: glob "^5.0.14" +rimraf@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + rimraf@~2.2.0: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -5273,7 +6366,7 @@ sax@>=0.6.0: version "1.2.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" -selenium-webdriver@3.0.1, selenium-webdriver@^3.0.1: +selenium-webdriver@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz#a2dea5da4a97f6672e89e7ca7276cefa365147a7" dependencies: @@ -5292,6 +6385,15 @@ selenium-webdriver@^2.53.2: ws "^1.0.1" xml2js "0.4.4" +selenium-webdriver@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.1.0.tgz#d76182940cfb991edf4bc1c28318f4e7bc7730df" + dependencies: + adm-zip "^0.4.7" + rimraf "^2.5.4" + tmp "0.0.30" + xml2js "^0.4.17" + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -5394,6 +6496,10 @@ setprototypeof@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.0.tgz#d5fafca01e1174d0079bd1bf881f09c8a339794c" +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + shelljs@^0.7.0: version "0.7.6" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" @@ -5406,7 +6512,7 @@ sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -5443,15 +6549,15 @@ socket.io-adapter@0.5.0: debug "2.3.3" socket.io-parser "2.3.1" -socket.io-client@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.2.tgz#39fdb0c3dd450e321b7e40cfd83612ec533dd644" +socket.io-client@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" dependencies: backo2 "1.0.2" component-bind "1.0.0" component-emitter "1.2.1" debug "2.3.3" - engine.io-client "1.8.2" + engine.io-client "1.8.3" has-binary "0.1.7" indexof "0.0.1" object-component "0.0.3" @@ -5468,16 +6574,16 @@ socket.io-parser@2.3.1: isarray "0.0.1" json3 "3.3.2" -socket.io@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.2.tgz#83bbbdf2e79263b378900da403e7843e05dc3b71" +socket.io@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" dependencies: debug "2.3.3" - engine.io "1.8.2" + engine.io "1.8.3" has-binary "0.1.7" object-assign "4.1.0" socket.io-adapter "0.5.0" - socket.io-client "1.7.2" + socket.io-client "1.7.3" socket.io-parser "2.3.1" source-map-resolve@^0.3.0: @@ -5505,7 +6611,7 @@ source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@0.X, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: +source-map@0.5.x, source-map@0.X, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -5547,6 +6653,13 @@ specificity@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.3.0.tgz#332472d4e5eb5af20821171933998a6bc3b1ce6f" +split-array-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split-array-stream/-/split-array-stream-1.0.0.tgz#d5e4ffacd306161d69ed5252ff56d57e7762eaa2" + dependencies: + async "^1.4.0" + is-stream-ended "^0.1.0" + split2@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900" @@ -5594,7 +6707,7 @@ stack-trace@0.0.9, stack-trace@0.0.x: version "0.0.9" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" -statuses@1, statuses@~1.3.0: +statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.0, statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -5635,16 +6748,30 @@ stream-counter@~0.2.0: dependencies: readable-stream "~1.1.8" +stream-events@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.1.tgz#4fe7b2bbfcc53e6af31087e8c540483f412ce8c6" + dependencies: + stubs "^1.1.0" + stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +string-format-obj@^1.0.0, string-format-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/string-format-obj/-/string-format-obj-1.1.0.tgz#7635610b1ef397013e8478be98a170e04983d068" + string-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" dependencies: strip-ansi "^3.0.0" +string-template@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -5711,6 +6838,10 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -5725,6 +6856,10 @@ strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +stubs@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/stubs/-/stubs-1.1.2.tgz#945a08975016318762f8f7060731002ab2a0960c" + style-search@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" @@ -5923,6 +7058,12 @@ temp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/temp/-/temp-0.4.0.tgz#671ad63d57be0fe9d7294664b3fc400636678a60" +term-size@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" + dependencies: + execa "^0.4.0" + ternary-stream@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" @@ -6002,6 +7143,10 @@ timed-out@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + tiny-lr@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d" @@ -6020,6 +7165,10 @@ title-case@^2.1.0: no-case "^2.2.0" upper-case "^1.0.3" +tmp@0.0.23: + version "0.0.23" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.23.tgz#de874aa5e974a85f0a32cdfdbd74663cb3bd9c74" + tmp@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12" @@ -6030,18 +7179,18 @@ tmp@0.0.27: dependencies: os-tmpdir "~1.0.0" -tmp@0.0.28: - version "0.0.28" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" - dependencies: - os-tmpdir "~1.0.1" - tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" dependencies: os-tmpdir "~1.0.1" +tmp@0.0.31, tmp@0.0.x: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -6095,9 +7244,9 @@ tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" -ts-node@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-2.0.0.tgz#16e4fecc949088238b4cbf1c39c9582526b66f74" +ts-node@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-2.1.0.tgz#aa2bf4b2e25c5fb6a7c54701edc3666d3a9db25d" dependencies: arrify "^1.0.0" chalk "^1.1.1" @@ -6130,22 +7279,32 @@ tsickle@^0.2: source-map "^0.5.6" source-map-support "^0.4.2" -tslint@^3.13.0: - version "3.15.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-3.15.1.tgz#da165ca93d8fdc2c086b51165ee1bacb48c98ea5" +tslint-no-unused-var@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tslint-no-unused-var/-/tslint-no-unused-var-0.0.6.tgz#e1ab1001bba656e77c0eac285f9354ca5f30bf6a" + +tslint@^4.4.2: + version "4.5.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.5.1.tgz#05356871bef23a434906734006fc188336ba824b" dependencies: + babel-code-frame "^6.20.0" colors "^1.1.2" - diff "^2.2.1" + diff "^3.0.1" findup-sync "~0.3.0" - glob "^7.0.3" + glob "^7.1.1" optimist "~0.6.0" resolve "^1.1.7" - underscore.string "^3.3.4" + tsutils "^1.1.0" + update-notifier "^2.0.0" tsscmp@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97" +tsutils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.1.0.tgz#94e0c267624eeb1b63561ba8ec0bcff71b4e2872" + tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -6160,14 +7319,14 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.10, type-is@~1.6.6: +type-is@~1.6.10, type-is@~1.6.14, type-is@~1.6.6: version "1.6.14" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" dependencies: media-typer "0.3.0" mime-types "~2.1.13" -typedarray@^0.0.6: +typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -6179,7 +7338,7 @@ typescript@~2.0.10: version "2.0.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.0.10.tgz#ccdd4ed86fd5550a407101a0814012e1b3fac3dd" -uglify-js@2.7.x, uglify-js@^2.6, uglify-js@^2.7.5: +uglify-js@2.7.x, uglify-js@^2.6: version "2.7.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" dependencies: @@ -6188,6 +7347,14 @@ uglify-js@2.7.x, uglify-js@^2.6, uglify-js@^2.7.5: uglify-to-browserify "~1.0.0" yargs "~3.10.0" +uglify-js@^2.8.7: + version "2.8.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.7.tgz#e0391911507b6d2e05697a528f1686e90a11b160" + dependencies: + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -6223,7 +7390,7 @@ underscore-contrib@~0.3.0: dependencies: underscore "1.6.0" -underscore.string@3.3.4, underscore.string@^3.3.4: +underscore.string@3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" dependencies: @@ -6242,6 +7409,12 @@ unique-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + universal-analytics@^0.3.9: version "0.3.11" resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.3.11.tgz#512879193a12a66dcbd9185121389bab913cd4b6" @@ -6255,10 +7428,14 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -unzip-response@^1.0.2: +unzip-response@^1.0.0, unzip-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + unzip@~0.1.9: version "0.1.11" resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0" @@ -6295,6 +7472,19 @@ update-notifier@^1.0.1: semver-diff "^2.0.0" xdg-basedir "^2.0.0" +update-notifier@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + lazy-req "^2.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + upper-case-first@^1.1.0, upper-case-first@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" @@ -6329,11 +7519,12 @@ user-home@^2.0.0: dependencies: os-homedir "^1.0.0" -useragent@^2.1.10: - version "2.1.11" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.11.tgz#6a026e6a6c619b46ca7a0b2fdef6c1ac3da8ca29" +useragent@^2.1.12: + version "2.1.12" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.12.tgz#aa7da6cdc48bdc37ba86790871a7321d64edbaa2" dependencies: lru-cache "2.2.x" + tmp "0.0.x" util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -6347,7 +7538,7 @@ uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0: +uuid@^3.0.0, uuid@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" @@ -6507,7 +7698,7 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@1, which@^1.2.1, which@^1.2.12, which@^1.2.9: +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.12, which@^1.2.8, which@^1.2.9: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: @@ -6602,7 +7793,14 @@ write-file-stdout@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/write-file-stdout/-/write-file-stdout-0.0.2.tgz#c252d7c7c5b1b402897630e3453c7bfe690d9ca1" -ws@1.1.1, ws@^1.0.1: +ws@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" dependencies: @@ -6619,6 +7817,10 @@ xdg-basedir@^2.0.0: dependencies: os-homedir "^1.0.0" +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" @@ -6680,7 +7882,7 @@ yargs@^1.2.6: version "1.3.3" resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.3.3.tgz#054de8b61f22eefdb7207059eaef9d6b83fb931a" -yargs@^3.28.0, yargs@^3.32.0, yargs@^3.5.4: +yargs@^3.10.0, yargs@^3.28.0, yargs@^3.32.0, yargs@^3.5.4: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" dependencies: