From 787a6447c3a6fdc306fc0f5aed6f7d2631b0f7c5 Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Wed, 8 Mar 2017 10:31:25 -0800 Subject: [PATCH] Sync to master (#3505) * fix(focus-trap): enabled property not being coerced (#3417) * docs(autocomplete): fix a11y of autocomplete example * docs(autocomplete): add guidance about filter criteria * fix(ripple): fade-out-all should hide all ripples (#3400) * fix(checkbox): show checkbox animation only if user click or indeterminate state (#3137) Fixes #2783 * feat(checkbox): add value attribute to md-checkbox (#2701) Fixes #2583 * fix(radio): add focus indication (#3402) Fixes #3102 * fix(autocomplete): remove max width for autocomplete panel (#3297) Fixes #3198 * fix(button-toggle): fix color for selected button toggle and selected disabled button toggle (#3418) Fixes #3382 * fix(input): make icons in prefix/suffix the right size (#3342) * refactor(focus-origin-monitor): complete stream when stopping monitor (#3404) * docs(dialog): update dialog afterClosed (#3411) * docs(progress-spinner): fix typo in progress spinner example (#3299) Fixes #3148 * fix(checkbox): add focus indication (#3403) Fixes #3102 * feat(ripple): add way to globally disable ripples (#3383) * refactor: consistent module declaration (#3095) * fix(focus-trap): avoid closure compiler issues when adding anchors (#3448) * chore(menu): switch menu-item to common coercion logic (#3065) * `MdMenuItem` to use the common coercion logic when determining the disabled state. * Gets rid of the `@HostBinding` in favor of passing them through the `host` option. Relates to #2985. * fix(list-key-manager): exception when no initial active item (#3431) * fix(list-key-manager): exception when no initial active item Fixes an exception that is thrown when the user presses a key on ListKeyManager that doesn't have a default active item. The problem was due to the fact that we have a check for `null` a little bit down, that handles cases like this, however the active index is `undefined` by default. Fixes #3317. * fix: it it * fix(focus-trap): exception when element contains SVG on IE (#3432) Fixes an exception being thrown by the focus trap, if it contains an SVG element on IE. The problem was that on IE, SVG elements don't have the `children` property, which means that we have to fall back to `childNodes`. Fixes #3410. * fix(select): initial value not being displayed with FormControl and OnPush (#3434) * fix(select): initial value not being displayed with FormControl and OnPush Fixes the initial value not being displayed in a select that has a `FormControl` and is placed in a component with `ChangeDetectionStrategy.onPush`. Relates to https://github.com/angular/material2/issues/2269#issuecomment-283521375. * chore: remove unused properties * build: run tslint on tool files (#3436) * Since we had a lot of TSLint issues on our tooling scripts & tasks, we should run TSLint on those as well. * Also updates Dgeni to latest version, because it now supports TypeScript typings. * build: upgrade dev dependencies (#3440) * Upgrades outdated devDependencies to the latest version. * feat(data-table): initial prototype with sorting --- package.json | 28 +- .../autocomplete/autocomplete-demo.ts | 3 +- src/demo-app/checkbox/checkbox-demo.html | 3 +- src/demo-app/input/input-demo.html | 9 +- .../autocomplete-overview-example.ts | 3 +- .../progress-spinner-configurable-example.ts | 2 +- src/lib/autocomplete/autocomplete.md | 18 +- src/lib/autocomplete/autocomplete.scss | 5 +- src/lib/autocomplete/index.ts | 6 +- .../button-toggle/_button-toggle-theme.scss | 6 +- src/lib/button-toggle/button-toggle.spec.ts | 11 +- src/lib/button-toggle/button-toggle.ts | 66 +- src/lib/button-toggle/index.ts | 32 + src/lib/button/button.spec.ts | 2 +- src/lib/button/button.ts | 38 +- src/lib/button/index.ts | 47 + src/lib/card/card.ts | 39 - src/lib/card/index.ts | 56 + src/lib/checkbox/checkbox.html | 2 +- src/lib/checkbox/checkbox.spec.ts | 55 +- src/lib/checkbox/checkbox.ts | 122 +- src/lib/checkbox/index.ts | 23 + src/lib/chips/chip-list.ts | 17 - src/lib/chips/index.ts | 21 + src/lib/core/a11y/focus-trap.spec.ts | 110 +- src/lib/core/a11y/focus-trap.ts | 34 +- src/lib/core/a11y/list-key-manager.spec.ts | 10 + src/lib/core/a11y/list-key-manager.ts | 2 +- .../core/compatibility/compatibility.spec.ts | 2 +- src/lib/core/platform/index.ts | 7 +- src/lib/core/ripple/index.ts | 4 +- src/lib/core/ripple/ripple-ref.ts | 8 + src/lib/core/ripple/ripple-renderer.ts | 29 +- src/lib/core/ripple/ripple.spec.ts | 122 +- src/lib/core/ripple/ripple.ts | 11 +- src/lib/core/selection/index.ts | 4 +- src/lib/core/style/focus-origin-monitor.ts | 13 +- src/lib/core/style/index.ts | 7 +- src/lib/core/theming/_palette.scss | 6 + src/lib/dialog/dialog.md | 4 +- src/lib/grid-list/grid-list.spec.ts | 2 +- src/lib/grid-list/grid-list.ts | 40 +- src/lib/grid-list/index.ts | 41 + src/lib/icon/icon.spec.ts | 2 +- src/lib/icon/icon.ts | 23 +- src/lib/icon/index.ts | 24 + src/lib/input/index.ts | 11 +- src/lib/input/input-container.scss | 10 +- src/lib/list/index.ts | 53 + src/lib/list/list.spec.ts | 2 +- src/lib/list/list.ts | 60 +- src/lib/menu/index.ts | 25 + src/lib/menu/menu-item.ts | 38 +- src/lib/menu/menu.spec.ts | 2 +- src/lib/menu/menu.ts | 23 - src/lib/progress-bar/index.ts | 22 + src/lib/progress-bar/progress-bar.spec.ts | 2 +- src/lib/progress-bar/progress-bar.ts | 28 +- src/lib/progress-spinner/index.ts | 42 +- src/lib/progress-spinner/progress-circle.ts | 4 - .../progress-spinner/progress-spinner.spec.ts | 2 +- src/lib/progress-spinner/progress-spinner.ts | 30 - src/lib/radio/index.ts | 29 + src/lib/radio/radio.html | 1 - src/lib/radio/radio.spec.ts | 54 +- src/lib/radio/radio.ts | 93 +- src/lib/select/index.ts | 6 +- src/lib/select/select.spec.ts | 47 +- src/lib/select/select.ts | 15 +- src/lib/sidenav/index.ts | 24 + src/lib/sidenav/sidenav.spec.ts | 2 +- src/lib/sidenav/sidenav.ts | 23 +- src/lib/slide-toggle/index.ts | 25 + src/lib/slide-toggle/slide-toggle.spec.ts | 6 +- src/lib/slide-toggle/slide-toggle.ts | 31 +- src/lib/slider/index.ts | 25 + src/lib/slider/slider.spec.ts | 2 +- src/lib/slider/slider.ts | 31 +- src/lib/snack-bar/index.ts | 2 + src/lib/tabs/index.ts | 36 + src/lib/tabs/tab-body.spec.ts | 2 +- src/lib/tabs/tab-group.spec.ts | 2 +- src/lib/tabs/tab-group.ts | 38 +- src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts | 2 +- src/lib/tabs/tab-nav-bar/tab-nav-bar.ts | 9 +- src/lib/toolbar/index.ts | 21 + src/lib/toolbar/toolbar.spec.ts | 2 +- src/lib/toolbar/toolbar.ts | 19 - src/lib/tooltip/index.ts | 23 + src/lib/tooltip/tooltip.spec.ts | 2 +- src/lib/tooltip/tooltip.ts | 23 +- tools/gulp/tasks/docs.ts | 27 +- tools/gulp/tasks/e2e.ts | 2 +- tools/gulp/tasks/lint.ts | 2 +- tools/gulp/tasks/screenshots.ts | 14 +- tools/gulp/util-functions.ts | 6 +- yarn.lock | 1496 +++++++++++++++-- 97 files changed, 2641 insertions(+), 974 deletions(-) delete mode 100644 src/lib/progress-spinner/progress-circle.ts 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: