diff --git a/.pullapprove.yml b/.pullapprove.yml new file mode 100644 index 000000000000..8388cb9a8519 --- /dev/null +++ b/.pullapprove.yml @@ -0,0 +1,328 @@ +# Configuration for pullapprove.com +# +# Approval access and primary role is determined by info in the project ownership spreadsheet: +# https://docs.google.com/spreadsheets/d/1oTGX-keDOVNLOmMNIn3IGMvinTrIojSZXWI2dnXkGmQ/edit#gid=0 +# +# === GitHub username to Full name map === +# +# andrewseguin - Andrew Seguin +# crisbeto - Kristiyan Kostadinov +# devversion - Paul Gschwendtner +# jelbourn - Jeremy Elbourn +# josephperrott - Joey Perrott +# kara - Kara Erickson +# mmalerba - Miles Malerba +# tinayuangao - Tina Gao + +version: 2 + +group_defaults: + required: 1 + reset_on_reopened: + enabled: true + approve_by_comment: + enabled: false + +groups: + # If no other groups apply, we at least require approval from a core member + fallback: + conditions: + files: + - '*' + users: + - andrewseguin + - crisbeto + - devversion + - jelbourn + - josephperrott + - kara + - mmalerba + - tinayuangao + + tools-and-config: + conditions: + files: + - 'scripts/*' + - 'test/*' + - 'tools/*' + users: + - devversion # primary + - jelbourn + + cdk: + conditions: + files: + - 'src/cdk/*' + users: + - jelbourn # primary + - mmalerba + + autocomplete: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/autocomplete/*' + - 'src/material-examples/autocomplete-*' + users: + - kara # primary + - jelbourn + + button: + conditions: + files: + include: + - 'src/(demo-app|e2e-app|lib)/button/*' + - 'src/material-examples/button-*' + exclude: + - 'src/material-examples/button-toggle-*' + users: + - tinayuangao # primary + - jelbourn + + button-toggle: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/button-toggle/*' + - 'src/material-examples/button-toggle-*' + users: + - tinayuangao # primary + - jelbourn + + card: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/card/*' + - 'src/material-examples/card-*' + users: + - kara # primary + - jelbourn + + checkbox: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/checkbox/*' + - 'src/material-examples/checkbox-*' + users: + - tinayuangao # primary + - jelbourn + + chips: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/chips/*' + - 'src/material-examples/chips-*' + users: + - tinayuangao # primary + - jelbourn + + data-table: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/table/*' + - 'src/lib/core/table/*' + - 'src/material-examples/table-*' + users: + - andrewseguin # primary + - jelbourn + + datepicker: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/datepicker/*' + - 'src/lib/core/datetime/*' + - 'src/material-examples/datepicker-*' + users: + - mmalerba # primary + - jelbourn + + dialog: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/dialog/*' + - 'src/material-examples/dialog-*' + users: + - jelbourn # primary + - mmalerba + + expansion: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/expansion/*' + - 'src/material-examples/expansion-*' + users: + - josephperrott # primary + - jelbourn + + grid-list: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/grid-list/*' + - 'src/material-examples/grid-list-*' + users: + - kara # primary + - jelbourn + + icon: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/icon/*' + - 'src/material-examples/icon-*' + users: + - jelbourn # primary + - mmalerba + + input: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/input/*' + - 'src/material-examples/input-*' + users: + - mmalerba # primary + - jelbourn + + list: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/list/*' + - 'src/material-examples/list-*' + users: + - kara # primary + - jelbourn + + menu: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/menu/*' + - 'src/material-examples/menu-*' + users: + - kara # primary + - jelbourn + + overlay: + conditions: + files: + - 'src/(demo-app|e2e-app)/overlay/*' + - 'src/lib/core/overlay/*' + - 'src/material-examples/overlay-*' + users: + - jelbourn # primary + - crisbeto + + portal: + conditions: + files: + - 'src/(demo-app|e2e-app)/portal/*' + - 'src/lib/core/portal/*' + - 'src/material-examples/portal-*' + users: + - jelbourn # primary + - mmalerba + + progress: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/progress-(bar|spinner)/*' + - 'src/material-examples/progress-(bar|spinner)-*' + users: + - josephperrott # primary + - jelbourn + + radio: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/radio/*' + - 'src/material-examples/radio-*' + users: + - tinayuangao # primary + - jelbourn + + ripple: + conditions: + files: + - 'src/(demo-app|e2e-app)/ripple/*' + - 'src/lib/core/ripple/*' + - 'src/material-examples/ripple-*' + users: + - devversion # primary + - jelbourn + + select: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/select/*' + - 'src/material-examples/select-*' + users: + - kara # primary + - jelbourn + + sidenav: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/sidenav/*' + - 'src/material-examples/sidenav-*' + users: + - mmalerba # primary + - jelbourn + + slide-toggle: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/slide-toggle/*' + - 'src/material-examples/slide-toggle-*' + users: + - devversion # primary + - jelbourn + + slider: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/slider/*' + - 'src/material-examples/slider-*' + users: + - mmalerba # primary + - jelbourn + + snack-bar: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/snack-bar/*' + - 'src/material-examples/snack-bar-*' + users: + - jelbourn # primary + - mmalerba + + tabs: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/tabs/*' + - 'src/material-examples/tabs-*' + users: + - andrewseguin # primary + - jelbourn + + toolbar: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/toolbar/*' + - 'src/material-examples/toolbar-*' + users: + - devversion # primary + - jelbourn + + tooltip: + conditions: + files: + - 'src/(demo-app|e2e-app|lib)/tooltip/*' + - 'src/material-examples/tooltip-*' + users: + - andrewseguin # primary + - jelbourn + + typography: + conditions: + files: + - 'src/(demo-app|e2e-app)/typography/*' + - 'src/lib/core/typography/*' + - 'src/material-examples/typography-*' + users: + - crisbeto # primary + - jelbourn diff --git a/CHANGELOG.md b/CHANGELOG.md index c0eeb3c979ab..0074dd4528f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,73 @@ + +# [2.0.0-beta.8 plasma-abacus](https://github.com/angular/material2/compare/2.0.0-beta.7...2.0.0-beta.8) (2017-07-06) + + +### Highlights +* This version marks the release of `@angular/cdk` (component dev kit)! This package contains +general building blocks for UI components decoupled from the visuals of Material Design. In the +initial release, code from Angular Material's `core/` have been moved for `a11y/`, `bidi/`, +`coercion/`, `observe-content/`, `platform/`, `portal/`. The `@angular/material` package now +re-exports these symbols, marked as deprecated. The re-exports will be removed in a subsequent +release. +* Initial version of data-table component. There is both a `` (the core) and the +`` (with Material Design styles). See the documentation on material.angular.io for more +information. +* Initial version of `` and `` components, which can be used either +with `` or any other table. +* Both `@angular/material` and `@angular/cdk` are now strict null compliant. + + +### Breaking changes +* `@angular/material` now depends on `@angular/cdk` as a peer dependency. +* Some types have expanded to include `| null` or `| undefined` for strict null compatibility. If +your application uses strict null checks, you may have to update the types in your app to match up +with the more accurate types coming from Angular Material. +* Angular Material no longer adds RxJS operators to the prototype of `Observable`. If your app +depended on these operators being added by Angular Material, you will need to import them +explicitly. + + +### Bug Fixes + +* **autocomplete:** allow number zero as value ([#5364](https://github.com/angular/material2/issues/5364)) ([9137fd9](https://github.com/angular/material2/commit/9137fd9)), closes [#5363](https://github.com/angular/material2/issues/5363) +* **autocomplete:** don't scroll panel when option is visible ([#4905](https://github.com/angular/material2/issues/4905)) ([d3af57d](https://github.com/angular/material2/commit/d3af57d)) +* **autocomplete:** not closing when tapping away on mobile ([#5260](https://github.com/angular/material2/issues/5260)) ([1dcaca7](https://github.com/angular/material2/commit/1dcaca7)) +* **autocomplete:** reopening when clicking an option in IE ([#5172](https://github.com/angular/material2/issues/5172)) ([fe31210](https://github.com/angular/material2/commit/fe31210)), closes [#5165](https://github.com/angular/material2/issues/5165) +* **autosize:** resize when form value changes. Fixes [#4657](https://github.com/angular/material2/issues/4657) ([#5315](https://github.com/angular/material2/issues/5315)) ([8c9c11a](https://github.com/angular/material2/commit/8c9c11a)) +* **button-toggle:** fix standalone button toggle style ([#5121](https://github.com/angular/material2/issues/5121)) ([3d8c833](https://github.com/angular/material2/commit/3d8c833)) +* **datepicker:** pass layout direction to touchUi dialog ([#5052](https://github.com/angular/material2/issues/5052)) ([8b6efb1](https://github.com/angular/material2/commit/8b6efb1)) +* **datepicker:** use theme foreground color ([#5290](https://github.com/angular/material2/issues/5290)) ([51bf26e](https://github.com/angular/material2/commit/51bf26e)) +* **dialog:** set aria-labelledby based on the md-dialog-title ([#5178](https://github.com/angular/material2/issues/5178)) ([aee984a](https://github.com/angular/material2/commit/aee984a)) +* **directionality:** error on platform-server ([#5234](https://github.com/angular/material2/issues/5234)) ([49dfe60](https://github.com/angular/material2/commit/49dfe60)) +* **input:** theming mixin error ([#5254](https://github.com/angular/material2/issues/5254)) ([37efb54](https://github.com/angular/material2/commit/37efb54)), closes [#5232](https://github.com/angular/material2/issues/5232) +* **input:** underline showing at end if text-align is set ([#5280](https://github.com/angular/material2/issues/5280)) ([5c9391d](https://github.com/angular/material2/commit/5c9391d)), closes [#5272](https://github.com/angular/material2/issues/5272) +* **memory:** Unsubscribe event listeners when using Observable.fromEvent ([#5325](https://github.com/angular/material2/issues/5325)) ([1b351cd](https://github.com/angular/material2/commit/1b351cd)) +* **menu:** role being set on the wrong element ([#5191](https://github.com/angular/material2/issues/5191)) ([2239668](https://github.com/angular/material2/commit/2239668)) +* **overlay:** remove webkit tap highlight from backdrop ([#5258](https://github.com/angular/material2/issues/5258)) ([8feddd4](https://github.com/angular/material2/commit/8feddd4)) +* **select:** align first option to trigger when it is inside a group ([#5153](https://github.com/angular/material2/issues/5153)) ([d39cb12](https://github.com/angular/material2/commit/d39cb12)) +* **select:** expose focus method ([#5255](https://github.com/angular/material2/issues/5255)) ([7b2d4ae](https://github.com/angular/material2/commit/7b2d4ae)), closes [#5251](https://github.com/angular/material2/issues/5251) +* **select:** md-optgroup not using typography styles ([#5193](https://github.com/angular/material2/issues/5193)) ([b5bf6f5](https://github.com/angular/material2/commit/b5bf6f5)) +* **select:** page scrolling down when selecting option with space ([#5192](https://github.com/angular/material2/issues/5192)) ([2361385](https://github.com/angular/material2/commit/2361385)) +* **snackbar:** clear timeout upon dismiss ([#4860](https://github.com/angular/material2/issues/4860)) ([146160c](https://github.com/angular/material2/commit/146160c)) +* **tabs:** server-side rendering error ([#5348](https://github.com/angular/material2/issues/5348)) ([0174377](https://github.com/angular/material2/commit/0174377)) +* **unique-selection-dispatcher:** remove listeners on destroy ([#5164](https://github.com/angular/material2/issues/5164)) ([f9bbbe7](https://github.com/angular/material2/commit/f9bbbe7)) + + +### Features + +* **data-table:** initial version. Too many commits to list. +* **directionality:** a provider to get directionality ([#4044](https://github.com/angular/material2/issues/4044)) ([61d979e](https://github.com/angular/material2/commit/61d979e)), closes [#3600](https://github.com/angular/material2/issues/3600) +* **input:** add custom error state matcher ([#4750](https://github.com/angular/material2/issues/4750)) ([f73cc97](https://github.com/angular/material2/commit/f73cc97)) +* **pagination:** initial pagination component ([#5156](https://github.com/angular/material2/issues/5156)) ([85fb00a](https://github.com/angular/material2/commit/85fb00a)) +* **sort:** add ability to manage and display sorting ([#5307](https://github.com/angular/material2/issues/5307)) ([b328d36](https://github.com/angular/material2/commit/b328d36)) +* **tab-nav-bar:** support disabling tab links ([#5257](https://github.com/angular/material2/issues/5257)) ([fc809ed](https://github.com/angular/material2/commit/fc809ed)), closes [#5208](https://github.com/angular/material2/issues/5208) +* add support for strict null checks ([#5094](https://github.com/angular/material2/issues/5094)) ([2bf7024](https://github.com/angular/material2/commit/2bf7024)) +* remove uses of rxjs patch operators ([#5314](https://github.com/angular/material2/issues/5314)) ([e488e3f](https://github.com/angular/material2/commit/e488e3f)), closes [#2622](https://github.com/angular/material2/issues/2622) +* move a11y, bidi, platform, rxjs, and portal to cdk ([#5386](https://github.com/angular/material2/issues/5386)) ([fde35e4](https://github.com/angular/material2/commit/fde35e4)) +* move observe-content to cdk ([#5438](https://github.com/angular/material2/issues/5438)) ([b00f838](https://github.com/angular/material2/commit/b00f838)) + + + # [2.0.0-beta.7 glass-delicatessen](https://github.com/angular/material2/compare/2.0.0-beta.6...2.0.0-beta.7) (2017-06-19) diff --git a/README.md b/README.md index 229f9c66c43e..115598172a57 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,6 @@ This is the home for the Angular team's Material Design components built for and [Contributing](https://github.com/angular/material2/blob/master/CONTRIBUTING.md) | [Plunker Template](http://plnkr.co/edit/o077B6uEiiIgkC0S06dd?p=preview) -### Installation - -The latest release of Angular Material can be installed from npm - -`npm install @angular/material` - -A snapshot build with the latest changes from -[master](https://github.com/angular/material2/tree/master) is also available. -Note that this snapshot build should not be considered stable and may break between releases. - -`npm install --save angular/material2-builds angular/cdk-builds` - ### Getting started See our [Getting Started Guide][getting-started] @@ -44,7 +32,7 @@ label. High level stuff planned for Q3 2017 (July - September): - As many bug fixes as humanly possible - Additional features for data-table -- More accessibility improvements +- Continued accessibility improvements - Nested menus - All components are OnPush - Improved documentation, guides, examples, and navigation on material.angular.io @@ -64,6 +52,7 @@ High level stuff planned for Q3 2017 (July - September): | cards | | [Docs][2] | | checkbox | | [Docs][3] | | chips | Chip-remove, integration with input in-progress | [Docs][26] | +| data-table | Sticky headers & incremental row rendering in-progress | [Docs][28] | | datepicker | | [Docs][25] | | dialog | | [Docs][22] | | expansion-panel | Needs documentation | - | @@ -72,6 +61,7 @@ High level stuff planned for Q3 2017 (July - September): | input | | [Docs][5] | | list | Selection and action list planned Q3 | [Docs][8] | | menu | Nested menu planned Q3 | [Docs][17] | +| paginator | | [Docs][29] | | progress-bar | | [Docs][12] | | progress-spinner | | [Docs][11] | | radio | | [Docs][4] | @@ -81,6 +71,7 @@ High level stuff planned for Q3 2017 (July - September): | slide-toggle | | [Docs][14] | | slider | | [Docs][16] | | snackbar / toast | | [Docs][21] | +| sort-header | | [Docs][30] | | tabs | | [Docs][13] | | textarea | | [Docs][5] | | toolbar | | [Docs][7] | @@ -89,17 +80,16 @@ High level stuff planned for Q3 2017 (July - September): | theming | | [Guide][20] | | typography | | [Guide][27] | | layout | See [angular/flex-layout][lay_rp] | [Wiki][0] | +| cdk | Launched, documentation in-progress | | #### In progress, planned, and non-planned features | Feature | Status | Docs | Issue | |------------------|-------------------------------------|--------------|----------------| -| @angular/cdk | Coming soon | - | | -| data-table | Coming soon | - | [#581][0581] | -| tree | Design in-progress | - | [#3175][3175] | -| stepper | Not started, planned Q3 2017 | - | [#508][0508] | -| sticky-header | Not started, planned Q3 2017 | - | [#474][0474] | +| tree | In-progress ([sneak peak][31]) | - | [#3175][3175] | +| stepper | In-progress, planned Q3 2017 | - | [#508][0508] | +| sticky-header | In-progress, planned Q3 2017 | - | [#474][0474] | | virtual-repeat | Not started, planned Q4 2017 | - | [#823][0823] | | fab speed-dial | Not started, not planned | - | [#860][0860] | | fab toolbar | Not started, not planned | - | - | @@ -134,6 +124,10 @@ High level stuff planned for Q3 2017 (July - September): [25]: https://material.angular.io/components/component/datepicker [26]: https://material.angular.io/components/component/chips [27]: https://material.angular.io/guide/typography +[28]: https://material.angular.io/components/component/table +[29]: https://material.angular.io/components/component/paginator +[30]: https://material.angular.io/components/component/sort +[31]: https://tina-material-tree.firebaseapp.com/simple-tree [0107]: https://github.com/angular/material2/issues/107 [0119]: https://github.com/angular/material2/issues/119 diff --git a/e2e/components/checkbox-e2e.spec.ts b/e2e/components/checkbox-e2e.spec.ts index c42c1abbacc8..2256bf712043 100644 --- a/e2e/components/checkbox-e2e.spec.ts +++ b/e2e/components/checkbox-e2e.spec.ts @@ -10,7 +10,6 @@ describe('checkbox', () => { it('should be checked when clicked, and unchecked when clicked again', async () => { let checkboxEl = element(by.id('test-checkbox')); let inputEl = element(by.css('input[id=input-test-checkbox]')); - let checked: string; screenshot('start'); checkboxEl.click(); diff --git a/e2e/components/icon-e2e.spec.ts b/e2e/components/icon-e2e.spec.ts index 57fea20eabf5..0c17ac1ff1f2 100644 --- a/e2e/components/icon-e2e.spec.ts +++ b/e2e/components/icon-e2e.spec.ts @@ -1,5 +1,4 @@ import {browser, by, element} from 'protractor'; -import {screenshot} from '../screenshot'; describe('icon', () => { diff --git a/e2e/components/input-e2e.spec.ts b/e2e/components/input-e2e.spec.ts index cd3b05425f76..484ed708acbe 100644 --- a/e2e/components/input-e2e.spec.ts +++ b/e2e/components/input-e2e.spec.ts @@ -43,4 +43,14 @@ describe('input', () => { expect(input.getAttribute('value')).toBe('0'); }); }); + + describe('textarea', () => { + beforeEach(() => browser.get('/input')); + + it('should update input value when user types', () => { + let input = element(by.id('text-area')); + input.sendKeys('abc123'); + expect(input.getAttribute('value')).toBe('abc123'); + }); + }); }); diff --git a/e2e/components/menu-e2e.spec.ts b/e2e/components/menu-e2e.spec.ts index 98af13ad9180..4b57e5b93570 100644 --- a/e2e/components/menu-e2e.spec.ts +++ b/e2e/components/menu-e2e.spec.ts @@ -1,4 +1,4 @@ -import {Key, protractor, browser, by, element, ElementFinder} from 'protractor'; +import {Key, protractor, browser, by, element} from 'protractor'; import {screenshot} from '../screenshot'; import { expectToExist, diff --git a/guides/cdk-table.md b/guides/cdk-table.md new file mode 100644 index 000000000000..0b6881d8be65 --- /dev/null +++ b/guides/cdk-table.md @@ -0,0 +1,126 @@ +The `` is an unopinionated, customizable data-table with a fully-templated API, dynamic +columns, and an accessible DOM structure. This component acts as the core upon which anyone can +build their own tailored data-table experience. + +The table provides a foundation upon which other features, such as sorting and pagination, can be +built. Because it enforces no opinions on these matters, developers have full control over the +interaction patterns associated with the table. + +For a Material Design styled table, see the +[documentation for ``](https://material.angular.io/components/table) which builds on +top of the CDK data-table. + + + +### Using the CDK data-table + +#### Writing your table template + +The first step to writing the data-table template is to define the columns. +A column definition is specified via an `` with the `cdkColumnDef` directive, giving +column a name. Each column definition then further defines both a header-cell template +(`cdkHeaderCellDef`) and a data-cell template (`cdkCellDef`). + + +```html + + User name + {{row.a}} + +``` + +The set of columns defined represent the columns that are _available_ to be rendered. The specific +columns rendered in a given row, and their order, are specified on the row (see below). + +Note that `cdkCellDef` exports the row context such that the row data can be referenced in the cell +template. The directive also exports the same properties as `ngFor` (index, even, odd, first, +last). + +The next step is to define the table's header-row (`cdkHeaderRowDef`) and data-row (`cdkRowDef`). + +```html + + +``` + +These row templates accept the specific columns to be rendered via the name given to the +`cdkColumnDef`. + + +The `cdkRowDef` also exports row context, which can be used for event and property +bindings on the row element. Any content placed _inside_ of the header row or data row template +will be ignored, as the rendered content of the row comes from the cell templates described +above. + + +##### Example: table with three columns +```html + + + + User name + {{row.username}} + + + + + Age + {{row.age}} + + + + + Title + {{row.title}} + + + + + + +``` + +The columns given on the row determine which cells are rendered and in which order. Thus, the +columns can be set via binding to support dynamically changing the columns shown at run-time. + + +It is not required to display all the columns that are defined within the template, +nor use the same ordering. For example, to display the table with only `age` +and `username` and in that order, then the row and header definitions would be written as: + +```html + +``` + +Event and property bindings can be added directly to the row element. + +##### Example: table with event and class binding +```html + + + + = 18” + (click)=”handleRowClick(row)”> + +``` + +#### Connecting the table to a data source +Data is provided to the table through a `DataSource`. When the table receives a data source, +it calls the DataSource's connect function which returns an observable that emits an array of data. +Whenever the data source emits data to this stream, the table will update. + +Because the _data source_ provides this stream, it bears the responsibility of triggering table +updates. This can be based on _anything_: websocket connections, user interaction, model updates, +time-based intervals, etc. Most commonly, updates will be triggered by user interactions like +sorting and pagination. + +##### `trackBy` +To improve performance, a trackBy function can be provided to the table similar to Angular’s +[`ngFor` trackBy](https://angular.io/api/common/NgForOf#change-propagation). This informs the +table how to uniquely identify rows to track how the data changes with each update. + +```html + +``` diff --git a/guides/getting-started.md b/guides/getting-started.md index 48e4c5ddfcb9..d8de32789ceb 100644 --- a/guides/getting-started.md +++ b/guides/getting-started.md @@ -3,10 +3,16 @@ For help getting started with a new Angular app, check out the For existing apps, follow these steps to begin using Angular Material. -## Step 1: Install Angular Material +## Step 1: Install Angular Material and Angular CDK ```bash -npm install --save @angular/material +npm install --save @angular/material @angular/cdk +``` + +A snapshot build with the latest changes from master is also available. Note that this snapshot build should not be considered stable and may break between releases. + +```bash +npm install --save angular/material2-builds angular/cdk-builds ``` ## Step 2: Animations @@ -79,13 +85,14 @@ Whichever approach you use, be sure to import the Angular Material modules _afte Including a theme is **required** to apply all of the core and theme styles to your application. -To get started with a prebuilt theme, include the following in your app's index.html: - -```html - +To get started with a prebuilt theme, include one of Angular Material's prebuilt themes globally +in your application. If you're using the Angular CLI, you can add this to your `styles.css`: +```css +@import "~@angular/material/prebuilt-themes/indigo-pink.css"; ``` -Note that your app's project structure may have a different relative location for your node_modules. +If you are not using the Angular CLI, you can include a prebuilt theme via a `` element in +your `index.html`. For more information on theming and instructions on how to create a custom theme, see the [theming guide](./theming.md). @@ -142,6 +149,6 @@ System.config({ ``` -## Sample Angular Material projects -- [Material Sample App](https://github.com/jelbourn/material2-app) -- [Angular Connect 2016 Demo](https://github.com/kara/leashed-in) +## Example Angular Material projects +- [material.angular.io](https://material.angular.io) - +We build our own documentation with Angular Material! diff --git a/package-lock.json b/package-lock.json index 46a7ae2b4162..8e320be01cf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,9 +69,9 @@ "dev": true }, "@google-cloud/common": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.3.tgz", - "integrity": "sha1-1z7j+lEfKf+8xEZniYaFcJ6f7Iw=", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.4.tgz", + "integrity": "sha1-dbt/YJMc/J2U2gtdQIlQ0Lvw6Xk=", "dev": true }, "@google-cloud/functions-emulator": { @@ -81,6 +81,13 @@ "dev": true, "optional": true, "dependencies": { + "@google-cloud/storage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.1.1.tgz", + "integrity": "sha1-ZZC1zm53lVbJzHBDvWRJ1rwHgd4=", + "dev": true, + "optional": true + }, "ajv": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.1.6.tgz", @@ -88,6 +95,13 @@ "dev": true, "optional": true }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "optional": true + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -95,6 +109,13 @@ "dev": true, "optional": true }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -125,6 +146,34 @@ "dev": true, "optional": true }, + "gcp-metadata": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.1.0.tgz", + "integrity": "sha1-q+IfHqMk3Qs0o/BsqBdj+x7uN9k=", + "dev": true, + "optional": true + }, + "gcs-resumable-upload": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.7.7.tgz", + "integrity": "sha1-2clyWvlwu8hsvwr+8kBtwizpGGQ=", + "dev": true, + "optional": true + }, + "google-auto-auth": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.6.1.tgz", + "integrity": "sha1-wF2CDpRUc57PKKiJLuqz0WJPLLM=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -146,6 +195,13 @@ "dev": true, "optional": true }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true, + "optional": true + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -160,10 +216,33 @@ "dev": true, "optional": true }, + "retry-request": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-1.3.2.tgz", + "integrity": "sha1-Wa0k5x+K4/MS1fe0vPRnpeWle9Y=", + "dev": true, + "optional": true, + "dependencies": { + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.76.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz", + "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=", + "dev": true, + "optional": true + } + } + }, "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", + "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", "dev": true, "optional": true, "dependencies": { @@ -173,6 +252,13 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, "optional": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "optional": true } } }, @@ -190,6 +276,13 @@ "dev": true, "optional": true }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + }, "uuid": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", @@ -207,9 +300,9 @@ } }, "@google-cloud/storage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.1.1.tgz", - "integrity": "sha1-ZZC1zm53lVbJzHBDvWRJ1rwHgd4=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.2.0.tgz", + "integrity": "sha1-dO6TaJbaXkU8NBzygEQ0LBqazrc=", "dev": true }, "@types/chalk": { @@ -267,9 +360,9 @@ "dev": true }, "@types/node": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.32.tgz", - "integrity": "sha512-7+0Ai8r8Xt6NNVM0Eo+XSqiZsBUYXg2yrCwyBhQzSfFHTGQWzFv/pk9106vPR8HWjKmGK+zzUj244POs4xfO2g==", + "version": "7.0.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.33.tgz", + "integrity": "sha512-8fVvl6Yyk3jZvSYxRMS9/AmZJ5RXCOP9N4xSlykyBViVESu751pxHYTN14Embn1Fem78YwEHdC7p7KGQQpwunw==", "dev": true }, "@types/orchestrator": { @@ -290,12 +383,6 @@ "integrity": "sha1-atD3ODE24TklMi5p/EHbd7MLIHU=", "dev": true }, - "@types/rx": { - "version": "2.5.33", - "resolved": "https://registry.npmjs.org/@types/rx/-/rx-2.5.33.tgz", - "integrity": "sha1-GGf0rJjldCj+grKE0agMnB9hG7c=", - "dev": true - }, "@types/selenium-webdriver": { "version": "2.53.42", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz", @@ -526,9 +613,9 @@ "dev": true }, "arr-flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "array-differ": { @@ -653,9 +740,9 @@ "dev": true }, "async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz", - "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", "dev": true }, "async-each": { @@ -701,9 +788,9 @@ "dev": true }, "axe-webdriverjs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/axe-webdriverjs/-/axe-webdriverjs-1.1.2.tgz", - "integrity": "sha1-YURZFaM6D2lkzSNl34FUbOlKtBs=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axe-webdriverjs/-/axe-webdriverjs-1.1.3.tgz", + "integrity": "sha1-lIqXLk0OJSa0HGCptEBkkyu24G8=", "dev": true }, "babel-code-frame": { @@ -837,15 +924,7 @@ "version": "1.17.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", - "dev": true, - "dependencies": { - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - } - } + "dev": true }, "boom": { "version": "2.10.1", @@ -906,9 +985,9 @@ "dev": true }, "browserstacktunnel-wrapper": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.4.2.tgz", - "integrity": "sha1-ZZj7fXhLb/NI4998EEsNnCfqUnU=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-2.0.1.tgz", + "integrity": "sha1-/+GRDW45/oZhgYPoJmkAQa9T7a4=", "dev": true }, "buffer-crc32": { @@ -991,9 +1070,9 @@ "dev": true }, "caniuse-db": { - "version": "1.0.30000693", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000693.tgz", - "integrity": "sha1-hRDnqasErcyiOl3O+jTfnSjBziA=", + "version": "1.0.30000697", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000697.tgz", + "integrity": "sha1-IM5qnO7vTvShXcjoDy6PuQSejXc=", "dev": true }, "canonical-path": { @@ -1009,9 +1088,9 @@ "dev": true }, "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "catharsis": { @@ -1069,9 +1148,9 @@ "dev": true }, "clean-css": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.4.tgz", - "integrity": "sha1-7siBHbJ0V+AHjYypIfqBty+oK/Q=", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.5.tgz", + "integrity": "sha1-0JqHoCpTdRF1iXlq52oGPKzbVBo=", "dev": true }, "cli-boxes": { @@ -1171,12 +1250,24 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true + }, "color-diff": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", "dev": true }, + "color-name": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz", + "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=", + "dev": true + }, "colorguard": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/colorguard/-/colorguard-1.2.0.tgz", @@ -1235,9 +1326,9 @@ "dev": true }, "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, "commondir": { @@ -2268,9 +2359,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz", - "integrity": "sha1-ZK8Pnv08PGrNV9cfg7Scp+6cS0M=", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz", + "integrity": "sha1-CDl5NIkcvPrrvRi4KpW1pIETg2k=", "dev": true }, "encodeurl": { @@ -2616,16 +2707,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=", "dev": true, - "optional": true, - "dependencies": { - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - } - } + "optional": true }, "express-session": { "version": "1.11.3", @@ -2866,107 +2948,128 @@ "dev": true, "dependencies": { "base64url": { - "version": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=", "dev": true }, "buffer-equal-constant-time": { - "version": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", "dev": true }, "dom-storage": { - "version": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.0.2.tgz", "integrity": "sha1-7RfL9oq9EOCu+BgnE+KXxeS1ALA=", "dev": true }, "ecdsa-sig-formatter": { - "version": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", "dev": true }, "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", "dev": true }, "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, "isemail": { - "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", "dev": true }, "joi": { - "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", "dev": true }, "jsonwebtoken": { - "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz", "integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=", "dev": true }, "jwa": { - "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", "dev": true }, "jws": { - "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", "dev": true }, "lodash.once": { - "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", "dev": true }, "moment": { - "version": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", "dev": true }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "promise-polyfill": { - "version": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz", "integrity": "sha1-2chtPcTcLfkBboiUbe/Wm0m0EWI=", "dev": true }, "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", - "integrity": "sha1-/kyEYDl/nqqqWOc75GJzQIpF4iM=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", + "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==", "dev": true }, "topo": { - "version": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", "dev": true }, "websocket-driver": { - "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true }, "websocket-extensions": { - "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", "dev": true }, "xmlhttprequest": { - "version": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", "dev": true }, "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true } @@ -2979,107 +3082,128 @@ "dev": true, "dependencies": { "@types/jsonwebtoken": { - "version": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.0.tgz", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.0.tgz", "integrity": "sha1-D+0yyFAdqArJg50tQDplyD13b/0=", "dev": true }, "@types/node": { - "version": "https://registry.npmjs.org/@types/node/-/node-7.0.18.tgz", + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.18.tgz", "integrity": "sha1-zWfyfT3Az7dG8L3V4IbExdVb4XM=", "dev": true }, "base64url": { - "version": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=", "dev": true }, "buffer-equal-constant-time": { - "version": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", "dev": true }, "ecdsa-sig-formatter": { - "version": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", "dev": true }, "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", "dev": true }, "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, "isemail": { - "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", "dev": true }, "joi": { - "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", "dev": true }, "jsonwebtoken": { - "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz", "integrity": "sha1-hHgE5SWL7FqUmajcSl56O64I1Yo=", "dev": true }, "jwa": { - "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", "dev": true }, "jws": { - "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", "dev": true }, "lodash.once": { - "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", "dev": true }, "moment": { - "version": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", "dev": true }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", "dev": true }, "node-forge": { - "version": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", "dev": true }, "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", "dev": true }, "topo": { - "version": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", "dev": true }, "websocket-driver": { - "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true }, "websocket-extensions": { - "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", "dev": true }, "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true } @@ -3118,17 +3242,20 @@ "dev": true, "dependencies": { "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", "dev": true, "dependencies": { "websocket-driver": { - "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.5.2.tgz", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.5.2.tgz", "integrity": "sha1-jHyF2gcTtAYFVrTXHAF3XuEmnrk=", "dev": true, "dependencies": { "websocket-extensions": { - "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", "dev": true } @@ -3168,12 +3295,6 @@ "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", "dev": true }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - }, "winston": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/winston/-/winston-1.1.2.tgz", @@ -3327,9 +3448,9 @@ "dev": true, "dependencies": { "jsonfile": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.0.tgz", - "integrity": "sha1-kufHRE5f/V+jLmqa6LhQNN+DR9A=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "dev": true } } @@ -4036,31 +4157,75 @@ "dev": true }, "gcp-metadata": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.1.0.tgz", - "integrity": "sha1-q+IfHqMk3Qs0o/BsqBdj+x7uN9k=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.2.0.tgz", + "integrity": "sha1-Ytr8pl86YxvIzi7Dt3Zh9fk4ego=", + "dev": true + }, + "gcs-resumable-upload": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.8.0.tgz", + "integrity": "sha1-023swVIzRGCC249J4hAndE80+CQ=", "dev": true, "dependencies": { - "request": { - "version": "2.76.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz", - "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=", + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "gcp-metadata": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.1.0.tgz", + "integrity": "sha1-q+IfHqMk3Qs0o/BsqBdj+x7uN9k=", + "dev": true + }, + "google-auto-auth": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.6.1.tgz", + "integrity": "sha1-wF2CDpRUc57PKKiJLuqz0WJPLLM=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", "dev": true }, "retry-request": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-1.3.2.tgz", "integrity": "sha1-Wa0k5x+K4/MS1fe0vPRnpeWle9Y=", + "dev": true, + "dependencies": { + "request": { + "version": "2.76.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz", + "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "dev": true } } }, - "gcs-resumable-upload": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.7.7.tgz", - "integrity": "sha1-2clyWvlwu8hsvwr+8kBtwizpGGQ=", - "dev": true - }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -4151,7 +4316,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true }, "glob-base": { @@ -4363,9 +4528,9 @@ "dev": true }, "google-auto-auth": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.6.1.tgz", - "integrity": "sha1-wF2CDpRUc57PKKiJLuqz0WJPLLM=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.1.tgz", + "integrity": "sha1-yCYERJEt2M7szYOHYdVvRik3vQI=", "dev": true }, "google-closure-compiler": { @@ -5421,9 +5586,9 @@ } }, "gulp-clean-css": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.4.2.tgz", - "integrity": "sha1-BDh+F6iKoPKdiO2vyhZAPbsQbV0=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.5.0.tgz", + "integrity": "sha1-1D50fEGVeZXsSbuWEvhitkMp8bA=", "dev": true }, "gulp-cli": { @@ -5847,9 +6012,9 @@ "dev": true }, "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true }, "has-ansi": { @@ -5891,16 +6056,16 @@ "dev": true }, "has-symbol-support-x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.2.0.tgz", - "integrity": "sha1-5iTq1RkMNbNOTimTRN/2Q32wLOI=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.3.0.tgz", + "integrity": "sha512-kLtS+N9qwz+Buc6TUfcW5iGb59hLLr5qfxTACi/0uGpH1u5NMNWsdU57KoYRBywvPykeRmu5qfB5x0chpDSWlg==", "dev": true, "optional": true }, "has-to-string-tag-x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.2.0.tgz", - "integrity": "sha1-xTbcTbvr4b6dKPYk/TIPeTEp/VM=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.3.0.tgz", + "integrity": "sha512-Fu9Nwv8/VNJMvKjkldzXHO+yeX+TCelwUQ9dGW2LrAfHfHi6zVqQt+Qjilf0qGHvpl6Fap6o8aDhWhMt5hY/1g==", "dev": true, "optional": true }, @@ -5959,9 +6124,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", - "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, "html-encoding-sniffer": { @@ -5976,18 +6141,24 @@ "integrity": "sha1-1zvD/0SJQkCIGM5gm/P7DqfvTrc=", "dev": true, "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true + }, "uglify-js": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.19.tgz", - "integrity": "sha512-/MRnHKKJemMVs4iKmiUZY8S0knDRFOJI9Ein/rdn0w9hrK8ELdj+6bjWmHeBjSDPGUWxi/4960A+GAWZbzHvDA==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.23.tgz", + "integrity": "sha512-miLHbO2QcdQGxL/q1wLcUr6TGIRHhMnpKyywUbAdZRkJMqCeZCDmBsgYu1Wlj26xHBXN+sU5tHaWh38QsN208g==", "dev": true } } }, "html-tags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz", - "integrity": "sha1-x43mW1Zjqll5id0rerSSANfk25g=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", "dev": true }, "htmlparser2": { @@ -6057,6 +6228,12 @@ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", "dev": true }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true + }, "mkdirp": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", @@ -6151,9 +6328,9 @@ "optional": true }, "irregular-plurals": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.2.0.tgz", - "integrity": "sha1-OPKZg0uowAwwvpxVThNyaXUv86w=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz", + "integrity": "sha512-njf5A+Mxb3kojuHd1DzISjjIl+XhyzovXEOyPPSzdQozq/Lf2tN27mOrAAsxEPZxpn6I4MGzs1oo9TxXxPFpaA==", "dev": true }, "is": { @@ -6315,9 +6492,9 @@ "dev": true, "dependencies": { "isobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz", - "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } @@ -6523,9 +6700,9 @@ } }, "isurl": { - "version": "1.0.0-alpha6", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0-alpha6.tgz", - "integrity": "sha1-nfC4R3hmqkJdBGvo+7Qp5ktbiRU=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "optional": true }, @@ -6572,9 +6749,9 @@ "dev": true }, "js-tokens": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, "js-yaml": { @@ -6625,9 +6802,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.0.tgz", - "integrity": "sha1-ABbAscoe/kbUTTdUG838Gdz64Ns=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true, "optional": true }, @@ -6794,23 +6971,15 @@ } }, "karma-browserstack-launcher": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-1.2.0.tgz", - "integrity": "sha1-rPpTSDW6WQBB7vAJwRaaIZEgu1s=", - "dev": true, - "dependencies": { - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - } - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-1.3.0.tgz", + "integrity": "sha512-LrPf5sU/GISkEElWyoy06J8x0c8BcOjjOwf61Wqu6M0aWQu0Eoqm9yh3xON64/ByST/CEr0GsWiREQ/EIEMd4Q==", + "dev": true }, "karma-chrome-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", - "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "dev": true }, "karma-coverage": { @@ -7445,9 +7614,9 @@ } }, "mathml-tag-names": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.0.tgz", - "integrity": "sha1-7uYVESorEn5w9VjWnJ6+FAdlA9c=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz", + "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=", "dev": true }, "media-typer": { @@ -7497,9 +7666,9 @@ "dev": true }, "merge2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.0.3.tgz", - "integrity": "sha1-+kT4siYmFaty8ICKQB1HinDjlNs=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.1.0.tgz", + "integrity": "sha1-mfsys16frYQBRgBOE6VrdUmlJNs=", "dev": true }, "methmeth": { @@ -7877,12 +8046,6 @@ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", "dev": true }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -7890,9 +8053,9 @@ "dev": true }, "normalize-package-data": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", - "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true }, "normalize-path": { @@ -7921,9 +8084,9 @@ "optional": true }, "npmlog": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", - "integrity": "sha1-3Fm+6F9k8A7UJO+yrweD3yXRwLU=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true }, "null-check": { @@ -8013,9 +8176,9 @@ "dev": true }, "isobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz", - "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } @@ -8196,8 +8359,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "optional": true + "dev": true }, "p-limit": { "version": "1.1.0", @@ -8214,9 +8376,9 @@ "optional": true }, "p-timeout": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.1.1.tgz", - "integrity": "sha1-0o6f35bjKIhvv/B4+IatFYxTv20=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.0.tgz", + "integrity": "sha1-mCD5lDTFgXhotPNICe5SkWYNW2w=", "dev": true, "optional": true }, @@ -8295,9 +8457,9 @@ "dev": true, "dependencies": { "@types/node": { - "version": "6.0.78", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.78.tgz", - "integrity": "sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg==", + "version": "6.0.79", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.79.tgz", + "integrity": "sha512-7F3/P6MkTPA0QxOstRqfcnoReCUy5V/QG92cyBoZSPnqdX44L8TtNELSVfN56gAttm3YWj9cEi8FRIPVq0WmeQ==", "dev": true } } @@ -8651,9 +8813,9 @@ "dev": true, "dependencies": { "@types/node": { - "version": "6.0.78", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.78.tgz", - "integrity": "sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg==", + "version": "6.0.79", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.79.tgz", + "integrity": "sha512-7F3/P6MkTPA0QxOstRqfcnoReCUy5V/QG92cyBoZSPnqdX44L8TtNELSVfN56gAttm3YWj9cEi8FRIPVq0WmeQ==", "dev": true }, "@types/q": { @@ -8778,9 +8940,9 @@ "dev": true }, "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "dev": true }, "random-bytes": { @@ -8867,9 +9029,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.2.tgz", - "integrity": "sha1-WgTfBeT1f+Pw3Gj90R3FyXx+b00=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true }, "readdirp": { @@ -8968,39 +9130,7 @@ "version": "2.81.0", "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "dependencies": { - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - } - } + "dev": true }, "require-directory": { "version": "2.1.1", @@ -9182,9 +9312,9 @@ } }, "rsvp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.5.0.tgz", - "integrity": "sha1-pixXOkrk4d/QaX68YkLnnGgeqjQ=", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.1.tgz", + "integrity": "sha1-NPSnrChZ97rMj0l4nFYE8eJq5wI=", "dev": true }, "run-async": { @@ -9206,9 +9336,9 @@ "dev": true }, "rxjs": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.1.tgz", - "integrity": "sha1-ti91fyeURdJloYpY+wpw3JDpFiY=" + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz", + "integrity": "sha1-KjI2/L8D31e64G/Wly/ZnlwI/Pc=" }, "safe-buffer": { "version": "5.1.1", @@ -9765,9 +9895,9 @@ "dev": true }, "specificity": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.0.tgz", - "integrity": "sha1-MyRy1OXrWvIIIRcZM5mKa8Oxzm8=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.1.tgz", + "integrity": "sha1-8bBoQkzjF64HR42V3jwhz4Xo1Wc=", "dev": true }, "split": { @@ -9989,11 +10119,17 @@ } }, "stylelint": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.11.1.tgz", - "integrity": "sha1-yBbGWLr32eXRZ9gic/6tN8l65J0=", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.12.0.tgz", + "integrity": "sha512-DpEYhVZnjrNIFmX7IkigvwoR0F5NLBqHOF3+ovJeKhnv+qCEOC5CI+tZ8FOCdQGytfnIa6hUItSYbwg1Dbipfw==", "dev": true, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "balanced-match": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", @@ -10025,9 +10161,15 @@ "dev": true }, "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", + "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true } } @@ -10125,6 +10267,12 @@ "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", "dev": true }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, "write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", @@ -10192,6 +10340,12 @@ "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", "dev": true, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -10199,9 +10353,15 @@ "dev": true }, "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", + "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true } } @@ -10450,10 +10610,36 @@ "dev": true }, "ts-node": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.1.0.tgz", - "integrity": "sha1-p17FrrSPMFixuUXbp2XxFQuoj4w=", - "dev": true + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.0.tgz", + "integrity": "sha1-mBTwwBQXhJAM8S/vEZetS39NI9E=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", + "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", + "dev": true + }, + "chalk": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", + "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.1.0.tgz", + "integrity": "sha1-kswUuz2tiSjKVlbDPhmhnyCvXHo=", + "dev": true + } + } }, "tsconfig": { "version": "6.0.0", @@ -10515,15 +10701,15 @@ "dev": true }, "tsutils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.4.0.tgz", - "integrity": "sha1-rUzm26Dlo+2934Ymt8oEB4IYn+o=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.5.1.tgz", + "integrity": "sha1-wgATkMee7Bpcz6esEtWZY5aD4M8=", "dev": true }, "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true }, "tweetnacl": { @@ -10635,6 +10821,12 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", "dev": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true } } }, @@ -10750,6 +10942,12 @@ "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", "dev": true }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, "write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", @@ -10795,9 +10993,9 @@ "dev": true }, "useragent": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.1.13.tgz", - "integrity": "sha1-u6Q+iqJNXOuDwpN0c+EC4h33TBA=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.0.tgz", + "integrity": "sha1-74X0GQPP0F4rqMEa5hJJx6a79mM=", "dev": true, "dependencies": { "lru-cache": { @@ -10837,9 +11035,9 @@ "dev": true }, "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true }, "v8flags": { @@ -11002,6 +11200,12 @@ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=", "dev": true }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, "compress-commons": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", @@ -11020,6 +11224,12 @@ "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", "dev": true }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true + }, "lodash": { "version": "4.16.2", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", @@ -11032,6 +11242,12 @@ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, "request": { "version": "2.79.0", "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", @@ -11044,10 +11260,10 @@ "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", "dev": true }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "dev": true }, "zip-stream": { @@ -11161,7 +11377,7 @@ "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true }, "widest-line": { @@ -11223,7 +11439,7 @@ "write-file-atomic": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha1-F2n0tVHu3OQZ8FBd6uLiZ2NULTc=", + "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", "dev": true }, "write-file-stdout": { diff --git a/package.json b/package.json index b94fa68f73ac..73239c656769 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "https://github.com/angular/material2.git" }, "scripts": { - "build": "gulp material:build-release:clean", + "build": "gulp :publish:build-releases", "demo-app": "gulp serve:devapp", "test": "gulp test", "tslint": "gulp lint", @@ -19,7 +19,7 @@ "docs": "gulp docs", "api": "gulp api-docs" }, - "version": "2.0.0-beta.7", + "version": "2.0.0-beta.8", "license": "MIT", "engines": { "node": ">= 5.4.1 < 7" @@ -55,7 +55,6 @@ "@types/minimist": "^1.2.0", "@types/node": "^7.0.21", "@types/run-sequence": "^0.0.29", - "@types/rx": "2.5.33", "autoprefixer": "^6.7.6", "axe-core": "^2.2.1", "axe-webdriverjs": "^1.1.1", @@ -114,7 +113,7 @@ "stylelint": "^7.10.1", "ts-node": "^3.0.4", "tsconfig-paths": "^2.2.0", - "tslint": "^5.2.0", + "tslint": "~5.4.3", "typescript": "~2.2.1", "uglify-js": "^2.8.14", "web-animations-js": "^2.2.5" diff --git a/scripts/ci/build-and-test.sh b/scripts/ci/build-and-test.sh index 229a702f4a5c..f9a9fd15e932 100755 --- a/scripts/ci/build-and-test.sh +++ b/scripts/ci/build-and-test.sh @@ -1,5 +1,6 @@ #!/bin/bash +# The script should immediately exit if any command in the script fails. set -e echo "" diff --git a/scripts/ci/publish-artifacts.sh b/scripts/ci/publish-artifacts.sh index b4be9e95bed1..cc7d49fd0cd5 100755 --- a/scripts/ci/publish-artifacts.sh +++ b/scripts/ci/publish-artifacts.sh @@ -3,6 +3,9 @@ # Script that runs after the testing stage of Travis passed. # Build artifacts and docs content will be published to different repositories. +# The script should immediately exit if any command in the script fails. +set -e + # Go to the project root directory cd $(dirname $0)/../.. diff --git a/scripts/deploy/deploy-dashboard.sh b/scripts/deploy/deploy-dashboard.sh index 46203a81c362..5e499e55a0f7 100755 --- a/scripts/deploy/deploy-dashboard.sh +++ b/scripts/deploy/deploy-dashboard.sh @@ -1,5 +1,8 @@ #!/bin/bash +# The script should immediately exit if any command in the script fails. +set -e + # This script deploys the Dashboard App and their Cloud Functions to Firebase. # Before the script installs all dependencies and builds the dashboard app in production. diff --git a/scripts/deploy/deploy-screenshot-functions.sh b/scripts/deploy/deploy-screenshot-functions.sh index 1aad23bda363..8e2f490c8ed4 100755 --- a/scripts/deploy/deploy-screenshot-functions.sh +++ b/scripts/deploy/deploy-screenshot-functions.sh @@ -1,5 +1,8 @@ #!/bin/bash +# The script should immediately exit if any command in the script fails. +set -e + # Go to the project root directory cd $(dirname ${0})/../.. diff --git a/scripts/deploy/publish-build-artifacts.sh b/scripts/deploy/publish-build-artifacts.sh index 8d3364c02eb2..77dd50d2e5e3 100755 --- a/scripts/deploy/publish-build-artifacts.sh +++ b/scripts/deploy/publish-build-artifacts.sh @@ -3,11 +3,18 @@ # Script to publish the build artifacts to a GitHub repository. # Builds will be automatically published once new changes are made to the repository. -set -e -o pipefail +# The script should immediately exit if any command in the script fails. +set -e # Go to the project root directory cd $(dirname ${0})/../.. +if [ -z ${MATERIAL2_BUILDS_TOKEN} ]; then + echo "Error: No access token for GitHub could be found." \ + "Please set the environment variable 'MATERIAL2_BUILDS_TOKEN'." + exit 1 +fi + # Material packages that need to published. PACKAGES=(cdk material) REPOSITORIES=(cdk-builds material2-builds) @@ -23,7 +30,7 @@ publishPackage() { packageRepo=${2} buildDir="dist/releases/${packageName}" - buildVersion=$(sed -nE 's/^\s*"version": "(.*?)",$/\1/p' package.json) + buildVersion=$(node -pe "require('./package.json').version") commitSha=$(git rev-parse --short HEAD) commitAuthorName=$(git --no-pager show -s --format='%an' HEAD) @@ -71,7 +78,7 @@ publishPackage() { git tag "${buildVersion}-${commitSha}" git push origin master --tags - echo "Published artifacts for ${packageName} package." + echo "Published package artifacts for ${packageName}#${commitSha}." } for ((i = 0; i < ${#PACKAGES[@]}; i++)); do diff --git a/scripts/deploy/publish-docs-content.sh b/scripts/deploy/publish-docs-content.sh index 3778cc6254d9..26f3686651b2 100755 --- a/scripts/deploy/publish-docs-content.sh +++ b/scripts/deploy/publish-docs-content.sh @@ -3,8 +3,17 @@ # Publish material2 docs assets to the material2-docs-content repo # material.angular.io will pull from this assets repo to get the latest docs +# The script should immediately exit if any command in the script fails. +set -e + cd "$(dirname $0)/../../" +if [ -z ${MATERIAL2_DOCS_CONTENT_TOKEN} ]; then + echo "Error: No access token for GitHub could be found." \ + "Please set the environment variable 'MATERIAL2_DOCS_CONTENT_TOKEN'." + exit 1 +fi + docsPath="./dist/docs" packagePath="./dist/releases/material-examples" repoPath="/tmp/material2-docs-content" diff --git a/src/cdk/a11y/activedescendant-key-manager.ts b/src/cdk/a11y/activedescendant-key-manager.ts new file mode 100644 index 000000000000..ec5d19235cfd --- /dev/null +++ b/src/cdk/a11y/activedescendant-key-manager.ts @@ -0,0 +1,40 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {ListKeyManager, CanDisable} from './list-key-manager'; + +/** + * This is the interface for highlightable items (used by the ActiveDescendantKeyManager). + * Each item must know how to style itself as active or inactive and whether or not it is + * currently disabled. + */ +export interface Highlightable extends CanDisable { + setActiveStyles(): void; + setInactiveStyles(): void; +} + +export class ActiveDescendantKeyManager extends ListKeyManager { + + /** + * This method sets the active item to the item at the specified index. + * It also adds active styles to the newly active item and removes active + * styles from the previously active item. + */ + setActiveItem(index: number): void { + Promise.resolve().then(() => { + if (this.activeItem) { + this.activeItem.setInactiveStyles(); + } + super.setActiveItem(index); + if (this.activeItem) { + this.activeItem.setActiveStyles(); + } + }); + } + +} diff --git a/src/cdk/a11y/fake-mousedown.ts b/src/cdk/a11y/fake-mousedown.ts new file mode 100644 index 000000000000..87f6eb92592e --- /dev/null +++ b/src/cdk/a11y/fake-mousedown.ts @@ -0,0 +1,18 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +/** + * Screenreaders will often fire fake mousedown events when a focusable element + * is activated using the keyboard. We can typically distinguish between these faked + * mousedown events and real mousedown events using the "buttons" property. While + * real mousedowns will indicate the mouse button that was pressed (e.g. "1" for + * the left mouse button), faked mousedowns will usually set the property value to 0. + */ +export function isFakeMousedownFromScreenReader(event: MouseEvent): boolean { + return event.buttons === 0; +} diff --git a/src/cdk/a11y/focus-key-manager.ts b/src/cdk/a11y/focus-key-manager.ts new file mode 100644 index 000000000000..8473b84560ea --- /dev/null +++ b/src/cdk/a11y/focus-key-manager.ts @@ -0,0 +1,39 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {QueryList} from '@angular/core'; +import {ListKeyManager, CanDisable} from './list-key-manager'; + +/** + * This is the interface for focusable items (used by the FocusKeyManager). + * Each item must know how to focus itself and whether or not it is currently disabled. + */ +export interface Focusable extends CanDisable { + focus(): void; +} + + +export class FocusKeyManager extends ListKeyManager { + + constructor(items: QueryList) { + super(items); + } + + /** + * This method sets the active item to the item at the specified index. + * It also adds focuses the newly active item. + */ + setActiveItem(index: number): void { + super.setActiveItem(index); + + if (this.activeItem) { + this.activeItem.focus(); + } + } + +} diff --git a/src/cdk/a11y/focus-trap.md b/src/cdk/a11y/focus-trap.md new file mode 100644 index 000000000000..67eb774e2c6e --- /dev/null +++ b/src/cdk/a11y/focus-trap.md @@ -0,0 +1,14 @@ +### FocusTrap +The `cdkTrapFocus` directive traps Tab key focus within an element. This is intended to +be used to create accessible experience for components like +[modal dialogs](https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal), where focus must be +constrained. + +This directive is declared in `A11yModule`. + +#### Example +```html +
+ +
+``` diff --git a/src/lib/core/a11y/focus-trap.spec.ts b/src/cdk/a11y/focus-trap.spec.ts similarity index 100% rename from src/lib/core/a11y/focus-trap.spec.ts rename to src/cdk/a11y/focus-trap.spec.ts diff --git a/src/cdk/a11y/focus-trap.ts b/src/cdk/a11y/focus-trap.ts new file mode 100644 index 000000000000..60cb67ef3dfc --- /dev/null +++ b/src/cdk/a11y/focus-trap.ts @@ -0,0 +1,309 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import { + Directive, + ElementRef, + Input, + NgZone, + OnDestroy, + AfterContentInit, + Injectable, +} from '@angular/core'; +import {coerceBooleanProperty} from '../coercion/boolean-property'; +import {InteractivityChecker} from './interactivity-checker'; +import {Platform} from '../platform/platform'; +import {first} from '../rxjs/index'; + + +/** + * Class that allows for trapping focus within a DOM element. + * + * NOTE: This class currently uses a very simple (naive) approach to focus trapping. + * It assumes that the tab order is the same as DOM order, which is not necessarily true. + * Things like tabIndex > 0, flex `order`, and shadow roots can cause to two to misalign. + * This will be replaced with a more intelligent solution before the library is considered stable. + */ +export class FocusTrap { + private _startAnchor: HTMLElement | null; + private _endAnchor: HTMLElement | null; + + /** Whether the focus trap is active. */ + get enabled(): boolean { return this._enabled; } + set enabled(val: boolean) { + this._enabled = val; + + if (this._startAnchor && this._endAnchor) { + this._startAnchor.tabIndex = this._endAnchor.tabIndex = this._enabled ? 0 : -1; + } + } + private _enabled: boolean = true; + + constructor( + private _element: HTMLElement, + private _platform: Platform, + private _checker: InteractivityChecker, + private _ngZone: NgZone, + deferAnchors = false) { + + if (!deferAnchors) { + this.attachAnchors(); + } + } + + /** Destroys the focus trap by cleaning up the anchors. */ + destroy() { + if (this._startAnchor && this._startAnchor.parentNode) { + this._startAnchor.parentNode.removeChild(this._startAnchor); + } + + if (this._endAnchor && this._endAnchor.parentNode) { + this._endAnchor.parentNode.removeChild(this._endAnchor); + } + + this._startAnchor = this._endAnchor = null; + } + + /** + * Inserts the anchors into the DOM. This is usually done automatically + * in the constructor, but can be deferred for cases like directives with `*ngIf`. + */ + attachAnchors(): void { + // If we're not on the browser, there can be no focus to trap. + if (!this._platform.isBrowser) { + return; + } + + if (!this._startAnchor) { + this._startAnchor = this._createAnchor(); + } + + if (!this._endAnchor) { + this._endAnchor = this._createAnchor(); + } + + this._ngZone.runOutsideAngular(() => { + this._startAnchor!.addEventListener('focus', () => this.focusLastTabbableElement()); + this._endAnchor!.addEventListener('focus', () => this.focusFirstTabbableElement()); + + if (this._element.parentNode) { + this._element.parentNode.insertBefore(this._startAnchor!, this._element); + this._element.parentNode.insertBefore(this._endAnchor!, this._element.nextSibling); + } + }); + } + + /** + * Waits for the zone to stabilize, then either focuses the first element that the + * user specified, or the first tabbable element.. + */ + focusInitialElementWhenReady() { + this._executeOnStable(() => this.focusInitialElement()); + } + + /** + * Waits for the zone to stabilize, then focuses + * the first tabbable element within the focus trap region. + */ + focusFirstTabbableElementWhenReady() { + this._executeOnStable(() => this.focusFirstTabbableElement()); + } + + /** + * Waits for the zone to stabilize, then focuses + * the last tabbable element within the focus trap region. + */ + focusLastTabbableElementWhenReady() { + this._executeOnStable(() => this.focusLastTabbableElement()); + } + + /** + * Get the specified boundary element of the trapped region. + * @param bound The boundary to get (start or end of trapped region). + * @returns The boundary element. + */ + private _getRegionBoundary(bound: 'start' | 'end'): HTMLElement | null { + // Contains the deprecated version of selector, for temporary backwards comparability. + let markers = this._element.querySelectorAll(`[cdk-focus-region-${bound}], ` + + `[cdk-focus-${bound}]`) as NodeListOf; + + for (let i = 0; i < markers.length; i++) { + if (markers[i].hasAttribute(`cdk-focus-${bound}`)) { + console.warn(`Found use of deprecated attribute 'cdk-focus-${bound}',` + + ` use 'cdk-focus-region-${bound}' instead.`, markers[i]); + } + } + + if (bound == 'start') { + return markers.length ? markers[0] : this._getFirstTabbableElement(this._element); + } + return markers.length ? + markers[markers.length - 1] : this._getLastTabbableElement(this._element); + } + + /** Focuses the element that should be focused when the focus trap is initialized. */ + focusInitialElement() { + let redirectToElement = this._element.querySelector('[cdk-focus-initial]') as HTMLElement; + if (redirectToElement) { + redirectToElement.focus(); + } else { + this.focusFirstTabbableElement(); + } + } + + /** Focuses the first tabbable element within the focus trap region. */ + focusFirstTabbableElement() { + let redirectToElement = this._getRegionBoundary('start'); + if (redirectToElement) { + redirectToElement.focus(); + } + } + + /** Focuses the last tabbable element within the focus trap region. */ + focusLastTabbableElement() { + let redirectToElement = this._getRegionBoundary('end'); + if (redirectToElement) { + redirectToElement.focus(); + } + } + + /** Get the first tabbable element from a DOM subtree (inclusive). */ + private _getFirstTabbableElement(root: HTMLElement): HTMLElement | null { + if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) { + return root; + } + + // 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; + } + } + + return null; + } + + /** Get the last tabbable element from a DOM subtree (inclusive). */ + private _getLastTabbableElement(root: HTMLElement): HTMLElement | null { + if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) { + return root; + } + + // Iterate in reverse DOM order. + 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; + } + } + + return null; + } + + /** Creates an anchor element. */ + private _createAnchor(): HTMLElement { + let anchor = document.createElement('div'); + anchor.tabIndex = this._enabled ? 0 : -1; + anchor.classList.add('cdk-visually-hidden'); + anchor.classList.add('cdk-focus-trap-anchor'); + return anchor; + } + + /** Executes a function when the zone is stable. */ + private _executeOnStable(fn: () => any): void { + if (this._ngZone.isStable) { + fn(); + } else { + first.call(this._ngZone.onStable).subscribe(fn); + } + } +} + + +/** Factory that allows easy instantiation of focus traps. */ +@Injectable() +export class FocusTrapFactory { + constructor( + private _checker: InteractivityChecker, + private _platform: Platform, + private _ngZone: NgZone) { } + + create(element: HTMLElement, deferAnchors = false): FocusTrap { + return new FocusTrap(element, this._platform, this._checker, this._ngZone, deferAnchors); + } +} + + +/** + * Directive for trapping focus within a region. + * @deprecated + */ +@Directive({ + selector: 'cdk-focus-trap', +}) +export class FocusTrapDeprecatedDirective implements OnDestroy, AfterContentInit { + focusTrap: FocusTrap; + + /** Whether the focus trap is active. */ + @Input() + get disabled(): boolean { return !this.focusTrap.enabled; } + set disabled(val: boolean) { + this.focusTrap.enabled = !coerceBooleanProperty(val); + } + + constructor(private _elementRef: ElementRef, private _focusTrapFactory: FocusTrapFactory) { + this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true); + } + + ngOnDestroy() { + this.focusTrap.destroy(); + } + + ngAfterContentInit() { + this.focusTrap.attachAnchors(); + } +} + + +/** Directive for trapping focus within a region. */ +@Directive({ + selector: '[cdkTrapFocus]', + exportAs: 'cdkTrapFocus', +}) +export class FocusTrapDirective implements OnDestroy, AfterContentInit { + focusTrap: FocusTrap; + + /** Whether the focus trap is active. */ + @Input('cdkTrapFocus') + get enabled(): boolean { return this.focusTrap.enabled; } + 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); + } + + ngOnDestroy() { + this.focusTrap.destroy(); + } + + ngAfterContentInit() { + this.focusTrap.attachAnchors(); + } +} diff --git a/src/cdk/a11y/index.ts b/src/cdk/a11y/index.ts new file mode 100644 index 000000000000..c78f2a4b0104 --- /dev/null +++ b/src/cdk/a11y/index.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {NgModule} from '@angular/core'; +import {FocusTrapDirective, FocusTrapDeprecatedDirective, FocusTrapFactory} from './focus-trap'; +import {LIVE_ANNOUNCER_PROVIDER} from './live-announcer'; +import {InteractivityChecker} from './interactivity-checker'; +import {CommonModule} from '@angular/common'; +import {PlatformModule} from '../platform/index'; + +@NgModule({ + imports: [CommonModule, PlatformModule], + declarations: [FocusTrapDirective, FocusTrapDeprecatedDirective], + exports: [FocusTrapDirective, FocusTrapDeprecatedDirective], + providers: [InteractivityChecker, FocusTrapFactory, LIVE_ANNOUNCER_PROVIDER] +}) +export class A11yModule {} + +export * from './live-announcer'; +export * from './fake-mousedown'; +export * from './focus-trap'; +export * from './interactivity-checker'; +export * from './list-key-manager'; +export * from './activedescendant-key-manager'; +export * from './focus-key-manager'; diff --git a/src/cdk/a11y/interactivity-checker.md b/src/cdk/a11y/interactivity-checker.md new file mode 100644 index 000000000000..07aa5fbc3273 --- /dev/null +++ b/src/cdk/a11y/interactivity-checker.md @@ -0,0 +1,21 @@ +### InteractivityChecker +`InteractivityChecker` is used to check the interactivity of an element, capturing disabled, +visible, tabbable, and focusable states for accessibility purposes. + +#### Methods + +##### `isDisabled(element: HTMLElement): boolean` +Whether the given element is disabled. + +##### `isVisible(element: HTMLElement): boolean` +Whether the given element is visible. + +This will capture states like `display: none` and `visibility: hidden`, +but not things like being clipped by an `overflow: hidden` parent or being outside the viewport. + +##### `isFocusable(element: HTMLElement): boolean` +Gets whether an element can be focused by the user. + +##### `isTabbable(element: HTMLElement): boolean` +Gets whether an element can be reached via Tab key. +Assumes that the element has already been checked with isFocusable. diff --git a/src/lib/core/a11y/interactivity-checker.spec.ts b/src/cdk/a11y/interactivity-checker.spec.ts similarity index 100% rename from src/lib/core/a11y/interactivity-checker.spec.ts rename to src/cdk/a11y/interactivity-checker.spec.ts diff --git a/src/cdk/a11y/interactivity-checker.ts b/src/cdk/a11y/interactivity-checker.ts new file mode 100644 index 000000000000..035e27001506 --- /dev/null +++ b/src/cdk/a11y/interactivity-checker.ts @@ -0,0 +1,244 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Injectable} from '@angular/core'; +import {Platform} from '../platform/platform'; + +/** + * The InteractivityChecker leans heavily on the ally.js accessibility utilities. + * Methods like `isTabbable` are only covering specific edge-cases for the browsers which are + * supported. + */ + +/** + * Utility for checking the interactivity of an element, such as whether is is focusable or + * tabbable. + */ +@Injectable() +export class InteractivityChecker { + + constructor(private _platform: Platform) {} + + /** + * Gets whether an element is disabled. + * + * @param element Element to be checked. + * @returns Whether the element is disabled. + */ + isDisabled(element: HTMLElement): boolean { + // This does not capture some cases, such as a non-form control with a disabled attribute or + // a form control inside of a disabled form, but should capture the most common cases. + return element.hasAttribute('disabled'); + } + + /** + * Gets whether an element is visible for the purposes of interactivity. + * + * This will capture states like `display: none` and `visibility: hidden`, but not things like + * being clipped by an `overflow: hidden` parent or being outside the viewport. + * + * @returns Whether the element is visible. + */ + isVisible(element: HTMLElement): boolean { + return hasGeometry(element) && getComputedStyle(element).visibility === 'visible'; + } + + /** + * Gets whether an element can be reached via Tab key. + * Assumes that the element has already been checked with isFocusable. + * + * @param element Element to be checked. + * @returns Whether the element is tabbable. + */ + isTabbable(element: HTMLElement): boolean { + // Nothing is tabbable on the the server 😎 + if (!this._platform.isBrowser) { + return false; + } + + let frameElement = getWindow(element).frameElement as HTMLElement; + + if (frameElement) { + + let frameType = frameElement && frameElement.nodeName.toLowerCase(); + + // Frame elements inherit their tabindex onto all child elements. + if (getTabIndexValue(frameElement) === -1) { + return false; + } + + // Webkit and Blink consider anything inside of an element as non-tabbable. + if ((this._platform.BLINK || this._platform.WEBKIT) && frameType === 'object') { + return false; + } + + // Webkit and Blink disable tabbing to an element inside of an invisible frame. + if ((this._platform.BLINK || this._platform.WEBKIT) && !this.isVisible(frameElement)) { + return false; + } + + } + + let nodeName = element.nodeName.toLowerCase(); + let tabIndexValue = getTabIndexValue(element); + + if (element.hasAttribute('contenteditable')) { + return tabIndexValue !== -1; + } + + if (nodeName === 'iframe') { + // The frames may be tabbable depending on content, but it's not possibly to reliably + // investigate the content of the frames. + return false; + } + + if (nodeName === 'audio') { + if (!element.hasAttribute('controls')) { + // By default an