diff --git a/.circleci/config.yml b/.circleci/config.yml index f8f7f672a9b0..08f37c576de0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -41,19 +41,13 @@ version: 2 jobs: build: <<: *job_defaults - resource_class: large + resource_class: xlarge steps: - checkout: <<: *post_checkout - restore_cache: key: *cache_key - - - run: bazel run @nodejs//:npm install - # For some reason, circleci needs the postinstall to be run explicitly. - # This may be unnecessary once rules_nodejs uses nodejs 8 - - run: bazel run @nodejs//:npm run postinstall - - run: bazel build src/... - - run: bazel test src/... + - run: echo "Temporarily disabled until Bazel setup can be fixed" - save_cache: key: *cache_key paths: @@ -69,3 +63,7 @@ general: branches: only: - master + # 5.2.x, 6.0.x, etc + - /\d+\.\d+\.x/ + # 5.x, 6.x, etc + - /\d+\.x/ diff --git a/.travis.yml b/.travis.yml index 53b314e17c21..98c74158b1e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,13 +18,10 @@ addons: branches: only: - master - - 5.0.x - - 5.1.x - - 5.2.x - - 6.0.x - - 6.1.x - - 6.2.x - - 6.3.x + # 5.2.x, 6.0.x, etc + - /\d+\.\d+\.x/ + # 5.x, 6.x, etc + - /\d+\.x/ jobs: include: diff --git a/CHANGELOG.md b/CHANGELOG.md index dfa5cad93576..155603c4aeca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,169 @@ + +## [6.4.7 kryptonite-kombucha](https://github.com/angular/material2/compare/6.4.6...6.4.7) (2018-08-29) + + +### Bug Fixes + +* **autocomplete:** reopening closed autocomplete when coming back to tab ([#12372](https://github.com/angular/material2/issues/12372)) ([8617423](https://github.com/angular/material2/commit/8617423)), closes [#12337](https://github.com/angular/material2/issues/12337) +* **badge:** apply view encapsulation attributes on badge element ([#12870](https://github.com/angular/material2/issues/12870)) ([dc8cf46](https://github.com/angular/material2/commit/dc8cf46)) +* **button-toggle:** clickable area not stretching when custom width is set ([#12642](https://github.com/angular/material2/issues/12642)) ([70aca02](https://github.com/angular/material2/commit/70aca02)), closes [#8432](https://github.com/angular/material2/issues/8432) +* **button-toggle:** set aria-disabled based on group disabled state ([#12828](https://github.com/angular/material2/issues/12828)) ([3f67cc5](https://github.com/angular/material2/commit/3f67cc5)) +* **card:** images in title-group overlapping content ([#12205](https://github.com/angular/material2/issues/12205)) ([22ae587](https://github.com/angular/material2/commit/22ae587)), closes [#10031](https://github.com/angular/material2/issues/10031) +* **chips:** chip list removing focus from first chip when adding through the input ([#12840](https://github.com/angular/material2/issues/12840)) ([0e60fb8](https://github.com/angular/material2/commit/0e60fb8)) +* **chips:** focus not being restored correctly on chip removal when inside component with animations ([#12416](https://github.com/angular/material2/issues/12416)) ([d08d8bc](https://github.com/angular/material2/commit/d08d8bc)), closes [#12374](https://github.com/angular/material2/issues/12374) +* **chips:** focus not restored properly if chip has been removed by click ([#12788](https://github.com/angular/material2/issues/12788)) ([59a7f28](https://github.com/angular/material2/commit/59a7f28)), closes [#12416](https://github.com/angular/material2/issues/12416) +* **chips:** form field not appearing as blurred when used without an input ([#12858](https://github.com/angular/material2/issues/12858)) ([be1ba9c](https://github.com/angular/material2/commit/be1ba9c)) +* **chips:** improved image scaling in avatar ([#12843](https://github.com/angular/material2/issues/12843)) ([130806b](https://github.com/angular/material2/commit/130806b)), closes [#12660](https://github.com/angular/material2/issues/12660) +* **chips:** incorrectly handling disabled state ([#12659](https://github.com/angular/material2/issues/12659)) ([15e7f74](https://github.com/angular/material2/commit/15e7f74)), closes [#11089](https://github.com/angular/material2/issues/11089) +* **chips:** support focusing first/last item using home/end ([#11892](https://github.com/angular/material2/issues/11892)) ([b735e48](https://github.com/angular/material2/commit/b735e48)) +* **collections:** align SelectionModel to `changed` naming ([#8286](https://github.com/angular/material2/issues/8286)) ([4b30539](https://github.com/angular/material2/commit/4b30539)) +* **datepicker:** multiple dialog open if the user holds down enter key ([#12238](https://github.com/angular/material2/issues/12238)) ([c807d74](https://github.com/angular/material2/commit/c807d74)) +* **datepicker:** screenreaders report editable grid cells ([#12275](https://github.com/angular/material2/issues/12275)) ([3328808](https://github.com/angular/material2/commit/3328808)) +* **datepicker-toggle:** forward tabindex to underlying button ([#12461](https://github.com/angular/material2/issues/12461)) ([09302b6](https://github.com/angular/material2/commit/09302b6)), closes [#12456](https://github.com/angular/material2/issues/12456) +* **expansion:** respect parent accordion hideToggle binding ([#12725](https://github.com/angular/material2/issues/12725)) ([803f73f](https://github.com/angular/material2/commit/803f73f)), closes [#6529](https://github.com/angular/material2/issues/6529) +* **expansion-panel:** focus lost if focused element is inside closing panel ([#12692](https://github.com/angular/material2/issues/12692)) ([3596e9d](https://github.com/angular/material2/commit/3596e9d)) +* **expansion-panel:** implement keyboard controls ([#12427](https://github.com/angular/material2/issues/12427)) ([04d5955](https://github.com/angular/material2/commit/04d5955)) +* **form-field:** allow for measuring outline gap when label is not in dom ([#12782](https://github.com/angular/material2/issues/12782)) ([9579212](https://github.com/angular/material2/commit/9579212)) +* **form-field:** legacy ripple underline jumps in edge ([#12648](https://github.com/angular/material2/issues/12648)) ([34d91c7](https://github.com/angular/material2/commit/34d91c7)), closes [#6351](https://github.com/angular/material2/issues/6351) +* **form-field:** outline gap not calculated when appearance is provided through DI ([#12767](https://github.com/angular/material2/issues/12767)) ([8b9d283](https://github.com/angular/material2/commit/8b9d283)), closes [#12765](https://github.com/angular/material2/issues/12765) +* **form-field:** remove outline gap for empty labels ([#12637](https://github.com/angular/material2/issues/12637)) ([a326ee0](https://github.com/angular/material2/commit/a326ee0)) +* **grid-list:** not picking up indirect descendants ([#12823](https://github.com/angular/material2/issues/12823)) ([4f53e4f](https://github.com/angular/material2/commit/4f53e4f)), closes [#12809](https://github.com/angular/material2/issues/12809) +* **input:** only monitor focus origin on browser platform ([#11604](https://github.com/angular/material2/issues/11604)) ([a30e909](https://github.com/angular/material2/commit/a30e909)) +* **list:** improved image scaling in avatar ([#12660](https://github.com/angular/material2/issues/12660)) ([70cb0a2](https://github.com/angular/material2/commit/70cb0a2)), closes [#8131](https://github.com/angular/material2/issues/8131) +* **live-announcer:** avoid triggering a reflow when reading directive content ([#12638](https://github.com/angular/material2/issues/12638)) ([92f53ce](https://github.com/angular/material2/commit/92f53ce)) +* **menu:** throw better error when trying to open undefined menu ([#12688](https://github.com/angular/material2/issues/12688)) ([f732059](https://github.com/angular/material2/commit/f732059)), closes [#12649](https://github.com/angular/material2/issues/12649) +* **progress-bar:** avoid error on SSR if pathname is undefined ([#12807](https://github.com/angular/material2/issues/12807)) ([bb9cfec](https://github.com/angular/material2/commit/bb9cfec)) +* **progress-bar:** generate correct url on server ([#12813](https://github.com/angular/material2/issues/12813)) ([b0555b5](https://github.com/angular/material2/commit/b0555b5)) +* **progress-bar:** incorrectly handling current path when using hash location strategy ([#12713](https://github.com/angular/material2/issues/12713)) ([da3b5e0](https://github.com/angular/material2/commit/da3b5e0)), closes [#12710](https://github.com/angular/material2/issues/12710) +* **ripple:** don't launch ripple for fake mouse events ([#11997](https://github.com/angular/material2/issues/11997)) ([266a159](https://github.com/angular/material2/commit/266a159)) +* **select:** pointing to non-existent element via aria-labelledby ([#12411](https://github.com/angular/material2/issues/12411)) ([12c6f81](https://github.com/angular/material2/commit/12c6f81)), closes [#12405](https://github.com/angular/material2/issues/12405) +* **select:** skip disabled options when using ctrl + a ([#12553](https://github.com/angular/material2/issues/12553)) ([2349166](https://github.com/angular/material2/commit/2349166)), closes [#12543](https://github.com/angular/material2/issues/12543) +* **select,autocomplete:** unable to set custom id on mat-option ([#11573](https://github.com/angular/material2/issues/11573)) ([1f78d8a](https://github.com/angular/material2/commit/1f78d8a)), closes [#11572](https://github.com/angular/material2/issues/11572) +* **sidenav:** content jumping in rtl and blurry text on IE ([#12726](https://github.com/angular/material2/issues/12726)) ([81e0542](https://github.com/angular/material2/commit/81e0542)), closes [#10026](https://github.com/angular/material2/issues/10026) +* **slide-toggle:** remove webkit tap highlight ([#12708](https://github.com/angular/material2/issues/12708)) ([3ce4e8d](https://github.com/angular/material2/commit/3ce4e8d)) +* **slider:** thumb label blending in with background in high contrast mode ([#12606](https://github.com/angular/material2/issues/12606)) ([a4a79ea](https://github.com/angular/material2/commit/a4a79ea)) +* **stepper:** focus lost if focus is inside stepper while changing step ([#12761](https://github.com/angular/material2/issues/12761)) ([fc537af](https://github.com/angular/material2/commit/fc537af)) +* **stepper:** handle removing a step before the current one ([#11813](https://github.com/angular/material2/issues/11813)) ([0fcdae4](https://github.com/angular/material2/commit/0fcdae4)), closes [#11791](https://github.com/angular/material2/issues/11791) +* **stepper:** improved alignment for step icons ([#12703](https://github.com/angular/material2/issues/12703)) ([41d0196](https://github.com/angular/material2/commit/41d0196)), closes [#12696](https://github.com/angular/material2/issues/12696) +* **table:** errors when rendering table with sticky elements on the server ([#12095](https://github.com/angular/material2/issues/12095)) ([8956d1d](https://github.com/angular/material2/commit/8956d1d)), closes [#12094](https://github.com/angular/material2/issues/12094) +* **table:** extra elements throwing off table alignment ([#12645](https://github.com/angular/material2/issues/12645)) ([13f1c6e](https://github.com/angular/material2/commit/13f1c6e)), closes [#11165](https://github.com/angular/material2/issues/11165) +* **tabs:** disable focus overlay for touch focus ([#12249](https://github.com/angular/material2/issues/12249)) ([d3af441](https://github.com/angular/material2/commit/d3af441)), closes [#12247](https://github.com/angular/material2/issues/12247) +* **tabs:** only target direct descendants with mat-stretch-tabs ([#12198](https://github.com/angular/material2/issues/12198)) ([6bb0ffe](https://github.com/angular/material2/commit/6bb0ffe)), closes [#12196](https://github.com/angular/material2/issues/12196) +* **tooltip:** opening after click on android ([#12250](https://github.com/angular/material2/issues/12250)) ([a6b8a06](https://github.com/angular/material2/commit/a6b8a06)), closes [#12223](https://github.com/angular/material2/issues/12223) +* ensure all components work with ES2015 in jit mode. ([#12759](https://github.com/angular/material2/issues/12759)) ([0c4a1b4](https://github.com/angular/material2/commit/0c4a1b4)), closes [/github.com/angular/angular/pull/22356#issuecomment-387756794](https://github.com//github.com/angular/angular/pull/22356/issues/issuecomment-387756794) [#9329](https://github.com/angular/material2/issues/9329) + + + + +## [6.4.6 argon-aftershave](https://github.com/angular/material2/compare/6.4.5...6.4.6) (2018-08-20) + + +### Bug Fixes + +* **cdk-text-field:** prevent keyframes from getting stripped by LibSass ([#12567](https://github.com/angular/material2/issues/12567)) ([4180e72](https://github.com/angular/material2/commit/4180e72)) +* **form-field:** update label gap for outline style ([#12555](https://github.com/angular/material2/issues/12555)) ([ffeb779](https://github.com/angular/material2/commit/ffeb779)) +* **progress-bar:** query state animation not working ([#11459](https://github.com/angular/material2/issues/11459)) ([948f655](https://github.com/angular/material2/commit/948f655)), closes [#11453](https://github.com/angular/material2/issues/11453) +* **selection-list:** do not allow toggling disabled options ([#12617](https://github.com/angular/material2/issues/12617)) ([3c1995d](https://github.com/angular/material2/commit/3c1995d)), closes [#12608](https://github.com/angular/material2/issues/12608) +* **tabs:** changed after checked error when using isActive in view ([#12206](https://github.com/angular/material2/issues/12206)) ([75632bd](https://github.com/angular/material2/commit/75632bd)), closes [#12197](https://github.com/angular/material2/issues/12197) + + + +## [6.4.5 mithril-magnet](https://github.com/angular/material2/compare/6.4.3...6.4.4) (2018-08-13) + + +### Bug Fixes + +* **button:** allow transition for the button focus overlay for all buttons ([#12552](https://github.com/angular/material2/issues/12552)) ([0a56cf7](https://github.com/angular/material2/commit/0a56cf7)) +* **button-toggle:** forward tabindex to underlying button ([#12538](https://github.com/angular/material2/issues/12538)) ([dcae875](https://github.com/angular/material2/commit/dcae875)) +* **breakpoint-observer:** Emit matching state of each query provided ([#12506](https://github.com/angular/material2/issues/12506)) ([cb3f760](https://github.com/angular/material2/commit/cb3f760)) +* **datepicker:** input not picking up changes if datepicker is assigned after init ([#12546](https://github.com/angular/material2/issues/12546)) ([d10a6c4](https://github.com/angular/material2/commit/d10a6c4)) +* **drag-drop:** add support for sorting animations ([#12530](https://github.com/angular/material2/issues/12530)) ([7d0e69b](https://github.com/angular/material2/commit/7d0e69b)) +* **drag-drop:** ignore self inside connectedTo ([#12626](https://github.com/angular/material2/issues/12626)) ([7e7e873](https://github.com/angular/material2/commit/7e7e873)) +* **drag-drop:** remove circular dependencies ([#12554](https://github.com/angular/material2/issues/12554)) ([fd70c07](https://github.com/angular/material2/commit/fd70c07)) +* **list:** disable hover styling on touch devices ([#12520](https://github.com/angular/material2/issues/12520)) ([6048f6f](https://github.com/angular/material2/commit/6048f6f)) +* **overlay:** flexible overlay with push not handling scroll offset and position locking ([#11628](https://github.com/angular/material2/issues/11628)) ([a192907](https://github.com/angular/material2/commit/a192907)) +* **paginator:** inconsistently disabling tooltips between browsers ([#12539](https://github.com/angular/material2/issues/12539)) ([35bdd00](https://github.com/angular/material2/commit/35bdd00)) +* **snackbar:** wrap simple snackbar text in span ([#12599](https://github.com/angular/material2/issues/12599)) ([11b97e4](https://github.com/angular/material2/commit/11b97e4)) +* **tabs:** animation running after initialization ([#12549](https://github.com/angular/material2/issues/12549)) ([2798084](https://github.com/angular/material2/commit/2798084)) +* **tree:** include constructors on MatTree classes to allow es6 builds ([#12556](https://github.com/angular/material2/issues/12556)) ([5b0eed3](https://github.com/angular/material2/commit/5b0eed3)) + + + +## [6.4.3 monelite-meeple](https://github.com/angular/material2/compare/6.4.2...6.4.3) (2018-08-07) + + +### Bug Fixes + +* **bidi:** default invalid directionality values to ltr ([#12396](https://github.com/angular/material2/issues/12396)) ([58361f1](https://github.com/angular/material2/commit/58361f1)) +* **checkbox:** prevent error when disabling while focused ([#12327](https://github.com/angular/material2/issues/12327)) ([0c746c1](https://github.com/angular/material2/commit/0c746c1)), closes [#12323](https://github.com/angular/material2/issues/12323) +* **chips:** dynamic chip input placeholder changes not being propagated to form field ([#12422](https://github.com/angular/material2/issues/12422)) ([5053532](https://github.com/angular/material2/commit/5053532)), closes [#11861](https://github.com/angular/material2/issues/11861) +* **chips:** focus indication not visible in high contrast mode ([#12431](https://github.com/angular/material2/issues/12431)) ([3652707](https://github.com/angular/material2/commit/3652707)) +* **drag-drop:** account for transition-delay when waiting for the animation to finish ([#12466](https://github.com/angular/material2/issues/12466)) ([3580fb5](https://github.com/angular/material2/commit/3580fb5)) +* **form-field:** reset inputs not being reset on safari ([#12413](https://github.com/angular/material2/issues/12413)) ([952b553](https://github.com/angular/material2/commit/952b553)), closes [#12408](https://github.com/angular/material2/issues/12408) +* **form-field:** unable to distinguish disabled form field in high contrast mode ([#12445](https://github.com/angular/material2/issues/12445)) ([212bd0b](https://github.com/angular/material2/commit/212bd0b)) +* **live-announcer:** duplicate live element when coming in from the server ([#12378](https://github.com/angular/material2/issues/12378)) ([bf9bc0d](https://github.com/angular/material2/commit/bf9bc0d)), closes [#11940](https://github.com/angular/material2/issues/11940) +* **menu:** menu content data being cleared when lazy-loaded content is reused between nested triggers ([#12476](https://github.com/angular/material2/issues/12476)) ([747231a](https://github.com/angular/material2/commit/747231a)), closes [#12467](https://github.com/angular/material2/issues/12467) +* **slide-toggle:** prevent error when disabling while focused ([#12325](https://github.com/angular/material2/issues/12325)) ([80f6929](https://github.com/angular/material2/commit/80f6929)), closes [#12323](https://github.com/angular/material2/issues/12323) +* **table:** error if row definition is on an ng-container ([#12462](https://github.com/angular/material2/issues/12462)) ([39d40f3](https://github.com/angular/material2/commit/39d40f3)), closes [#12460](https://github.com/angular/material2/issues/12460) + + +### Performance Improvements + +* **overlay:** remove detached overlays from the DOM ([#12414](https://github.com/angular/material2/issues/12414)) ([40d8ae4](https://github.com/angular/material2/commit/40d8ae4)), closes [#12341](https://github.com/angular/material2/issues/12341) + + + + +## [6.4.2 chalk-window](https://github.com/angular/material2/compare/6.4.1...6.4.2) (2018-07-30) + + +### Bug Fixes + +* **autocomplete:** remove aria-owns attribute while closed ([#12333](https://github.com/angular/material2/issues/12333)) ([2122b18](https://github.com/angular/material2/commit/2122b18)), closes [#12332](https://github.com/angular/material2/issues/12332) +* **card:** incorrectly inverting inset divider in rtl ([#12285](https://github.com/angular/material2/issues/12285)) ([8a2dc60](https://github.com/angular/material2/commit/8a2dc60)) +* **progress-bar:** query animation not working inside routes with named outlets ([#12350](https://github.com/angular/material2/issues/12350)) ([0c526d3](https://github.com/angular/material2/commit/0c526d3)), closes [#12014](https://github.com/angular/material2/issues/12014) [#12338](https://github.com/angular/material2/issues/12338) +* **snack-bar:** prevent content from overriding configured aria-live message ([#12294](https://github.com/angular/material2/issues/12294)) ([b46689e](https://github.com/angular/material2/commit/b46689e)) +* **ng-update:** support parenthesized directive metadata ([#12314](https://github.com/angular/material2/issues/12314)) ([66416f5](https://github.com/angular/material2/commit/66416f5)) + + +### Performance Improvements + +* **table:** leaking reference through mostRecentCellOutlet ([#12269](https://github.com/angular/material2/issues/12269)) ([7c8e892](https://github.com/angular/material2/commit/7c8e892)), closes [#12259](https://github.com/angular/material2/issues/12259) +* **tree:** leaking reference through mostRecentTreeNode ([#12334](https://github.com/angular/material2/issues/12334)) ([b6f7205](https://github.com/angular/material2/commit/b6f7205)), closes [#12269](https://github.com/angular/material2/issues/12269) + + + + +## [6.4.1 elm-electrode](https://github.com/angular/material2/compare/6.4.0...6.4.1) (2018-07-23) + + +### Bug Fixes + +* **autofill:** avoid firing unnecessary event on initial render of input ([#12116](https://github.com/angular/material2/issues/12116)) ([1fb1fab](https://github.com/angular/material2/commit/1fb1fab)) +* **badge:** hide badges with no content ([#12239](https://github.com/angular/material2/issues/12239)) ([1e847f1](https://github.com/angular/material2/commit/1e847f1)) +* **chips:** losing focus if active chip is deleted ([#11910](https://github.com/angular/material2/issues/11910)) ([646e378](https://github.com/angular/material2/commit/646e378)) +* **drag-drop:** disable text selection on draggable element ([#12204](https://github.com/angular/material2/issues/12204)) ([7a04609](https://github.com/angular/material2/commit/7a04609)) +* **drag-drop:** make `CDK_DROP_CONTAINER` public ([#12214](https://github.com/angular/material2/issues/12214)) ([b9cece4](https://github.com/angular/material2/commit/b9cece4)) +* **drag-drop:** unable to drag last item back into initial container ([#12261](https://github.com/angular/material2/issues/12261)) ([3e0e3c5](https://github.com/angular/material2/commit/3e0e3c5)) +* **menu:** collapse empty menu panel ([#12211](https://github.com/angular/material2/issues/12211)) ([aed3993](https://github.com/angular/material2/commit/aed3993)) +* **menu:** focus indication not visible in high contrast mode ([#12201](https://github.com/angular/material2/issues/12201)) ([6fb6216](https://github.com/angular/material2/commit/6fb6216)) +* **menu:** showing scrollbars on first open in Edge if item width is set ([#12141](https://github.com/angular/material2/issues/12141)) ([ff53295](https://github.com/angular/material2/commit/ff53295)) +* **moment-date-adapter:** not returning utc date when parsing ([#12029](https://github.com/angular/material2/issues/12029)) ([0304ac1](https://github.com/angular/material2/commit/0304ac1)) +* **overlay:** avoid same overlay being added to the keyboard event stack multiple times ([#12222](https://github.com/angular/material2/issues/12222)) ([e587f4b](https://github.com/angular/material2/commit/e587f4b)) +* **ripple:** don't hide directive host in high contrast ([#12168](https://github.com/angular/material2/issues/12168)) ([efedc9b](https://github.com/angular/material2/commit/efedc9b)) +* **schematics:** fix object iteration error in dashboard ([#12216](https://github.com/angular/material2/issues/12216)) ([f2acb51](https://github.com/angular/material2/commit/f2acb51)) +* **slide-toggle:** invert the thumb and slide gesture in rtl ([#12284](https://github.com/angular/material2/issues/12284)) ([fe193f5](https://github.com/angular/material2/commit/fe193f5)) +* **tab-group:** focus change event not firing for keyboard navigation ([#12192](https://github.com/angular/material2/issues/12192)) ([48ece27](https://github.com/angular/material2/commit/48ece27)) +* **table:** unable to sort large numbers in strings ([#12052](https://github.com/angular/material2/issues/12052)) ([dd31521](https://github.com/angular/material2/commit/dd31521)) +* **tabs:** content animation in RTL not working (chrome) ([#12215](https://github.com/angular/material2/issues/12215)) ([f700897](https://github.com/angular/material2/commit/f700897)) +* **tabs:** enable keyboard wrapping and mark disabled tabs ([#12218](https://github.com/angular/material2/issues/12218)) ([0e03aae](https://github.com/angular/material2/commit/0e03aae)) +* **tabs:** reposition tab body on direction change ([#12229](https://github.com/angular/material2/issues/12229)) ([4ac1be3](https://github.com/angular/material2/commit/4ac1be3)) +* **tabs:** ripple overflow in internet explorer ([#12036](https://github.com/angular/material2/issues/12036)) ([09f439a](https://github.com/angular/material2/commit/09f439a)) +* **tabs:** selectedIndex being overwritten if tabs are being added / removed ([#12245](https://github.com/angular/material2/issues/12245)) ([641ec85](https://github.com/angular/material2/commit/641ec85)) +* **tooltip:** interfering with native drag&drop ([#12200](https://github.com/angular/material2/issues/12200)) ([8a4f2c3](https://github.com/angular/material2/commit/8a4f2c3)) + + + # [6.4.0 dimeritium-dandelion](https://github.com/angular/material2/compare/6.3.1...6.4.0) (2018-07-16) @@ -691,9 +857,9 @@ ng update @angular/material # [6.0.0-beta.5](https://github.com/angular/material2/compare/5.2.4...6.0.0-beta.5) (2018-03-23) -This release contains many breaking changes due to the deletion of deprecated targets. We are +This release contains many breaking changes due to the deletion of deprecated targets. We are currently working on a tool that will help migrate your app if you are affected by these changes. -We expect to have the tool ready when we release version 6.0.0. +We expect to have the tool ready when we release version 6.0.0. ### BREAKING CHANGES @@ -955,8 +1121,8 @@ We expect to have the tool ready when we release version 6.0.0. # [5.2.5 cardboard-kangaroo](https://github.com/angular/material2/compare/5.2.4...5.2.5) (2018-04-17) - - + + ### Highlights * Tweak peer deps to avoid warnings when updating Angular to 6.0 diff --git a/e2e/components/radio-e2e.spec.ts b/e2e/components/radio-e2e.spec.ts index b278efa19679..f39e65eb9d67 100644 --- a/e2e/components/radio-e2e.spec.ts +++ b/e2e/components/radio-e2e.spec.ts @@ -9,8 +9,6 @@ describe('radio', () => { element(by.id('water')).click(); expect(element(by.id('water')).getAttribute('class')).toContain('mat-radio-checked'); - await browser.wait(ExpectedConditions.not( - ExpectedConditions.presenceOf(element(by.css('div.mat-ripple-element'))))); expect(element(by.css('input[id=water-input]')).getAttribute('checked')).toBeTruthy(); expect(element(by.css('input[id=leaf-input]')).getAttribute('checked')).toBeFalsy(); @@ -18,9 +16,6 @@ describe('radio', () => { element(by.id('leaf')).click(); expect(element(by.id('leaf')).getAttribute('class')).toContain('mat-radio-checked'); - await browser.wait(ExpectedConditions.not( - ExpectedConditions.presenceOf(element(by.css('div.mat-ripple-element'))))); - expect(element(by.css('input[id=leaf-input]')).getAttribute('checked')).toBeTruthy(); expect(element(by.css('input[id=water-input]')).getAttribute('checked')).toBeFalsy(); }); @@ -38,9 +33,6 @@ describe('radio', () => { element(by.id('leaf')).click(); expect(element(by.id('leaf')).getAttribute('class')).toContain('mat-radio-disabled'); - await browser.wait(ExpectedConditions.not( - ExpectedConditions.presenceOf(element(by.css('div.mat-ripple-element'))))); - expect(element(by.css('input[id=leaf-input]')).getAttribute('disabled')).toBeTruthy(); }); diff --git a/e2e/components/slide-toggle-e2e.spec.ts b/e2e/components/slide-toggle-e2e.spec.ts index 98352dcd640a..34774c9e2a4b 100644 --- a/e2e/components/slide-toggle-e2e.spec.ts +++ b/e2e/components/slide-toggle-e2e.spec.ts @@ -1,4 +1,4 @@ -import {browser, element, by, Key, ExpectedConditions} from 'protractor'; +import {browser, element, by, Key} from 'protractor'; import {expectToExist} from '../util/index'; @@ -13,59 +13,49 @@ describe('slide-toggle', () => { }); it('should change the checked state on click', async () => { - let inputEl = getInput(); + const inputEl = getInput(); expect(inputEl.getAttribute('checked')).toBeFalsy('Expect slide-toggle to be unchecked'); getNormalToggle().click(); expect(inputEl.getAttribute('checked')).toBeTruthy('Expect slide-toggle to be checked'); - - await browser.wait(ExpectedConditions.not( - ExpectedConditions.presenceOf(element(by.css('div.mat-ripple-element'))))); }); it('should change the checked state on click', async () => { - let inputEl = getInput(); + const inputEl = getInput(); expect(inputEl.getAttribute('checked')).toBeFalsy('Expect slide-toggle to be unchecked'); getNormalToggle().click(); expect(inputEl.getAttribute('checked')).toBeTruthy('Expect slide-toggle to be checked'); - await browser.wait(ExpectedConditions.not( - ExpectedConditions.presenceOf(element(by.css('div.mat-ripple-element'))))); }); it('should not change the checked state on click when disabled', async () => { - let inputEl = getInput(); + const inputEl = getInput(); expect(inputEl.getAttribute('checked')).toBeFalsy('Expect slide-toggle to be unchecked'); element(by.css('#disabled-slide-toggle')).click(); expect(inputEl.getAttribute('checked')).toBeFalsy('Expect slide-toggle to be unchecked'); - await browser.wait(ExpectedConditions.not( - ExpectedConditions.presenceOf(element(by.css('div.mat-ripple-element'))))); }); it('should move the thumb on state change', async () => { - let slideToggleEl = getNormalToggle(); - let thumbEl = element(by.css('#normal-slide-toggle .mat-slide-toggle-thumb-container')); - let previousPosition = await thumbEl.getLocation(); + const slideToggleEl = getNormalToggle(); + const thumbEl = element(by.css('#normal-slide-toggle .mat-slide-toggle-thumb-container')); + const previousPosition = await thumbEl.getLocation(); slideToggleEl.click(); - let position = await thumbEl.getLocation(); + const position = await thumbEl.getLocation(); expect(position.x).not.toBe(previousPosition.x); - - await browser.wait(ExpectedConditions.not( - ExpectedConditions.presenceOf(element(by.css('div.mat-ripple-element'))))); }); it('should toggle the slide-toggle on space key', () => { - let inputEl = getInput(); + const inputEl = getInput(); expect(inputEl.getAttribute('checked')).toBeFalsy('Expect slide-toggle to be unchecked'); diff --git a/e2e/components/tabs-e2e.spec.ts b/e2e/components/tabs-e2e.spec.ts index d7ce273b44db..31a30a14ff96 100644 --- a/e2e/components/tabs-e2e.spec.ts +++ b/e2e/components/tabs-e2e.spec.ts @@ -51,17 +51,11 @@ describe('tabs', () => { pressKeys(right); expect(await getFocusStates(tabLabels)).toEqual([false, false, true]); - pressKeys(right); - expect(await getFocusStates(tabLabels)).toEqual([false, false, true]); - pressKeys(left); expect(await getFocusStates(tabLabels)).toEqual([false, true, false]); pressKeys(left); expect(await getFocusStates(tabLabels)).toEqual([true, false, false]); - - pressKeys(left); - expect(await getFocusStates(tabLabels)).toEqual([true, false, false]); }); }); }); diff --git a/guides/creating-a-custom-form-field-control.md b/guides/creating-a-custom-form-field-control.md index 553e36af20b3..84a6d1cf0c06 100644 --- a/guides/creating-a-custom-form-field-control.md +++ b/guides/creating-a-custom-form-field-control.md @@ -159,31 +159,31 @@ private _placeholder: string; #### `ngControl` -This property allows the form field control to specify the `@angular/forms` control that is bound to this component. Since we haven't set up our component to act as a `ControlValueAccessor`, we'll just set this to `null` in our component. +This property allows the form field control to specify the `@angular/forms` control that is bound to this component. Since we haven't set up our component to act as a `ControlValueAccessor`, we'll just set this to `null` in our component. ```ts ngControl: NgControl = null; ``` -It is likely you will want to implement `ControlValueAccessor` so that your component can work with `formControl` and `ngModel`. If you do implement `ControlValueAccessor` you will need to get a reference to the `NgControl` associated with your control and make it publicly available. +It is likely you will want to implement `ControlValueAccessor` so that your component can work with `formControl` and `ngModel`. If you do implement `ControlValueAccessor` you will need to get a reference to the `NgControl` associated with your control and make it publicly available. The easy way is to add it as a public property to your constructor and let dependency injection handle it: ```ts constructor( - ..., + ..., @Optional() @Self() public ngControl: NgControl, ..., ) { } ``` -Note that if your component implements `ControlValueAccessor`, it may already be set up to provide `NG_VALUE_ACCESSOR` (in the `providers` part of the component's decorator, or possibly in a module declaration). If so you may get a *cannot instantiate cyclic dependency* error. +Note that if your component implements `ControlValueAccessor`, it may already be set up to provide `NG_VALUE_ACCESSOR` (in the `providers` part of the component's decorator, or possibly in a module declaration). If so you may get a *cannot instantiate cyclic dependency* error. To resolve this, remove the `NG_VALUE_ACCESSOR` provider and instead set the value accessor directly: ```ts constructor( - ..., + ..., @Optional() @Self() public ngControl: NgControl, ..., ) { @@ -207,7 +207,7 @@ need to remember to emit on the `stateChanges` stream so change detection can ha ```ts focused = false; -constructor(fb: FormBuilder, private fm: FocusMonitor, private elRef: ElementRef) { +constructor(fb: FormBuilder, private fm: FocusMonitor, private elRef: ElementRef) { ... fm.monitor(elRef.nativeElement, true).subscribe(origin => { this.focused = !!origin; diff --git a/guides/getting-started.md b/guides/getting-started.md index 5c3d8a7b544b..e8d9f65ecdbd 100644 --- a/guides/getting-started.md +++ b/guides/getting-started.md @@ -3,50 +3,45 @@ 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 and Angular CDK +### Step 1: Install Angular Material, Angular CDK and Angular Animations You can use either the npm or yarn command-line tool to install packages. Use whichever is appropriate for your project in the examples below. #### NPM ```bash -npm install --save @angular/material @angular/cdk +npm install --save @angular/material @angular/cdk @angular/animations ``` #### Yarn ```bash -yarn add @angular/material @angular/cdk +yarn add @angular/material @angular/cdk @angular/animations ``` -#### Alternative: Snapshot Build +#### Alternative 1: Snapshot Build 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. #### NPM ```bash -npm install --save angular/material2-builds angular/cdk-builds +npm install --save angular/material2-builds angular/cdk-builds angular/animations-builds ``` #### Yarn ```bash -yarn add angular/material2-builds angular/cdk-builds +yarn add angular/material2-builds angular/cdk-builds angular/animations-builds ``` +#### Alternative 2: Angular Devkit 6+ -### Step 2: Animations +Using the Angular CLI `ng add` command will update your Angular project with the correct dependencies, perform configuration changes and execute initialization code. -Some Material components depend on the Angular animations module in order to be able to do -more advanced transitions. If you want these animations to work in your app, you have to -install the `@angular/animations` module and include the `BrowserAnimationsModule` in your app. - -#### NPM ```bash -npm install --save @angular/animations +ng add @angular/material ``` -#### Yarn -```bash -yarn add @angular/animations -``` +### Step 2: Configure animations + +Once the animations package is installed, import `BrowserAnimationsModule` into your application to enable animations support. ```ts import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; @@ -59,7 +54,7 @@ import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; export class PizzaPartyAppModule { } ``` -If you don't want to add another dependency to your project, you can use the `NoopAnimationsModule`. +Alternatively, you can disable animations by importing `NoopAnimationsModule`. ```ts import {NoopAnimationsModule} from '@angular/platform-browser/animations'; diff --git a/guides/theming.md b/guides/theming.md index 411a13118237..79f1f20318f0 100644 --- a/guides/theming.md +++ b/guides/theming.md @@ -16,7 +16,7 @@ a theme consists of: In Angular Material, all theme styles are generated _statically_ at build-time so that your app doesn't have to spend cycles generating theme styles on startup. -[1]: https://material.google.com/style/color.html#color-color-palette +[1]: https://material.io/archive/guidelines/style/color.html#color-color-palette ### Using a pre-built theme Angular Material comes prepackaged with several pre-built theme css files. These theme files also @@ -94,7 +94,7 @@ $candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy- You only need this single Sass file; you do not need to use Sass to style the rest of your app. If you are using the Angular CLI, support for compiling Sass to css is built-in; you only have to -add a new entry to the `"styles"` list in `angular-cli.json` pointing to the theme +add a new entry to the `"styles"` list in `angular.json` pointing to the theme file (e.g., `unicorn-app-theme.scss`). If you're not using the Angular CLI, you can use any existing Sass tooling to build the file (such diff --git a/package-lock.json b/package-lock.json index 85c073011a09..10c5c41769af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "material2-srcs", - "version": "6.3.3", + "version": "6.4.7", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -14,6 +14,375 @@ "chokidar": "^2.0.3", "rxjs": "^6.0.0", "source-map": "^0.5.6" + }, + "dependencies": { + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.1.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@angular-devkit/schematics": { @@ -81,133 +450,6 @@ "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", "tsickle": "^0.27.2" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } } }, "@angular/core": { @@ -302,217 +544,161 @@ "dev": true }, "@firebase/app": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.2.0.tgz", - "integrity": "sha512-hu+HGRXER3URCb8sZdd4f3QzvVWfuKvJoqd1mlEx9vWQ0fMpFqMeYgOaO7+x7PkNzamMHetItfws5TK9pmnStQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.1.10.tgz", + "integrity": "sha512-2GTXt3b2QZXkmx6/5nNJq+pEN/VTjAG55MFJS1WMoLVZkwKuNpWNk65QVyPaoL88x1iHtuLqAMFgJUOnhOg+Pw==", "dev": true, "requires": { - "@firebase/app-types": "0.2.0", - "@firebase/util": "0.1.11", - "tslib": "1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - } + "@firebase/app-types": "0.1.2", + "@firebase/util": "0.1.10", + "tslib": "^1.9.0" } }, "@firebase/app-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.2.0.tgz", - "integrity": "sha512-0hTbuFmTr5sBvn9r2w5nk9FeMkuscj+ClPUBimtOkOnoLvIWRICILRiPTV1CX+7Th4EJ7y17UWx8jieY0f8GtA==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.1.2.tgz", + "integrity": "sha512-bCIZGeMtP0ibrXNNaU214/1tRNw0jHnir/cfiAao1gjUyIS7RzOTQoH+zbwPJNEwUqJ0T3ykw/Tv4/khGqbVBg==", "dev": true }, "@firebase/auth": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.4.2.tgz", - "integrity": "sha512-gMEKuKDdO2oB9c2zmj6NlFOY1ynzummXuUWz6cFgUdNd/Pw5ZpkOlGzS7yxZ7NI0dZXV/xccamN7CN9/vol+cA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.4.1.tgz", + "integrity": "sha512-+NRwKsWqccJ/yOmJ/HpQpB4hTVjS7f/dGxQvMztPsftpqmW+1E/MmZy1BWBMfI5YzhdXd5e/u9NZb+sz378U5Q==", "dev": true, "requires": { - "@firebase/auth-types": "0.2.1" + "@firebase/auth-types": "0.2.0" } }, "@firebase/auth-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.2.1.tgz", - "integrity": "sha512-zjObje4RYJ7RJHt1z8A6xGnfLw/5RwUvk7AHrYwS4N3Mq17j/ZumBvYlAQz4k8sNe9GFDmjmHa30ezFWOglLEQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.2.0.tgz", + "integrity": "sha512-3Ny3xP0DeeeFz92093PHyloIDSFhzajib0X6BZZkz3hS3c/qt+xvACTKpz1jHrQTQAhNL8fGBvO8LsZHrnDT0Q==", "dev": true }, "@firebase/database": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.2.2.tgz", - "integrity": "sha512-iTNEN33D3V0hAG2hdx+guFBXaN4hcFS2k2EGp/bzNviAG7n2AotMscdbkS6xDS2e3Uk2/D3lfibHQO4zgJ3LIg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.2.1.tgz", + "integrity": "sha512-IxONy7MM+Vmnx7bupBujmUyaTqE0n9Jt5xW/2gyLRc9i2wOxNR0XDlJ3Oc12+bksW/zMXHJU1hNO1jxRmIKmsw==", "dev": true, "requires": { - "@firebase/database-types": "0.2.1", - "@firebase/logger": "0.1.1", - "@firebase/util": "0.1.11", + "@firebase/database-types": "0.2.0", + "@firebase/logger": "0.1.0", + "@firebase/util": "0.1.10", "faye-websocket": "0.11.1", - "tslib": "1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - } + "tslib": "^1.9.0" } }, "@firebase/database-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.2.1.tgz", - "integrity": "sha512-LyvTpLImnhSTyHfPGcBxhD0tHw+R7FUb+als23Ad5hPCcGxlRgLhA+ukrhFIGA8Mt8FYHWgFm7TCX4YDRDxK6w==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.2.0.tgz", + "integrity": "sha512-QFrxlLABVbZAVJqw1XNkSYZK22qPjpE3U5eM1SO7Htx69TrIgX7tb1/+BJnFkb3AKUD33tAr22Z4XVth5Ys46A==", "dev": true }, "@firebase/firestore": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-0.4.1.tgz", - "integrity": "sha512-RsceKkGQyiTJq/9odss6v+6KgJVLr5H8hgVO/u+d1Is20cQXJFpDjrgcoGairVb4S/jav2LV1/bHXj3HVLObvw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-0.3.7.tgz", + "integrity": "sha512-kyy4i5qTPJPnNkYGx44aecLjFfjpTpDQvgqotzX6cEFSpkxCx53tzRc+XobVaah6WZzbvK2TAYG2WA59ROR+1w==", "dev": true, "requires": { - "@firebase/firestore-types": "0.3.0", - "@firebase/logger": "0.1.1", - "@firebase/webchannel-wrapper": "0.2.8", - "grpc": "1.10.1", - "tslib": "1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - } + "@firebase/firestore-types": "0.2.2", + "@firebase/logger": "0.1.0", + "@firebase/webchannel-wrapper": "0.2.7", + "grpc": "^1.9.1", + "tslib": "^1.9.0" } }, "@firebase/firestore-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-0.3.0.tgz", - "integrity": "sha512-pWqIALmvp91ELeFiiAOIDVvcCxkLxXffp5KYNL1I/mNgqe2CyGoNB6+pUb/S+FH3oCh/HWHBW+0lXDszcP42aA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-0.2.2.tgz", + "integrity": "sha512-yuC07Zi8p0myCQoU62O0fnGcNEcWZnKEGcQ1tj71Qh3E3Dw7qPJ75kXeeL95Bh1PHI0+TqAcDTEb9yVG9xIUVw==", "dev": true }, "@firebase/functions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.1.1.tgz", - "integrity": "sha512-olSryAPNcH47WFCUmooNgO4P61dmlUEPVYOa0urTLiQh+8M8E7RuDWcqxxxiPk4BCN/l2ZeO0uCDsrzBMX4OqA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.1.0.tgz", + "integrity": "sha512-cZpD4NO8v84pbgR6Fk8+DW4KGLKltmu20+WF8lJQao7H3M+10QecCvOfaXanUjxjVZzCFXOJ3EIqoNLT/HQciQ==", "dev": true, "requires": { - "@firebase/functions-types": "0.1.1", - "@firebase/messaging-types": "0.1.3", - "isomorphic-fetch": "2.2.1" + "@firebase/functions-types": "0.1.0", + "@firebase/messaging-types": "^0.1.1", + "isomorphic-fetch": "^2.2.1" } }, "@firebase/functions-types": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.1.1.tgz", - "integrity": "sha512-DMCQAuSafYChef2Wa4yYNPeToEDggnlaUHvseKxPzUwOVVmPdr9dxmqQW+UKeGYeUHfiTWFzvsrk8u1ifyvTZA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.1.0.tgz", + "integrity": "sha512-Mm0e1OJqLaGJoBxhKC/eYfSo+yE39GpR1fRszintKmW5VKf3JMgmLrHTs/lxvtg03RQXgjdqJIJnRGFic5Z4kg==", "dev": true }, "@firebase/logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-5jn3HHbEfdOwychyIEIkP1cik+MW/vvoOavTOzwDkH+fv6Bx+HBUOzh09M7sCYzXFtKzjbUax9+g39mJNBLklQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.0.tgz", + "integrity": "sha512-/abxM9/l0V9WzNXvSonI2imVqORVhyCVS8yJ1O2rsRmNzw3FIPPIt0BuTvmCBH1oh1uDtZIn2Aar1p7zF69KWg==", "dev": true }, "@firebase/messaging": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.2.4.tgz", - "integrity": "sha512-bgnIhKETgA8ZgWXFmF0+RLqr93/nxqnncRndxNcKTPyq4syah703NeTtaJCMR3LWrfKGV9blpEBogtX3JmJK1g==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.2.3.tgz", + "integrity": "sha512-q7O+xULmqyKsUN1GD+cY0zKcfWwyxLvICq2jKsw4RaJCRbvETRpycBI3eFO37L7AyGa8Ho9Ll0OJu7dIxFcJoQ==", "dev": true, "requires": { - "@firebase/messaging-types": "0.1.3", - "@firebase/util": "0.1.11", - "tslib": "1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - } + "@firebase/messaging-types": "0.1.2", + "@firebase/util": "0.1.10", + "tslib": "^1.9.0" } }, "@firebase/messaging-types": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.1.3.tgz", - "integrity": "sha512-kDixnQujUuwvqc12iFLd6ygb+cdCCXCNeJpQD7jV0mnYMbE1Sp4Y7sl2G7N7r0kcoJPHUQHERBkZlw2N3xyJCw==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.1.2.tgz", + "integrity": "sha512-4Oycm2JiDaLp9jUy4O25gD/B9Hqdy11hGjSNE0rzhVox5d0e1RF08QCwVt9xpjtBLRgEpPLyD9dPeSu4YK0Y4Q==", "dev": true }, "@firebase/polyfill": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.1.tgz", - "integrity": "sha512-TkmIU4OZeE+rZoQFvq9qYsHv3IYeWahvPUTknUiqN14XJ1777ZEZ+oHBM116/R/Ej3kA5EZxhahqlRHOOD/Dwg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.0.tgz", + "integrity": "sha512-nE8LMXBhvWdHBlxtjkZkid8WzowBbxUC+mcYdsEbvx5A7hWswisFZO8XwoKnM1jYYSOpDrtxFmyqWBAc15DmRg==", "dev": true, "requires": { - "core-js": "2.5.5", - "promise-polyfill": "7.1.2", - "whatwg-fetch": "2.0.4" - }, - "dependencies": { - "core-js": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", - "dev": true - } + "promise-polyfill": "^7.1.0", + "tslib": "^1.9.0", + "whatwg-fetch": "^2.0.3" } }, "@firebase/storage": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.1.9.tgz", - "integrity": "sha512-CrlreoXIlWNAAHnOAlP0KpZ2aM8s4QFOcrIhBE3f7vE6h30TuBuhFFra4slUykCuUflyVjBYlea6ph0fJsJr0w==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.1.8.tgz", + "integrity": "sha512-g0xYwJbgOuAaAJy5iAoEymS77m3oVqFh9IAF3A4LvqOC9q3v3ubSSYjpNHRPZstO68pMDKsNrqb2TcJgx92kSA==", "dev": true, "requires": { - "@firebase/storage-types": "0.1.3", - "tslib": "1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - } + "@firebase/storage-types": "0.1.2", + "tslib": "^1.9.0" } }, "@firebase/storage-types": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.1.3.tgz", - "integrity": "sha512-xM939ObH7MLDhhrEi/UyEDj87b3AGypGp5YPpEOwvtL2KpF7VQf7g715LoaWmhGd4+e1MHFMCktQbejkpkj63A==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.1.2.tgz", + "integrity": "sha512-/nL93m2lIqzx4FajVnskn2YTDEj0ym53LCZegZpAPxm4GIkOQ8UhzzfHFfHJJCygb58xRszDkDuRlpJlakO4pA==", "dev": true }, "@firebase/util": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.1.11.tgz", - "integrity": "sha512-xUMugOJBSKVKOjrKJIVeIr4Z/6iDxSuOlOJRdz0xsOBJ9+lZVxGZs0U4oZmszWhQER1zzR+EQWIYFYePt6/QMQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.1.10.tgz", + "integrity": "sha512-XEogRfUQBZ4T37TMq/3ZbuiTdRAKX8hF3TgJglUZNCJf/6QnQ+jlupCuMAXBqCGfw2Mw0m2matoCUBWpsyevOA==", "dev": true, "requires": { - "tslib": "1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - } + "tslib": "^1.9.0" } }, "@firebase/webchannel-wrapper": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.8.tgz", - "integrity": "sha512-ToJbeJnxDc3O325FvcKVb3yHO1hvgHjCFvhKol6Z17GiB7vL104POjFQT4RnlLiAGSRCBAMxinDec9y9vQYdyg==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.7.tgz", + "integrity": "sha512-RYrV2nzDdZkUBqC/MHmySy0QF999KCA9aOU8ajc4wlZl9SBsoaq5B673fVUtX2otPaDinbbVWqkWXeU/AsEhfw==", "dev": true }, "@google-cloud/common": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", - "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", + "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", "dev": true, "requires": { "array-uniq": "^1.0.3", @@ -522,7 +708,7 @@ "duplexify": "^3.5.0", "ent": "^2.2.0", "extend": "^3.0.1", - "google-auto-auth": "^0.10.0", + "google-auto-auth": "^0.9.0", "is": "^3.2.0", "log-driver": "1.2.7", "methmeth": "^1.1.0", @@ -535,53 +721,117 @@ "through2": "^2.0.3" } }, + "@google-cloud/common-grpc": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.6.1.tgz", + "integrity": "sha512-pspOZVfmrCTP0svTNwFE8nYJsQp5rTUaeUpJwpgslDk5tDWFbYT3dZkANbiURcTSq0mo6hZmd+M5rPIzWMVUmA==", + "dev": true, + "requires": { + "@google-cloud/common": "^0.17.0", + "dot-prop": "^4.2.0", + "duplexify": "^3.5.1", + "extend": "^3.0.1", + "grpc": "^1.10.0", + "is": "^3.2.0", + "modelo": "^4.2.0", + "retry-request": "^3.3.1", + "through2": "^2.0.3" + }, + "dependencies": { + "@google-cloud/common": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", + "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", + "dev": true, + "requires": { + "array-uniq": "^1.0.3", + "arrify": "^1.0.1", + "concat-stream": "^1.6.0", + "create-error-class": "^3.0.2", + "duplexify": "^3.5.0", + "ent": "^2.2.0", + "extend": "^3.0.1", + "google-auto-auth": "^0.10.0", + "is": "^3.2.0", + "log-driver": "1.2.7", + "methmeth": "^1.1.0", + "modelo": "^4.2.0", + "request": "^2.79.0", + "retry-request": "^3.0.0", + "split-array-stream": "^1.0.0", + "stream-events": "^1.0.1", + "string-format-obj": "^1.1.0", + "through2": "^2.0.3" + } + }, + "google-auto-auth": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.10.0.tgz", + "integrity": "sha512-R6m473OqgZacPvlidJ0aownTlUWyLy654ugjKSXyi1ffIicXlXg3wMfse9T9zxqG6w01q6K1iG+b7dImMkVJ2Q==", + "dev": true, + "requires": { + "async": "^2.3.0", + "gcp-metadata": "^0.6.1", + "google-auth-library": "^1.3.1", + "request": "^2.79.0" + } + } + } + }, "@google-cloud/firestore": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-0.14.1.tgz", - "integrity": "sha512-azZ4LIUDxI2Tc0Tamt/+ksme6Q9iwwxYt7PePxSlrEnO28NUZ4a+n6oEXAtfzDvcbtimI6gAL58cTWdvebMQFg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-0.13.1.tgz", + "integrity": "sha512-70PPCDg++AGx4OGW/FhDoDtIh4Z2WuwPMkHkvFWNvEDGghCxGrYgRvpCsfcZBU0TLYpcbsndrweLp972cwItrQ==", "dev": true, "requires": { - "@google-cloud/common": "^0.18.7", + "@google-cloud/common": "^0.17.0", + "@google-cloud/common-grpc": "^0.6.0", "bun": "^0.0.12", "deep-equal": "^1.0.1", "extend": "^3.0.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^0.16.1", - "google-proto-files": "^0.15.1", + "google-gax": "^0.16.0", "is": "^3.2.1", - "safe-buffer": "^5.1.2", + "safe-buffer": "^5.1.1", "through2": "^2.0.3" }, "dependencies": { "@google-cloud/common": { - "version": "0.18.9", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.18.9.tgz", - "integrity": "sha512-P5jtyfOCF84fzVcT/36XKARRrbCOqozYBliDd7btQ96GuEqKzjPVjxeE4EzdeRQ8QChBpHLrbONsU63Jprw73A==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", + "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", "dev": true, "requires": { - "@types/duplexify": "^3.5.0", - "@types/request": "^2.47.0", + "array-uniq": "^1.0.3", "arrify": "^1.0.1", - "axios": "^0.18.0", - "duplexify": "^3.5.4", + "concat-stream": "^1.6.0", + "create-error-class": "^3.0.2", + "duplexify": "^3.5.0", "ent": "^2.2.0", "extend": "^3.0.1", - "google-auth-library": "^1.4.0", - "is": "^3.2.1", - "pify": "^3.0.0", - "request": "^2.85.0", - "retry-request": "^3.3.1", - "split-array-stream": "^2.0.0", - "stream-events": "^1.0.4" + "google-auto-auth": "^0.10.0", + "is": "^3.2.0", + "log-driver": "1.2.7", + "methmeth": "^1.1.0", + "modelo": "^4.2.0", + "request": "^2.79.0", + "retry-request": "^3.0.0", + "split-array-stream": "^1.0.0", + "stream-events": "^1.0.1", + "string-format-obj": "^1.1.0", + "through2": "^2.0.3" } }, - "split-array-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", - "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", + "google-auto-auth": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.10.0.tgz", + "integrity": "sha512-R6m473OqgZacPvlidJ0aownTlUWyLy654ugjKSXyi1ffIicXlXg3wMfse9T9zxqG6w01q6K1iG+b7dImMkVJ2Q==", "dev": true, "requires": { - "is-stream-ended": "^0.1.4" + "async": "^2.3.0", + "gcp-metadata": "^0.6.1", + "google-auth-library": "^1.3.1", + "request": "^2.79.0" } } } @@ -615,63 +865,6 @@ "yargs": "11.0.0" }, "dependencies": { - "@google-cloud/common": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", - "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", - "dev": true, - "optional": true, - "requires": { - "array-uniq": "^1.0.3", - "arrify": "^1.0.1", - "concat-stream": "^1.6.0", - "create-error-class": "^3.0.2", - "duplexify": "^3.5.0", - "ent": "^2.2.0", - "extend": "^3.0.1", - "google-auto-auth": "^0.9.0", - "is": "^3.2.0", - "log-driver": "1.2.7", - "methmeth": "^1.1.0", - "modelo": "^4.2.0", - "request": "^2.79.0", - "retry-request": "^3.0.0", - "split-array-stream": "^1.0.0", - "stream-events": "^1.0.1", - "string-format-obj": "^1.1.0", - "through2": "^2.0.3" - } - }, - "@google-cloud/storage": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.6.0.tgz", - "integrity": "sha512-yQ63bJYoiwY220gn/KdTLPoHppAPwFHfG7VFLPwJ+1R5U1eqUN5XV2a7uPj1szGF8/gxlKm2UbE8DgoJJ76DFw==", - "dev": true, - "optional": true, - "requires": { - "@google-cloud/common": "^0.16.1", - "arrify": "^1.0.0", - "async": "^2.0.1", - "compressible": "^2.0.12", - "concat-stream": "^1.5.0", - "create-error-class": "^3.0.2", - "duplexify": "^3.5.0", - "extend": "^3.0.0", - "gcs-resumable-upload": "^0.9.0", - "hash-stream-validation": "^0.2.1", - "is": "^3.0.1", - "mime": "^2.2.0", - "mime-types": "^2.0.8", - "once": "^1.3.1", - "pumpify": "^1.3.3", - "request": "^2.83.0", - "safe-buffer": "^5.1.1", - "snakeize": "^0.1.0", - "stream-events": "^1.0.1", - "string-format-obj": "^1.0.0", - "through2": "^2.0.0" - } - }, "ajv": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.1.1.tgz", @@ -690,10 +883,17 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", + "dev": true, + "optional": true + }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", "dev": true, "optional": true, "requires": { @@ -714,6 +914,7 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", "dev": true, + "optional": true, "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", @@ -723,47 +924,12 @@ "xdg-basedir": "^3.0.0" } }, - "gcs-resumable-upload": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.9.0.tgz", - "integrity": "sha512-+Zrmr0JKO2y/2mg953TW6JLu+NAMHqQsKzqCm7CIT24gMQakolPJCMzDleVpVjXAqB7ZCD276tcUq2ebOfqTug==", - "dev": true, - "optional": true, - "requires": { - "buffer-equal": "^1.0.0", - "configstore": "^3.0.0", - "google-auto-auth": "^0.9.0", - "pumpify": "^1.3.3", - "request": "^2.81.0", - "stream-events": "^1.0.1", - "through2": "^2.0.0" - } - }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "^2.3.0", - "gcp-metadata": "^0.6.1", - "google-auth-library": "^1.3.1", - "request": "^2.79.0" - } - }, "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", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true, - "optional": true - }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -805,13 +971,6 @@ "os-tmpdir": "~1.0.2" } }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true, - "optional": true - }, "winston": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz", @@ -827,13 +986,6 @@ "stack-trace": "0.0.x" }, "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", - "dev": true, - "optional": true - }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -867,12 +1019,12 @@ } }, "@google-cloud/storage": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.7.0.tgz", - "integrity": "sha512-QaAxzCkbhspwajoaEnT0GcnQcpjPRcBrHYuQsXtD05BtOJgVnHCLXSsfUiRdU0nVpK+Thp7+sTkQ0fvk5PanKg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.6.0.tgz", + "integrity": "sha512-yQ63bJYoiwY220gn/KdTLPoHppAPwFHfG7VFLPwJ+1R5U1eqUN5XV2a7uPj1szGF8/gxlKm2UbE8DgoJJ76DFw==", "dev": true, "requires": { - "@google-cloud/common": "^0.17.0", + "@google-cloud/common": "^0.16.1", "arrify": "^1.0.0", "async": "^2.0.1", "compressible": "^2.0.12", @@ -880,19 +1032,19 @@ "create-error-class": "^3.0.2", "duplexify": "^3.5.0", "extend": "^3.0.0", - "gcs-resumable-upload": "^0.10.2", + "gcs-resumable-upload": "^0.9.0", "hash-stream-validation": "^0.2.1", "is": "^3.0.1", "mime": "^2.2.0", "mime-types": "^2.0.8", "once": "^1.3.1", - "pumpify": "^1.5.1", - "request": "^2.85.0", + "pumpify": "^1.3.3", + "request": "^2.83.0", "safe-buffer": "^5.1.1", "snakeize": "^0.1.0", "stream-events": "^1.0.1", - "through2": "^2.0.0", - "xdg-basedir": "^3.0.0" + "string-format-obj": "^1.0.0", + "through2": "^2.0.0" } }, "@mrmlnc/readdir-enhanced": { @@ -905,12 +1057,6 @@ "glob-to-regexp": "^0.3.0" } }, - "@nodelib/fs.stat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz", - "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==", - "dev": true - }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -993,42 +1139,18 @@ "dev": true, "optional": true }, - "@types/caseless": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", - "integrity": "sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==", - "dev": true - }, "@types/chalk": { "version": "0.4.31", "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=", "dev": true }, - "@types/duplexify": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.5.0.tgz", - "integrity": "sha512-+aZCCdxuR/Q6n58CBkXyqGqimIqpYUcFLfBXagXv7e9TdJUevqkKhzopBuRz3RB064sQxnJnhttHOkK/O93Ouw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/events": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", "dev": true }, - "@types/form-data": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", - "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/fs-extra": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-4.0.8.tgz", @@ -1050,9 +1172,9 @@ } }, "@types/google-cloud__storage": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@types/google-cloud__storage/-/google-cloud__storage-1.1.8.tgz", - "integrity": "sha512-tg+DwcUaeqC2lHvvZ3SLowrzco2zUVovZvp89DXhMXY0FiyyKlyUQ2ZStbG4/NC78+xXiU2mPX8JEW0fqdbkRg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@types/google-cloud__storage/-/google-cloud__storage-1.1.7.tgz", + "integrity": "sha512-010Llp+5ze+XWWmZuLDxs0pZgFjOgtJQVt9icJ0Ed67ZFLq7PnXkYx8x/k9nwDojR5/X4XoLPNqB1F627TScdQ==", "dev": true, "requires": { "@types/node": "*" @@ -1076,9 +1198,9 @@ "dev": true }, "@types/jasmine": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.8.tgz", - "integrity": "sha512-OJSUxLaxXsjjhob2DBzqzgrkLmukM3+JMpRp0r0E4HTdT1nwDCWhaswjYxazPij6uOdzHCJfNbDjmQ1/rnNbCg==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.6.tgz", + "integrity": "sha512-clg9raJTY0EOo5pVZKX3ZlMjlYzVU73L71q5OV1jhE2Uezb7oF94jh4CvwrW6wInquQAdhOxJz5VDF2TLUGmmA==", "dev": true }, "@types/long": { @@ -1109,9 +1231,9 @@ "dev": true }, "@types/node": { - "version": "7.0.67", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.67.tgz", - "integrity": "sha512-DUioEWBd0NG30G1/wI0amNN/sSJ/xuX4/YWm4nNa+bUU6swuS7CF+sH/nifu+SPy5BFqRzQEyEWvi9zIDVP+Lw==", + "version": "7.0.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.59.tgz", + "integrity": "sha512-FRRJ2hkgzySTgLnwQhXQCGkLRu1ImISVu/YKYWXCIbF6261nqXwDPQ+6xPzZw+c2Il2Zx2JfM/t0tCaw8wzbmA==", "dev": true }, "@types/orchestrator": { @@ -1125,23 +1247,11 @@ } }, "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.0.tgz", + "integrity": "sha512-sWj7AMiG0fYmta6ug1ublLjtj/tqn+CnCZeo7yswR1ykxel0FOWFGdWviTcGSNAMmtLbycDqbg6w98VPFKJmbw==", "dev": true }, - "@types/request": { - "version": "2.47.1", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.1.tgz", - "integrity": "sha512-TV3XLvDjQbIeVxJ1Z3oCTDk/KuYwwcNKVwz2YaT0F5u86Prgc4syDAp6P96rkTQQ4bIdh+VswQIC9zS6NjY7/g==", - "dev": true, - "requires": { - "@types/caseless": "*", - "@types/form-data": "*", - "@types/node": "*", - "@types/tough-cookie": "*" - } - }, "@types/run-sequence": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/run-sequence/-/run-sequence-0.0.29.tgz", @@ -1168,12 +1278,6 @@ "@types/node": "*" } }, - "@types/tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==", - "dev": true - }, "@types/vinyl": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz", @@ -1184,14 +1288,14 @@ } }, "@webcomponents/custom-elements": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.1.2.tgz", - "integrity": "sha512-gVhuQHLTrQ28v1qMp0WGPSCBukFL7qAlemxCf19TnuNZ0bO9KPF72bfhH6Hpuwdu9TptIMGNlqrr9PzqrzfZFQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.1.0.tgz", + "integrity": "sha512-M872VYia7mXvtgsxKTTNBNPDYNLEvM3DDd0reyNusd/5weWH0XouKYYgp68b6gvWdMPHcMomg3SzUZaOo/bv9w==" }, "JSONStream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", - "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", "dev": true, "requires": { "jsonparse": "^1.2.0", @@ -1199,9 +1303,9 @@ } }, "a-sync-waterfall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.0.tgz", - "integrity": "sha1-OOgxnXk3niRiiEW1O5ZyKyng5Hw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", "dev": true }, "abab": { @@ -1227,9 +1331,9 @@ } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", "dev": true }, "acorn-es7-plugin": { @@ -1281,30 +1385,30 @@ "dev": true }, "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", + "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" } }, "ajv": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { + "co": "^4.6.0", "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", "dev": true }, "align-text": { @@ -1316,17 +1420,6 @@ "kind-of": "^3.0.2", "longest": "^1.0.1", "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "amdefine": { @@ -1358,7 +1451,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "optional": true, @@ -1436,13 +1529,13 @@ "dev": true }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "app-module-path": { @@ -1452,9 +1545,9 @@ "dev": true }, "app-root-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", - "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", "dev": true }, "aproba": { @@ -1500,9 +1593,9 @@ "dev": true }, "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "requires": { "delegates": "^1.0.0", @@ -1516,21 +1609,16 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } } }, "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } }, "arr-flatten": { "version": "1.1.0", @@ -1587,9 +1675,9 @@ "dev": true }, "array-iterate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", - "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.1.tgz", + "integrity": "sha1-hlv3+K851rCYLGCQKRSsdrwBCPY=", "dev": true }, "array-parallel": { @@ -1626,9 +1714,9 @@ "dev": true }, "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, "arraybuffer.slice": { @@ -1697,12 +1785,12 @@ "optional": true }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.14.0" } }, "async-each": { @@ -1730,9 +1818,9 @@ "dev": true }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", + "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", "dev": true }, "autoprefixer": { @@ -1779,7 +1867,7 @@ }, "axios": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "dev": true, "requires": { @@ -1821,9 +1909,9 @@ "dev": true }, "bail": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", - "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.2.tgz", + "integrity": "sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q=", "dev": true }, "balanced-match": { @@ -1884,6 +1972,18 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -1899,6 +1999,12 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=", + "dev": true + }, "basic-auth": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", @@ -1906,14 +2012,6 @@ "dev": true, "requires": { "safe-buffer": "5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } } }, "basic-auth-connect": { @@ -1929,9 +2027,9 @@ "dev": true }, "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "dev": true, "optional": true, "requires": { @@ -2014,9 +2112,9 @@ } }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", "dev": true }, "body-parser": { @@ -2037,17 +2135,20 @@ "type-is": "~1.6.15" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true } } }, @@ -2088,32 +2189,14 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browserslist": { @@ -2145,6 +2228,15 @@ "semver": "~5.0.1" } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "https-proxy-agent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", @@ -2184,6 +2276,15 @@ "semver": "~5.0.1" } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "https-proxy-agent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", @@ -2229,8 +2330,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true, - "optional": true + "dev": true }, "buffer-equal-constant-time": { "version": "1.0.1", @@ -2245,9 +2345,10 @@ "dev": true }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true }, "buffer-more-ints": { "version": "0.0.2", @@ -2295,15 +2396,6 @@ "nodemailer-fetch": "1.6.0", "nodemailer-shared": "1.1.0", "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - } } }, "builtin-modules": { @@ -2377,6 +2469,14 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "cacheable-request": { @@ -2449,15 +2549,15 @@ } }, "caniuse-db": { - "version": "1.0.30000865", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000865.tgz", - "integrity": "sha1-gv+2TUD3VnYgqsAtOmMgeWiavGs=", + "version": "1.0.30000824", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000824.tgz", + "integrity": "sha1-u6P/QlKW4EyqN/5CYlkganBWVRs=", "dev": true }, "caniuse-lite": { - "version": "1.0.30000865", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", - "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==", + "version": "1.0.30000824", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000824.tgz", + "integrity": "sha512-KcgeAvVkpzN05Mjiyz5vf0le5AWRwfRGqGkKXWWsdrLQd4EIBevReSy7mYCdwSq7MqKrmJ0lEQEkUQE2VspRRw==", "dev": true }, "canonical-path": { @@ -2488,9 +2588,9 @@ } }, "ccount": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", - "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.2.tgz", + "integrity": "sha1-U7ai+BW7d7nChx97mnLDol8djok=", "dev": true }, "center-align": { @@ -2522,7 +2622,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -2574,48 +2674,44 @@ "dev": true }, "character-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", - "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.1.tgz", + "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=", "dev": true }, "character-entities-html4": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", - "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.1.tgz", + "integrity": "sha1-NZoqSg9+KdPcKsmb2+Ie45Q46lA=", "dev": true }, "character-entities-legacy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", - "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz", + "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=", "dev": true }, "character-reference-invalid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", - "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz", + "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=", "dev": true }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "^2.0.0", + "anymatch": "^1.3.0", "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", "inherits": "^2.0.1", "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "is-glob": "^2.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.0.0" } }, "chownr": { @@ -2625,9 +2721,9 @@ "dev": true }, "circular-json": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.5.tgz", - "integrity": "sha512-13YaR6kiz0kBNmIVM87Io8Hp7bWOo4r61vkEANy8iH9R9bc6avud/1FT0SBpqR1RpIQADOh/Q+yHZDA1iL6ysA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, "cjson": { @@ -2659,6 +2755,12 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, @@ -2669,6 +2771,14 @@ "dev": true, "requires": { "source-map": "0.5.x" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "cli-boxes": { @@ -2714,15 +2824,15 @@ }, "dependencies": { "colors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", - "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", + "integrity": "sha512-s8+wktIuDSLffCywiwSxQOMqtPxML11a/dtHE17tMn4B1MSWw/C22EKf7M2KGUBcDaVFEGT+S8N02geDXeuNKg==", "dev": true, "optional": true }, "lodash": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", "dev": true, "optional": true @@ -2747,9 +2857,9 @@ } }, "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, "clone-buffer": { @@ -2808,9 +2918,9 @@ "dev": true }, "codelyzer": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.4.2.tgz", - "integrity": "sha512-tW796ECKMAynFtl/yyS5NRYhufbT3CEKjjMQ450kUeCcQlK7OIqD9VGRVwC3gSQSK4VaewCKCaVL0bzv9PhsLg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.3.0.tgz", + "integrity": "sha512-RLMrtLwrBS0dfo2/KTP+2NHofCpzcuh0bEp/A/naqvQonbUL4AW/qWQdbpn8dMNudtpmzEx9eS8KEpGdVPg1BA==", "dev": true, "requires": { "app-root-path": "^2.0.1", @@ -2818,13 +2928,21 @@ "cssauron": "^1.4.0", "semver-dsl": "^1.0.1", "source-map": "^0.5.7", - "sprintf-js": "^1.1.1" + "sprintf-js": "^1.0.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "collapse-white-space": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", - "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.3.tgz", + "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=", "dev": true }, "collection-visit": { @@ -2838,18 +2956,18 @@ } }, "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.1" + "color-name": "^1.1.1" } }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "color-support": { @@ -2889,9 +3007,9 @@ } }, "commander": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, "commondir": { @@ -2961,20 +3079,12 @@ } }, "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "dev": true, "requires": { - "mime-db": ">= 1.34.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", - "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=", - "dev": true - } + "mime-db": ">= 1.33.0 < 2" } }, "compression": { @@ -2992,11 +3102,14 @@ "vary": "~1.1.2" }, "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } } } }, @@ -3042,6 +3155,17 @@ "finalhandler": "1.1.0", "parseurl": "~1.3.2", "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "connect-livereload": { @@ -3103,16 +3227,16 @@ "dev": true }, "conventional-changelog": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", - "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.23.tgz", + "integrity": "sha512-yCPXU/OXJmxgbvTQfIKXKwKa4KQTvlO0a4T/371Raz3bdxcHIGhQtHtdrNee4Z8nGLNfe54njHDblVG2JNFyjg==", "dev": true, "requires": { "conventional-changelog-angular": "^1.6.6", "conventional-changelog-atom": "^0.2.8", "conventional-changelog-codemirror": "^0.3.8", - "conventional-changelog-core": "^2.0.11", - "conventional-changelog-ember": "^0.3.12", + "conventional-changelog-core": "^2.0.10", + "conventional-changelog-ember": "^0.3.11", "conventional-changelog-eslint": "^1.0.9", "conventional-changelog-express": "^0.3.6", "conventional-changelog-jquery": "^0.1.0", @@ -3174,9 +3298,9 @@ } }, "conventional-changelog-core": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", - "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.10.tgz", + "integrity": "sha512-FP0NHXIbpvU+f5jk/qZdnodhFmlzKW8ENRHQIWT69oe7ffur9nFRVJZlnXnFBOzwHM9WIRbC15ZWh9HZN6t9Uw==", "dev": true, "requires": { "conventional-changelog-writer": "^3.0.9", @@ -3209,9 +3333,9 @@ } }, "conventional-changelog-ember": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz", - "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.11.tgz", + "integrity": "sha512-ErjPPiDmTd/WPgj2bSp+CGsLtJiv7FbdPKjZXH2Cd5P7j44Rqf0V9SIAAYFTQNoPqmvcp+sIcr/vH52WzPJUbw==", "dev": true, "requires": { "q": "^1.5.1" @@ -3367,9 +3491,9 @@ "dev": true }, "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", "dev": true, "requires": { "camelcase-keys": "^4.0.0", @@ -3520,9 +3644,9 @@ "dev": true }, "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", "dev": true, "requires": { "camelcase-keys": "^4.0.0", @@ -3627,9 +3751,9 @@ } }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" }, "core-util-is": { "version": "1.0.2", @@ -3686,24 +3810,22 @@ } }, "cross-env": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.4.tgz", + "integrity": "sha512-Mx8mw6JWhfpYoEk7PGvHxJMLQwQHORAs8+2bX+C1lGQ4h3GkDb1zbzC2Nw85YH9ZQMlO0BHZxMacgrfPmMFxbg==", "dev": true, "requires": { - "cross-spawn": "^6.0.5", + "cross-spawn": "^5.1.0", "is-windows": "^1.0.0" }, "dependencies": { "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", + "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } @@ -3791,9 +3913,9 @@ "dev": true }, "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", "dev": true }, "cssstyle": { @@ -3920,9 +4042,9 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -3967,9 +4089,9 @@ "dev": true }, "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "dev": true }, "deep-is": { @@ -3979,9 +4101,9 @@ "dev": true }, "deepmerge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.1.tgz", - "integrity": "sha512-urQxA1smbLZ2cBbXbaYObM1dJ82aJ2H57A1C/Kklfh/ZN1bgH4G/n5KWhdNfOK11W98gqZfyYj7W4frJJRwA2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.0.tgz", + "integrity": "sha512-Q89Z26KAfA3lpPGhbF6XMfYAm3jIV3avViy6KOJ2JLzFbeWHOvPQUu5aSJIWXap3gDZC2y1eF5HXEPI2wGqgvw==", "dev": true }, "defaults": { @@ -4049,6 +4171,18 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -4129,9 +4263,9 @@ "dev": true }, "dependency-graph": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.4.1.tgz", - "integrity": "sha1-MC5YIY2FxRqXY4cw2/m32FKhlpM=", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", "dev": true }, "dependency-tree": { @@ -4144,6 +4278,17 @@ "debug": "^2.2.0", "filing-cabinet": "^1.9.0", "precinct": "^3.8.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "deprecated": { @@ -4232,17 +4377,6 @@ "debug": "^3.1.0", "gonzales-pe": "^3.4.4", "node-source-walk": "^3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "detective-scss": { @@ -4254,17 +4388,6 @@ "debug": "^3.1.0", "gonzales-pe": "^3.4.4", "node-source-walk": "^3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "detective-stylus": { @@ -4311,34 +4434,40 @@ } }, "dgeni": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/dgeni/-/dgeni-0.4.9.tgz", - "integrity": "sha1-nkJ3WxOGyl64JHU6ws0WnY9hztE=", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/dgeni/-/dgeni-0.4.10.tgz", + "integrity": "sha512-In8huU+6W+Rd7MdfzhQoRbntF4AsJgtbwRUTyfPgvhaC3RGJX/YOEkMnn7vLLk3zaCrEkIQGW6eADoudpnBceg==", "dev": true, "requires": { "canonical-path": "~0.0.2", - "dependency-graph": "~0.4.1", + "dependency-graph": "^0.7.0", "di": "0.0.1", - "lodash": "^3.10.1", + "lodash": "^4.17.10", "objectdiff": "^1.1.0", "optimist": "~0.6.1", - "q": "~1.4.1", - "validate.js": "^0.9.0", + "q": "^1.5.1", + "validate.js": "^0.12.0", "winston": "^2.1.1" }, "dependencies": { "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true } } }, "dgeni-packages": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.26.2.tgz", - "integrity": "sha512-6nVE7xOp1GPPP8vMnhmNVxdarhl0Axn1U3+XidDIrCSGF3J7RoX64A0eOOZRS1t+p1W2nvwSEX6Jjp+N0k9QPw==", + "version": "0.26.9", + "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.26.9.tgz", + "integrity": "sha512-wvY/74ytYVdX/CMGs4jaP6PJUeUWcYyMjSCuYUVSbgEVU40SdE7lMnAlJuvTr/wTH3Zfx5BV/WTiVmzBwbXvow==", "dev": true, "requires": { "canonical-path": "0.0.2", @@ -4363,6 +4492,23 @@ "stringmap": "^0.2.2", "typescript": "~2.7.1", "urlencode": "^1.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } } }, "di": { @@ -4384,9 +4530,9 @@ "dev": true }, "diff-match-patch": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.1.tgz", - "integrity": "sha512-A0QEhr4PxGUMEtKxd6X+JLnOTFd3BfIPSDpsc4dMvj+CbSaErDwTpoTo/nFJDMSrjxLW4BiNq+FbNisAAHhWeQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", + "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=", "dev": true }, "dir-glob": { @@ -4442,9 +4588,9 @@ "dev": true }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", "dev": true, "requires": { "domelementtype": "1" @@ -4520,9 +4666,9 @@ "optional": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -4532,9 +4678,9 @@ } }, "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz", + "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=", "dev": true, "requires": { "is-plain-object": "^2.0.1", @@ -4542,9 +4688,9 @@ } }, "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.1.1.tgz", + "integrity": "sha1-RNZW3p2kFWlEZzNTZfsxR7hXK3w=", "dev": true }, "ecc-jsbn": { @@ -4558,11 +4704,12 @@ } }, "ecdsa-sig-formatter": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", - "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", + "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, "requires": { + "base64url": "^2.0.0", "safe-buffer": "^5.0.1" } }, @@ -4573,25 +4720,25 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.51", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.51.tgz", - "integrity": "sha1-akK0nar38ipbN7mR2vlJ8029ubU=", + "version": "1.3.42", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz", + "integrity": "sha1-lcM78B0MxAVVauyJn+Yf1NduoPk=", "dev": true }, "empower": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/empower/-/empower-1.3.0.tgz", - "integrity": "sha512-tP2WqM7QzrPguCCQEQfFFDF+6Pw6YWLQal3+GHQaV+0uIr0S+jyREQPWljE02zFCYPFYLZ3LosiRV+OzTrxPpQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/empower/-/empower-1.2.3.tgz", + "integrity": "sha1-bw2nNEf07dg4/sXGAxOoi6XLhSs=", "dev": true, "requires": { "core-js": "^2.0.0", - "empower-core": "^1.2.0" + "empower-core": "^0.6.2" } }, "empower-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz", - "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", + "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", "dev": true, "requires": { "call-signature": "0.0.2", @@ -4637,13 +4784,21 @@ "ws": "~3.3.1" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "ms": "2.0.0" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } @@ -4667,13 +4822,21 @@ "yeast": "0.1.2" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "ms": "2.0.0" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } @@ -4692,14 +4855,15 @@ } }, "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "ent": { @@ -4730,18 +4894,18 @@ } }, "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "dev": true, "requires": { "es6-iterator": "~2.0.3", @@ -4819,9 +4983,9 @@ "dev": true }, "escodegen": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz", - "integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -4836,13 +5000,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true } } }, @@ -4853,9 +5010,9 @@ "dev": true }, "espurify": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", - "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", + "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", "dev": true, "requires": { "core-js": "^2.0.0" @@ -4982,12 +5139,6 @@ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", "dev": true }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, "braces": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", @@ -5012,50 +5163,24 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true } } }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", @@ -5063,48 +5188,6 @@ "dev": true, "requires": { "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "expand-tilde": { @@ -5155,19 +5238,15 @@ "vary": "~1.1.2" }, "dependencies": { - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true, - "optional": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true + "optional": true, + "requires": { + "ms": "2.0.0" + } }, "statuses": { "version": "1.3.1", @@ -5206,37 +5285,276 @@ } }, "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "dev": true + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz", + "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.8" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, "is-accessor-descriptor": { @@ -5257,62 +5575,87 @@ "kind-of": "^6.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", - "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.0.1", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.1", - "micromatch": "^3.1.10" - } - }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -5332,14 +5675,6 @@ "dev": true, "requires": { "punycode": "^1.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } } }, "fastparse": { @@ -5403,130 +5738,354 @@ "dev": true }, "filing-cabinet": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-1.14.2.tgz", - "integrity": "sha512-je+ZSQiyJ7SfcK6PTHUkeq06CtaeYrcgwjXNJ6Mb+m+1aGa/8wOxi11iSXZukKPCCn3Bb9RBULqSaHEFoEFVvg==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-1.14.0.tgz", + "integrity": "sha512-+qFmqBu42dJC+BkzrYlTWzBRxtdrBPeLGCABXaBblhiYnBHiwvs6LB7YdoeIUDqFrYZ8ci3pWDOJ7mestU8BOg==", "dev": true, "requires": { "app-module-path": "^2.2.0", "commander": "^2.13.0", "debug": "^3.1.0", - "enhanced-resolve": "^4.1.0", + "enhanced-resolve": "^3.4.1", "is-relative-path": "^1.0.2", "module-definition": "^2.2.4", "module-lookup-amd": "^5.0.1", "resolve": "^1.5.0", "resolve-dependency-path": "^1.0.2", "sass-lookup": "^1.1.0", - "stylus-lookup": "^2.0.0", + "stylus-lookup": "^1.0.1", "typescript": "^2.4.2" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "filled-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", + "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=", + "dev": true + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true } } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "find": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/find/-/find-0.2.9.tgz", + "integrity": "sha1-S3Px/55WrZG3bnFkB/5f/mVUu4w=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "traverse-chain": "~0.1.0" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "kind-of": "^6.0.0" } - } - } - }, - "filled-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", - "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=", - "dev": true - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true - } - } - }, - "find": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/find/-/find-0.2.9.tgz", - "integrity": "sha1-S3Px/55WrZG3bnFkB/5f/mVUu4w=", - "dev": true, - "requires": { - "traverse-chain": "~0.1.0" - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { + }, "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", @@ -5535,6 +6094,59 @@ "requires": { "is-extglob": "^2.1.0" } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } } } }, @@ -5552,71 +6164,55 @@ } }, "firebase": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-4.13.1.tgz", - "integrity": "sha512-vi+DbUPRrsUaLxuMLgCuyISTBNQ/TqrEwWzUpMqyABPwE6YhGplNnCDPs+/kRDXxdqWUdwrUEXo1ansBSimoNw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-4.12.1.tgz", + "integrity": "sha512-jxVaiA8DihCkhtwcwdufWayUba6jPuylcgttBu1KccHLtAn7XmIiX5IUDMvJy2s7J9DA+66KeNa7CboAauTGGw==", "dev": true, "requires": { - "@firebase/app": "0.2.0", - "@firebase/auth": "0.4.2", - "@firebase/database": "0.2.2", - "@firebase/firestore": "0.4.1", - "@firebase/functions": "0.1.1", - "@firebase/messaging": "0.2.4", - "@firebase/polyfill": "0.3.1", - "@firebase/storage": "0.1.9", - "dom-storage": "2.1.0", - "xmlhttprequest": "1.8.0" + "@firebase/app": "0.1.10", + "@firebase/auth": "0.4.1", + "@firebase/database": "0.2.1", + "@firebase/firestore": "0.3.7", + "@firebase/functions": "0.1.0", + "@firebase/messaging": "0.2.3", + "@firebase/polyfill": "0.3.0", + "@firebase/storage": "0.1.8", + "dom-storage": "^2.0.2", + "xmlhttprequest": "^1.8.0" } }, "firebase-admin": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-5.12.1.tgz", - "integrity": "sha1-qBX0pRrahen9mQLDZZ0BdZ5fhVY=", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-5.12.0.tgz", + "integrity": "sha1-MpGwRmtNFhy0E16DyX+YeOd2jKw=", "dev": true, "requires": { "@firebase/app": "^0.1.10", "@firebase/database": "^0.2.0", - "@google-cloud/firestore": "^0.14.0", + "@google-cloud/firestore": "^0.13.1", "@google-cloud/storage": "^1.6.0", "@types/google-cloud__storage": "^1.1.7", "@types/node": "^8.0.53", + "faye-websocket": "0.9.3", "jsonwebtoken": "8.1.0", "node-forge": "0.7.4" }, "dependencies": { - "@firebase/app": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.1.10.tgz", - "integrity": "sha512-2GTXt3b2QZXkmx6/5nNJq+pEN/VTjAG55MFJS1WMoLVZkwKuNpWNk65QVyPaoL88x1iHtuLqAMFgJUOnhOg+Pw==", - "dev": true, - "requires": { - "@firebase/app-types": "0.1.2", - "@firebase/util": "0.1.10", - "tslib": "^1.9.0" - } - }, - "@firebase/app-types": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.1.2.tgz", - "integrity": "sha512-bCIZGeMtP0ibrXNNaU214/1tRNw0jHnir/cfiAao1gjUyIS7RzOTQoH+zbwPJNEwUqJ0T3ykw/Tv4/khGqbVBg==", + "@types/node": { + "version": "8.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.4.tgz", + "integrity": "sha512-FqpMm0l/JUCXK6HziUoXaxtuiefsyoeQtNy8CSOq31F/m16UNKRG40PezM6hbsUONZohzKnAHa7lEkieyx1ayA==", "dev": true }, - "@firebase/util": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.1.10.tgz", - "integrity": "sha512-XEogRfUQBZ4T37TMq/3ZbuiTdRAKX8hF3TgJglUZNCJf/6QnQ+jlupCuMAXBqCGfw2Mw0m2matoCUBWpsyevOA==", + "faye-websocket": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", + "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", "dev": true, "requires": { - "tslib": "^1.9.0" + "websocket-driver": ">=0.5.1" } }, - "@types/node": { - "version": "8.10.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.21.tgz", - "integrity": "sha512-87XkD9qDXm8fIax+5y7drx84cXsu34ZZqfB7Cial3Q/2lxSoJ/+DRaWckkCbxP41wFSIrrb939VhzaNxj4eY1w==", - "dev": true - }, "jsonwebtoken": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", @@ -5644,9 +6240,9 @@ } }, "firebase-tools": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/firebase-tools/-/firebase-tools-3.19.3.tgz", - "integrity": "sha1-WDPhB6fd0WoOOHdkWHUvCjxKYuo=", + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/firebase-tools/-/firebase-tools-3.18.2.tgz", + "integrity": "sha1-KHVH2hMZLekZJ4ierbrMHzniQKY=", "dev": true, "requires": { "@google-cloud/functions-emulator": "^1.0.0-beta.4", @@ -5671,19 +6267,19 @@ "inquirer": "^0.12.0", "is": "^3.2.1", "jsonschema": "^1.0.2", - "jsonwebtoken": "^8.2.1", + "jsonwebtoken": "^7.4.1", "lodash": "^4.6.1", - "minimatch": "^3.0.4", - "opn": "^5.3.0", + "open": "^0.0.5", "ora": "0.2.3", - "portfinder": "^1.0.13", + "portfinder": "^0.4.0", "progress": "^2.0.0", "request": "^2.58.0", + "rsvp": "^3.0.18", "semver": "^5.0.3", - "superstatic": "^5.0.2", + "superstatic": "^5.0.1", "tar": "^4.3.0", "tmp": "0.0.33", - "universal-analytics": "^0.4.16", + "universal-analytics": "^0.3.9", "update-notifier": "^0.5.0", "user-home": "^2.0.0", "uuid": "^3.0.0", @@ -5716,7 +6312,7 @@ }, "firebase": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-2.4.2.tgz", + "resolved": "http://registry.npmjs.org/firebase/-/firebase-2.4.2.tgz", "integrity": "sha1-ThEZ7AOWylYdinrL/xYw/qxsCjE=", "dev": true, "requires": { @@ -5790,7 +6386,7 @@ "google-auto-auth": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", - "integrity": "sha512-ux2n2AE2g3+vcLXwL4dP/M12SFMRX5dzCzBfhAEkTeAB7dpyGdOIEj7nmUx0BHKaCcUQrRWg9kT63X/Mmtk1+A==", + "integrity": "sha1-v5NS1cSgiXvzH9nEkQKLdl++px4=", "dev": true, "requires": { "async": "^2.3.0", @@ -5820,35 +6416,12 @@ "request": "^2.72.0" } }, - "jsonwebtoken": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz", - "integrity": "sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag==", - "dev": true, - "requires": { - "jws": "^3.1.5", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1" - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, "pkginfo": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", @@ -5858,7 +6431,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -5979,34 +6552,15 @@ "del": "^2.0.2", "graceful-fs": "^4.1.2", "write": "^0.2.1" - }, - "dependencies": { - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - } } }, "follow-redirects": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", - "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "dev": true, "requires": { "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "for-in": { @@ -6101,12 +6655,6 @@ "null-check": "^1.0.0" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", @@ -6705,7 +7253,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "optional": true, @@ -6768,31 +7316,31 @@ } }, "gcs-resumable-upload": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.10.2.tgz", - "integrity": "sha1-fymz7iPc7EFwNnwHEUGCScZgVF8=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.9.0.tgz", + "integrity": "sha512-+Zrmr0JKO2y/2mg953TW6JLu+NAMHqQsKzqCm7CIT24gMQakolPJCMzDleVpVjXAqB7ZCD276tcUq2ebOfqTug==", "dev": true, "requires": { - "configstore": "^3.1.2", - "google-auto-auth": "^0.10.0", - "pumpify": "^1.4.0", - "request": "^2.85.0", - "stream-events": "^1.0.3" + "buffer-equal": "^1.0.0", + "configstore": "^3.0.0", + "google-auto-auth": "^0.9.0", + "pumpify": "^1.3.3", + "request": "^2.81.0", + "stream-events": "^1.0.1", + "through2": "^2.0.0" } }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true, - "optional": true + "dev": true }, "generate-object-property": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, - "optional": true, "requires": { "is-property": "^1.0.0" } @@ -6857,6 +7405,18 @@ "file-uri-to-path": "1", "ftp": "~0.3.10", "readable-stream": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } } }, "get-value": { @@ -6948,9 +7508,9 @@ "dev": true }, "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", "dev": true, "requires": { "camelcase-keys": "^4.0.0", @@ -7095,9 +7655,9 @@ "dev": true }, "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", "dev": true, "requires": { "camelcase-keys": "^4.0.0", @@ -7195,15 +7755,6 @@ "netrc": "^0.1.4" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "follow-redirects": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.2.6.tgz", @@ -7237,53 +7788,15 @@ "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^2.0.0" } }, "glob-slash": { @@ -7444,9 +7957,9 @@ "dev": true }, "globs": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globs/-/globs-0.1.4.tgz", - "integrity": "sha512-D23dWbOq48vlOraoSigbcQV4tWrnhwk+E/Um2cMuDS3/5dwGmdFeA7L/vAvDhLFlQOTDqHcXh35m/71g2A2WzQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/globs/-/globs-0.1.3.tgz", + "integrity": "sha1-ZwA3ElKHy2VJqtlqRM+mhP18VQI=", "dev": true, "requires": { "glob": "^7.1.1" @@ -7488,7 +8001,7 @@ }, "lodash": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", "dev": true }, @@ -7565,24 +8078,24 @@ } }, "google-auth-library": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", - "integrity": "sha512-jYiWC8NA9n9OtQM7ANn0Tk464do9yhKEtaJ72pKcaBiEwn4LwcGYIYOfwtfsSm3aur/ed3tlSxbmg24IAT6gAg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.4.0.tgz", + "integrity": "sha512-vWRx6pJulK7Y5V/Xyr7MPMlx2mWfmrUVbcffZ7hpq8ElFg5S8WY6PvjMovdcr6JfuAwwpAX4R0I1XOcyWuBcUw==", "dev": true, "requires": { "axios": "^0.18.0", - "gcp-metadata": "^0.6.3", - "gtoken": "^2.3.0", - "jws": "^3.1.5", + "gcp-metadata": "^0.6.2", + "gtoken": "^2.2.0", + "jws": "^3.1.4", "lodash.isstring": "^4.0.1", - "lru-cache": "^4.1.3", + "lru-cache": "^4.1.2", "retry-axios": "^0.3.2" } }, "google-auto-auth": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.10.1.tgz", - "integrity": "sha512-iIqSbY7Ypd32mnHGbYctp80vZzXoDlvI9gEfvtl3kmyy5HzOcrZCIGCBdSlIzRsg7nHpQiHE3Zl6Ycur6TSodQ==", + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", "dev": true, "requires": { "async": "^2.3.0", @@ -7621,11 +8134,23 @@ }, "dependencies": { "@types/node": { - "version": "8.10.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.21.tgz", - "integrity": "sha512-87XkD9qDXm8fIax+5y7drx84cXsu34ZZqfB7Cial3Q/2lxSoJ/+DRaWckkCbxP41wFSIrrb939VhzaNxj4eY1w==", + "version": "8.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.4.tgz", + "integrity": "sha512-FqpMm0l/JUCXK6HziUoXaxtuiefsyoeQtNy8CSOq31F/m16UNKRG40PezM6hbsUONZohzKnAHa7lEkieyx1ayA==", "dev": true }, + "google-auto-auth": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.10.0.tgz", + "integrity": "sha512-R6m473OqgZacPvlidJ0aownTlUWyLy654ugjKSXyi1ffIicXlXg3wMfse9T9zxqG6w01q6K1iG+b7dImMkVJ2Q==", + "dev": true, + "requires": { + "async": "^2.3.0", + "gcp-metadata": "^0.6.1", + "google-auth-library": "^1.3.1", + "request": "^2.79.0" + } + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -7677,9 +8202,9 @@ }, "dependencies": { "@types/node": { - "version": "8.10.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.21.tgz", - "integrity": "sha512-87XkD9qDXm8fIax+5y7drx84cXsu34ZZqfB7Cial3Q/2lxSoJ/+DRaWckkCbxP41wFSIrrb939VhzaNxj4eY1w==", + "version": "8.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.4.tgz", + "integrity": "sha512-FqpMm0l/JUCXK6HziUoXaxtuiefsyoeQtNy8CSOq31F/m16UNKRG40PezM6hbsUONZohzKnAHa7lEkieyx1ayA==", "dev": true }, "globby": { @@ -7737,16 +8262,6 @@ "string-template": "1.0.0" }, "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "optional": true, - "requires": { - "lodash": "^4.14.0" - } - }, "google-auth-library": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.12.0.tgz", @@ -7842,7 +8357,7 @@ }, "grpc": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.10.1.tgz", + "resolved": "http://registry.npmjs.org/grpc/-/grpc-1.10.1.tgz", "integrity": "sha512-xmhA11h2XhqpSVzDAmoQAYdNQ+swILXpKOiRpAEQ2kX55ioxVADc6v7SkS4zQBxm4klhQHgGqpGKvoL6LGx4VQ==", "dev": true, "requires": { @@ -7854,12 +8369,14 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "ajv": { "version": "5.5.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { "co": "^4.6.0", @@ -7870,17 +8387,20 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "requires": { "delegates": "^1.0.0", @@ -7889,37 +8409,44 @@ }, "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "dev": true }, "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "aws-sign2": { "version": "0.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "dev": true, "optional": true, "requires": { @@ -7928,7 +8455,8 @@ }, "block-stream": { "version": "0.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { "inherits": "~2.0.0" @@ -7936,7 +8464,8 @@ }, "boom": { "version": "4.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { "hoek": "4.x.x" @@ -7944,7 +8473,8 @@ }, "brace-expansion": { "version": "1.1.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -7953,22 +8483,26 @@ }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "co": { "version": "4.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "combined-stream": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -7976,22 +8510,26 @@ }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cryptiles": { "version": "3.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { "boom": "5.x.x" @@ -7999,7 +8537,8 @@ "dependencies": { "boom": { "version": "5.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { "hoek": "4.x.x" @@ -8009,7 +8548,8 @@ }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -8017,7 +8557,8 @@ }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -8025,27 +8566,32 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "dev": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "dev": true, "optional": true, "requires": { @@ -8054,32 +8600,38 @@ }, "extend": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, "extsprintf": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fast-deep-equal": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -8089,12 +8641,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -8105,7 +8659,8 @@ }, "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "dev": true, "requires": { "fstream": "^1.0.0", @@ -8115,7 +8670,8 @@ }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { "aproba": "^1.0.3", @@ -8130,7 +8686,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -8138,7 +8695,8 @@ }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -8151,17 +8709,20 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "har-schema": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { "ajv": "^5.1.0", @@ -8170,12 +8731,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "hawk": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { "boom": "4.x.x", @@ -8186,12 +8749,14 @@ }, "hoek": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", "dev": true }, "http-signature": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -8201,7 +8766,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -8210,17 +8776,20 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -8228,43 +8797,51 @@ }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "jsprim": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", @@ -8275,12 +8852,14 @@ }, "mime-db": { "version": "1.33.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, "mime-types": { "version": "2.1.18", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { "mime-db": "~1.33.0" @@ -8288,7 +8867,8 @@ }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8296,12 +8876,14 @@ }, "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -8309,19 +8891,22 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node-pre-gyp": { "version": "0.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.7.0.tgz", + "integrity": "sha1-Va7/uu2TtQ0KRlfUaRmM2ArJ3zY=", "dev": true, "requires": { "detect-libc": "^1.0.2", @@ -8338,7 +8923,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "requires": { "abbrev": "1", @@ -8347,7 +8933,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -8358,22 +8945,26 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -8381,17 +8972,20 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { "os-homedir": "^1.0.0", @@ -8400,32 +8994,38 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "performance-now": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "qs": { "version": "6.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true }, "rc": { "version": "1.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "dev": true, "requires": { "deep-extend": "~0.4.0", @@ -8436,7 +9036,8 @@ }, "readable-stream": { "version": "2.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -8450,7 +9051,8 @@ }, "request": { "version": "2.83.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -8479,7 +9081,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "^7.0.5" @@ -8487,27 +9090,32 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "sntp": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { "hoek": "4.x.x" @@ -8515,7 +9123,8 @@ }, "sshpk": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { "asn1": "~0.2.3", @@ -8530,7 +9139,8 @@ }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -8540,7 +9150,8 @@ }, "string_decoder": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -8548,12 +9159,14 @@ }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "dev": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -8561,12 +9174,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { "block-stream": "*", @@ -8576,7 +9191,8 @@ }, "tar-pack": { "version": "3.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", + "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", "dev": true, "requires": { "debug": "^2.2.0", @@ -8591,7 +9207,8 @@ }, "tough-cookie": { "version": "2.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { "punycode": "^1.4.1" @@ -8599,7 +9216,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -8607,28 +9225,33 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true, "optional": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "dev": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "uuid": { "version": "3.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", "dev": true }, "verror": { "version": "1.10.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -8638,7 +9261,8 @@ }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { "string-width": "^1.0.2" @@ -8646,7 +9270,8 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true } } @@ -8718,7 +9343,7 @@ }, "chalk": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", "dev": true, "requires": { @@ -8914,9 +9539,9 @@ } }, "gulp-clean-css": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.9.4.tgz", - "integrity": "sha512-jsbAj65WM08H1jCFOKpIvA1OlACk7OHS2FFTeeBZrSJ5OR1PJzAqi0I2R2LTWYN3oMd/N1JYN9cN2IS/8eYqdg==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.9.3.tgz", + "integrity": "sha512-mw5Qrio7W3rvswmVlZ7eaxOhBIp6zQMBFLgcHoi/xbOtaKT5zmElkHt8mvbRre7fMt5eLgppIkW+j9Cm+O/UqQ==", "dev": true, "requires": { "clean-css": "4.1.11", @@ -9046,14 +9671,14 @@ } }, "gulp-conventional-changelog": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/gulp-conventional-changelog/-/gulp-conventional-changelog-1.1.24.tgz", - "integrity": "sha512-8nw2Vh7HSvNkmYLRrpt77zGjSjz+GoG9uMWCIJWHEoCR4iAHJ1w6PaPJ39C8xdkAfvPdowyKrAhUi3WepELiTA==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/gulp-conventional-changelog/-/gulp-conventional-changelog-1.1.23.tgz", + "integrity": "sha512-FbbYudKZvDIxhJ6Q9ZtxIQkeLzGucV43e/SfR1Ee/yK26q2FTySDe/CpdB1D2fj5Vsgfvqq/A74eb3CUOHDh3Q==", "dev": true, "requires": { "add-stream": "^1.0.0", "concat-stream": "^1.6.0", - "conventional-changelog": "^1.1.24", + "conventional-changelog": "^1.1.23", "fancy-log": "^1.3.2", "object-assign": "^4.0.1", "plugin-error": "^1.0.1", @@ -9247,9 +9872,9 @@ } }, "gulp-rename": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.3.0.tgz", - "integrity": "sha512-nEuZB7/9i0IZ8AXORTizl2QLP9tcC9uWc/s329zElBLJw1CfOhmMXBxwVlCRKjDyrWuhVP0uBKl61KeQ32TiCg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", "dev": true }, "gulp-sass": { @@ -9396,20 +10021,6 @@ "requires": { "ajv": "^5.1.0", "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - } } }, "has-ansi": { @@ -9491,6 +10102,14 @@ "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "has-values": { @@ -9503,6 +10122,26 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -9590,9 +10229,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, "html-encoding-sniffer": { @@ -9605,33 +10244,27 @@ } }, "html-minifier": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.18.tgz", - "integrity": "sha512-sczoq/9zeXiKZMj8tsQzHJE7EyjrpMHvblTLuh9o8h5923a6Ts5uQ/3YdY+xIqJYRjzHQPlrHjfjh0BtwPJG0g==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.14.tgz", + "integrity": "sha512-sZjw6zhQgyUnIlIPU+W80XpRjWjdxHtNcxjfyOskOsCTDKytcfLY04wsQY/83Yqb4ndoiD2FtauiL7Yg6uUQFQ==", "dev": true, "requires": { "camel-case": "3.0.x", "clean-css": "4.1.x", - "commander": "2.16.x", + "commander": "2.15.x", "he": "1.1.x", "param-case": "2.1.x", "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "uglify-js": "3.3.x" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "uglify-js": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.4.tgz", - "integrity": "sha512-RiB1kNcC9RMyqwRrjXC+EjgLoXULoDnCaOnEDzUCHkBN0bHwmtF5rzDMiDWU29gu0kXCRRWwtcTAVFWRECmU2Q==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.20.tgz", + "integrity": "sha512-WpLkWCf9sGvGZnIvBV0PNID9BATQNT/IXKAmqegfKzIPcTmTV3FP8NQpoogQkt/Y402x2sOFdaHUmqFY9IZp+g==", "dev": true, "requires": { - "commander": "~2.16.0", + "commander": "~2.15.0", "source-map": "~0.6.1" } } @@ -9677,9 +10310,9 @@ } }, "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.11.tgz", + "integrity": "sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA==", "dev": true }, "http-proxy": { @@ -9700,17 +10333,6 @@ "requires": { "agent-base": "4", "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "http-rewrite-middleware": { @@ -9762,17 +10384,6 @@ "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "i": { @@ -9783,18 +10394,18 @@ "optional": true }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "^2.1.0" } }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, "image-diff": { @@ -9994,23 +10605,12 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-alphabetical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", - "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.1.tgz", + "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=", "dev": true }, "is-alphanumeric": { @@ -10020,9 +10620,9 @@ "dev": true }, "is-alphanumerical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", - "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz", + "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=", "dev": true, "requires": { "is-alphabetical": "^1.0.0", @@ -10066,23 +10666,12 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-decimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", - "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz", + "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=", "dev": true }, "is-descriptor": { @@ -10132,9 +10721,9 @@ "dev": true }, "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-finite": { @@ -10156,18 +10745,18 @@ } }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "^1.0.0" } }, "is-hexadecimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", - "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz", + "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=", "dev": true }, "is-lower-case": { @@ -10189,15 +10778,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true, - "optional": true + "dev": true }, "is-my-json-valid": { "version": "2.17.2", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", "dev": true, - "optional": true, "requires": { "generate-function": "^2.0.0", "generate-object-property": "^1.1.0", @@ -10213,23 +10800,12 @@ "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-obj": { @@ -10245,6 +10821,23 @@ "dev": true, "optional": true }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -10282,6 +10875,14 @@ "dev": true, "requires": { "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "is-posix-bracket": { @@ -10300,8 +10901,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true, - "optional": true + "dev": true }, "is-redirect": { "version": "1.0.0", @@ -10406,9 +11006,9 @@ "dev": true }, "is-whitespace-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", - "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz", + "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=", "dev": true }, "is-windows": { @@ -10418,15 +11018,9 @@ "dev": true }, "is-word-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", - "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.1.tgz", + "integrity": "sha1-WgP6HqkazopusMfNdw64bWXIvvs=", "dev": true }, "isarray": { @@ -10436,10 +11030,13 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } }, "isemail": { "version": "1.2.0", @@ -10454,10 +11051,13 @@ "dev": true }, "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } }, "isomorphic-fetch": { "version": "2.2.1", @@ -10643,9 +11243,9 @@ } }, "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", "dev": true }, "js-tokens": { @@ -10655,9 +11255,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -10761,15 +11361,6 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -10785,12 +11376,6 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -10801,8 +11386,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true, - "optional": true + "dev": true }, "jsonschema": { "version": "1.2.4", @@ -10860,102 +11444,448 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "dev": true, + "requires": { + "base64url": "2.0.0", + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.9", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "dev": true, + "requires": { + "base64url": "^2.0.0", + "jwa": "^1.1.4", + "safe-buffer": "^5.0.1" + } + }, + "karma": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.5.tgz", + "integrity": "sha512-rECezBeY7mjzGUWhFlB7CvPHgkHJLXyUmWg+6vHCEsdWNUTnmiS6jRrIMcJEWgU2DUGZzGWG0bTRVky8fsDTOA==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^2.5.3", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.0.4", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - } - } - }, - "jwa": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", - "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.10", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", - "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", - "dev": true, - "requires": { - "jwa": "^1.1.5", - "safe-buffer": "^5.0.1" - } - }, - "karma": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.4.tgz", - "integrity": "sha512-32yhTwoi6BZgJZhR78GwhzyFABbYG/1WwQqYgY7Vh96Demvua2jM3+FyRltIMTUH/Kd5xaQvDw2L7jTvkYFeXg==", - "dev": true, - "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "chokidar": "^2.0.3", - "colors": "^1.1.0", - "combine-lists": "^1.0.0", - "connect": "^3.6.0", - "core-js": "^2.2.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "expand-braces": "^0.1.1", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.4", - "log4js": "^2.5.3", - "mime": "^1.3.4", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.0.4", - "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.2.1" - }, - "dependencies": { - "colors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", - "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -10997,14 +11927,14 @@ } }, "karma-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz", - "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.1.tgz", + "integrity": "sha1-Wv+LOc9plNwi3kyENix2ABtjfPY=", "dev": true, "requires": { "dateformat": "^1.0.6", "istanbul": "^0.4.0", - "lodash": "^4.17.0", + "lodash": "^3.8.0", "minimatch": "^3.0.0", "source-map": "^0.5.1" }, @@ -11018,6 +11948,18 @@ "get-stdin": "^4.0.1", "meow": "^3.3.0" } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -11028,9 +11970,9 @@ "dev": true }, "karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", + "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", "dev": true }, "karma-sauce-launcher": { @@ -11073,10 +12015,13 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } }, "klaw": { "version": "1.3.1", @@ -11245,9 +12190,9 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, "lodash._basecopy": { @@ -11584,9 +12529,9 @@ } }, "log4js": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.10.0.tgz", - "integrity": "sha512-NnhN9PjFF9zhxinAjlmDYvkqqrIW+yA3LLJAoTJ3fs6d1zru86OqQHfsxiUcc1kRq3z+faGR4DeyXUfiNbVxKQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.11.0.tgz", + "integrity": "sha512-z1XdwyGFg8/WGkOyF6DPJjivCWNLKrklGdViywdYnSKOvgtEBo2UyEMZS5sD2mZrQlU3TvO8wDWLc8mzE1ncBQ==", "dev": true, "requires": { "amqplib": "^0.5.2", @@ -11606,7 +12551,7 @@ "dependencies": { "axios": { "version": "0.15.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.15.3.tgz", "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", "dev": true, "optional": true, @@ -11614,18 +12559,15 @@ "follow-redirects": "1.0.0" } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "circular-json": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.5.tgz", + "integrity": "sha512-13YaR6kiz0kBNmIVM87Io8Hp7bWOo4r61vkEANy8iH9R9bc6avud/1FT0SBpqR1RpIQADOh/Q+yHZDA1iL6ysA==", + "dev": true }, "follow-redirects": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", "dev": true, "optional": true, @@ -11788,7 +12730,7 @@ }, "readable-stream": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "optional": true, @@ -11803,7 +12745,7 @@ }, "request": { "version": "2.75.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "resolved": "http://registry.npmjs.org/request/-/request-2.75.0.tgz", "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", "dev": true, "optional": true, @@ -11907,9 +12849,9 @@ "dev": true }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -11969,12 +12911,6 @@ "ms": "0.7.1" } }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true - }, "ms": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", @@ -12068,24 +13004,12 @@ "promisify-call": "^2.0.2", "proxy-agent": "~3.0.0", "tsscmp": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - } } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "dev": true, "requires": { "pify": "^3.0.0" @@ -12104,6 +13028,14 @@ "dev": true, "requires": { "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "map-cache": { @@ -12134,15 +13066,15 @@ } }, "markdown-escapes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", - "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz", + "integrity": "sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg=", "dev": true }, "markdown-table": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", - "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.1.tgz", + "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=", "dev": true }, "marked": { @@ -12199,50 +13131,6 @@ "stack-trace": "0.0.9" }, "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "findup-sync": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", @@ -12265,51 +13153,6 @@ "path-is-absolute": "^1.0.0" } }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -12324,16 +13167,10 @@ } } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, "mathml-tag-names": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.0.tgz", - "integrity": "sha512-3Zs9P/0zzwTob2pdgT0CHZuMbnSUSp8MB1bddfm+HDmnFWHGT4jvEZRf+2RuPoa+cjdn/z25SEt5gFTqdhvJAg==", + "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 }, "mdast-util-compact": { @@ -12406,9 +13243,9 @@ } }, "merge2": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", - "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", + "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", "dev": true }, "methmeth": { @@ -12424,30 +13261,30 @@ "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.2.tgz", + "integrity": "sha512-A7PDg4s48MkqFEcYg2b069m3DXOEq7hx+9q9rIFrSSYfzsh35GX+LOVMQ8Au0ko7d8bSQCIAuzkjp0vCtwENlQ==", "dev": true }, "mime-db": { @@ -12502,12 +13339,12 @@ } }, "minipass": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", - "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", + "safe-buffer": "^5.1.1", "yallist": "^3.0.0" }, "dependencies": { @@ -12551,7 +13388,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -12607,23 +13444,12 @@ "find": "^0.2.8", "requirejs": "^2.3.5", "requirejs-config-file": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz", + "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg==", "dev": true }, "morgan": { @@ -12637,6 +13463,17 @@ "depd": "~1.1.1", "on-finished": "~2.3.0", "on-headers": "~1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "ms": { @@ -12720,9 +13557,9 @@ "dev": true }, "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -12730,12 +13567,33 @@ "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "nash": { @@ -12765,9 +13623,9 @@ } }, "natives": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", - "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", + "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==", "dev": true }, "ncp": { @@ -12807,14 +13665,8 @@ }, "next-tick": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, "no-case": { @@ -12843,35 +13695,78 @@ "dev": true }, "node-gyp": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz", - "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", "dev": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", "mkdirp": "^0.5.0", "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", "osenv": "0", - "request": ">=2.9.0 <2.82.0", + "request": "2", "rimraf": "2", "semver": "~5.3.0", "tar": "^2.0.0", "which": "1" }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } - }, + } + } + }, + "node-html-encoder": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz", + "integrity": "sha1-iXNhjXJ9pVJqgwtH0HwNgD4KFcY=", + "dev": true + }, + "node-sass": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.8.3.tgz", + "integrity": "sha512-tfFWhUsCk/Y19zarDcPo5xpj+IW3qCfOjVdHtYeG6S1CKbQOh1zqylnQK6cV3z9k80yxAnFX9Y+a9+XysDhhfg==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.3.1", + "npmlog": "^4.0.0", + "request": "~2.79.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { "assert-plus": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", @@ -12893,6 +13788,22 @@ "hoek": "2.x.x" } }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", @@ -12913,20 +13824,36 @@ "mime-types": "^2.1.12" } }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.4", + "minimatch": "~3.0.2" + } }, "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" } }, "hawk": { @@ -12958,32 +13885,26 @@ "sshpk": "^1.7.0" } }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", "dev": true }, "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, "requires": { "aws-sign2": "~0.6.0", "aws4": "^1.2.1", - "caseless": "~0.12.0", + "caseless": "~0.11.0", "combined-stream": "~1.0.5", "extend": "~3.0.0", "forever-agent": "~0.6.1", "form-data": "~2.1.1", - "har-validator": "~4.2.1", + "har-validator": "~2.0.6", "hawk": "~3.1.3", "http-signature": "~1.1.0", "is-typedarray": "~1.0.0", @@ -12991,21 +13912,13 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.7", "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", + "qs": "~6.3.0", "stringstream": "~0.0.4", "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", + "tunnel-agent": "~0.4.1", "uuid": "^3.0.0" } }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, "sntp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", @@ -13015,81 +13928,11 @@ "hoek": "2.x.x" } }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - } - } - }, - "node-html-encoder": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz", - "integrity": "sha1-iXNhjXJ9pVJqgwtH0HwNgD4KFcY=", - "dev": true - }, - "node-sass": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.2.tgz", - "integrity": "sha512-LdxoJLZutx0aQXHtWIYwJKMj+9pTjneTcLWJgzf2XbGu0q5pRNqW5QvFCEdm3mc5rJOdru/mzln5d0EZLacf6g==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "lodash.mergewith": "^4.6.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.10.0", - "node-gyp": "^3.3.1", - "npmlog": "^4.0.0", - "request": "2.87.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true } } }, @@ -13124,6 +13967,13 @@ "socks": "1.1.9" }, "dependencies": { + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true, + "optional": true + }, "socks": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", @@ -13297,6 +14147,381 @@ "chokidar": "^2.0.0", "postinstall-build": "^5.0.1", "yargs": "^3.32.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "optional": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, "nwmatcher": { @@ -13342,22 +14567,13 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } } } }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, "object-visit": { @@ -13367,6 +14583,14 @@ "dev": true, "requires": { "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "object.defaults": { @@ -13389,6 +14613,12 @@ "requires": { "for-in": "^1.0.1" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, @@ -13430,6 +14660,14 @@ "dev": true, "requires": { "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "objectdiff": { @@ -13468,14 +14706,11 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } + "open": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", + "dev": true }, "optimist": { "version": "0.6.1", @@ -13636,9 +14871,9 @@ "optional": true }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -13670,9 +14905,9 @@ "dev": true }, "pac-proxy-agent": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", - "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz", + "integrity": "sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q==", "dev": true, "optional": true, "requires": { @@ -13683,19 +14918,7 @@ "https-proxy-agent": "^2.2.1", "pac-resolver": "^3.0.0", "raw-body": "^2.2.0", - "socks-proxy-agent": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - } + "socks-proxy-agent": "^4.0.1" } }, "pac-resolver": { @@ -13786,9 +15009,9 @@ } }, "parse-entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz", - "integrity": "sha512-5N9lmQ7tmxfXf+hO3X6KRG6w7uYO/HL9fHalSySTdyn63C3WNvTM/1R8tn1u1larNcEbo3Slcy2bsVDQqvEpUg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.1.tgz", + "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=", "dev": true, "requires": { "character-entities": "^1.0.0", @@ -13826,23 +15049,6 @@ "is-dotfile": "^1.0.0", "is-extglob": "^1.0.0", "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "parse-json": { @@ -13867,9 +15073,9 @@ "dev": true }, "parse5": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.0.0.tgz", - "integrity": "sha512-0ywuiUOnpWWeil5grH2rxjyTJoeQVwyBuO2si6QIU9dWtj2npjuyK1HaY1RbLnVfDhEbhyAPNUBKRK0Xj2xE0w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, "parseqs": { @@ -14059,6 +15265,14 @@ "arr-diff": "^4.0.0", "arr-union": "^3.1.0", "extend-shallow": "^3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + } } }, "plur": { @@ -14074,20 +15288,19 @@ "dev": true }, "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-0.4.0.tgz", + "integrity": "sha1-o/+t/6/k+5jgYBqF7aJ8J86Eyh4=", "dev": true, "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", + "async": "0.9.0", "mkdirp": "0.5.x" }, "dependencies": { "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz", + "integrity": "sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc=", "dev": true } } @@ -14108,6 +15321,14 @@ "js-base64": "^2.1.9", "source-map": "^0.5.6", "supports-color": "^3.2.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "postcss-html": { @@ -14158,9 +15379,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -14184,26 +15405,20 @@ } }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.3.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^5.3.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -14236,9 +15451,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -14253,26 +15468,20 @@ "dev": true }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.3.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^5.3.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -14300,9 +15509,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -14332,26 +15541,20 @@ "dev": true }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.3.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^5.3.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -14360,12 +15563,12 @@ } }, "postcss-scss": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.6.tgz", - "integrity": "sha512-4EFYGHcEw+H3E06PT/pQQri06u/1VIIPjeJQaM8skB80vZuXMhp4cSNV5azmdNkontnOID/XYWEvEEELLFB1ww==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.5.tgz", + "integrity": "sha512-gJB1tKYMkBy0MU+COt6WXA4ZiRctAKoWLa6qD7a6bbEbBMqrpa/BhfQdN80eYMV+JkKddZVEpZlOggnGShpvyg==", "dev": true, "requires": { - "postcss": "^6.0.23" + "postcss": "^6.0.21" }, "dependencies": { "ansi-styles": { @@ -14378,9 +15581,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -14395,26 +15598,20 @@ "dev": true }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.3.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^5.3.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -14440,41 +15637,41 @@ "dev": true }, "postinstall-build": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postinstall-build/-/postinstall-build-5.0.1.tgz", - "integrity": "sha1-uRepB5smF42aJK9aXNjLSpkdEbk=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postinstall-build/-/postinstall-build-5.0.3.tgz", + "integrity": "sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg==", "dev": true }, "power-assert": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.6.0.tgz", - "integrity": "sha512-nDb6a+p2C7Wj8Y2zmFtLpuv+xobXz4+bzT5s7dr0nn71tLozn7nRMQqzwbefzwZN5qOm0N7Cxhw4kXP75xboKA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.5.0.tgz", + "integrity": "sha512-WaWSw+Ts283o6dzxW1BxIxoaHok7aSSGx4SaR6dW62Pk31ynv9DERDieuZpPYv5XaJ+H+zdcOaJQ+PvlasAOVw==", "dev": true, "requires": { "define-properties": "^1.1.2", - "empower": "^1.3.0", - "power-assert-formatter": "^1.4.1", + "empower": "^1.2.3", + "power-assert-formatter": "^1.3.1", "universal-deep-strict-equal": "^1.2.1", "xtend": "^4.0.0" } }, "power-assert-context-formatter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz", - "integrity": "sha512-HLNEW8Bin+BFCpk/zbyKwkEu9W8/zThIStxGo7weYcFkKgMuGCHUJhvJeBGXDZf0Qm2xis4pbnnciGZiX0EpSg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz", + "integrity": "sha1-7bo1LT7YpgMRTWZyZazOYNaJzN8=", "dev": true, "requires": { "core-js": "^2.0.0", - "power-assert-context-traversal": "^1.2.0" + "power-assert-context-traversal": "^1.1.1" } }, "power-assert-context-reducer-ast": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.2.0.tgz", - "integrity": "sha512-EgOxmZ/Lb7tw4EwSKX7ZnfC0P/qRZFEG28dx/690qvhmOJ6hgThYFm5TUWANDLK5NiNKlPBi5WekVGd2+5wPrw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.1.2.tgz", + "integrity": "sha1-SEqZ4m9Jc/+IMuXFzHVnAuYJQXQ=", "dev": true, "requires": { - "acorn": "^5.0.0", + "acorn": "^4.0.0", "acorn-es7-plugin": "^1.0.12", "core-js": "^2.0.0", "espurify": "^1.6.0", @@ -14482,9 +15679,9 @@ } }, "power-assert-context-traversal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.2.0.tgz", - "integrity": "sha512-NFoHU6g2umNajiP2l4qb0BRWD773Aw9uWdWYH9EQsVwIZnog5bd2YYLFCVvaxWpwNzWeEfZIon2xtyc63026pQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz", + "integrity": "sha1-iMq8oNE7Y1nwfT0+ivppkmRXftk=", "dev": true, "requires": { "core-js": "^2.0.0", @@ -14507,13 +15704,13 @@ } }, "power-assert-renderer-assertion": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.2.0.tgz", - "integrity": "sha512-3F7Q1ZLmV2ZCQv7aV7NJLNK9G7QsostrhOU7U0RhEQS/0vhEqrRg2jEJl1jtUL4ZyL2dXUlaaqrmPv5r9kRvIg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz", + "integrity": "sha1-y/wOd+AIao+Wrz8djme57n4ozpg=", "dev": true, "requires": { "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0" + "power-assert-util-string-width": "^1.1.1" } }, "power-assert-renderer-base": { @@ -14523,9 +15720,9 @@ "dev": true }, "power-assert-renderer-comparison": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.2.0.tgz", - "integrity": "sha512-7c3RKPDBKK4E3JqdPtYRE9cM8AyX4LC4yfTvvTYyx8zSqmT5kJnXwzR0yWQLOavACllZfwrAGQzFiXPc5sWa+g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.1.1.tgz", + "integrity": "sha1-10Odl9hRVr5OMKAPL7WnJRTOPAg=", "dev": true, "requires": { "core-js": "^2.0.0", @@ -14536,33 +15733,33 @@ } }, "power-assert-renderer-diagram": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.2.0.tgz", - "integrity": "sha512-JZ6PC+DJPQqfU6dwSmpcoD7gNnb/5U77bU5KgNwPPa+i1Pxiz6UuDeM3EUBlhZ1HvH9tMjI60anqVyi5l2oNdg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.2.tgz", + "integrity": "sha1-ZV+PcRk1qbbVQbhjJ2VHF8Y3qYY=", "dev": true, "requires": { "core-js": "^2.0.0", "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0", + "power-assert-util-string-width": "^1.1.1", "stringifier": "^1.3.0" } }, "power-assert-renderer-file": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.2.0.tgz", - "integrity": "sha512-/oaVrRbeOtGoyyd7e4IdLP/jIIUFJdqJtsYzP9/88R39CMnfF/S/rUc8ZQalENfUfQ/wQHu+XZYRMaCEZmEesg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.1.1.tgz", + "integrity": "sha1-o34rvReMys0E5427eckv40kzxec=", "dev": true, "requires": { "power-assert-renderer-base": "^1.1.1" } }, "power-assert-util-string-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.2.0.tgz", - "integrity": "sha512-lX90G0igAW0iyORTILZ/QjZWsa1MZ6VVY3L0K86e2eKun3S4LKPH4xZIl8fdeMYLfOjkaszbNSzf1uugLeAm2A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz", + "integrity": "sha1-vmWet5N/3S5smncmjar2S9W3xZI=", "dev": true, "requires": { - "eastasianwidth": "^0.2.0" + "eastasianwidth": "^0.1.1" } }, "precinct": { @@ -14583,17 +15780,6 @@ "detective-typescript": "^1.0.0", "module-definition": "^2.2.4", "node-source-walk": "^3.3.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "prelude-ls": { @@ -14697,9 +15883,9 @@ "optional": true }, "colors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", - "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", + "integrity": "sha512-s8+wktIuDSLffCywiwSxQOMqtPxML11a/dtHE17tMn4B1MSWw/C22EKf7M2KGUBcDaVFEGT+S8N02geDXeuNKg==", "dev": true, "optional": true }, @@ -14772,9 +15958,9 @@ "optional": true }, "protractor": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.2.tgz", - "integrity": "sha512-pw4uwwiy5lHZjIguxNpkEwJJa7hVz+bJsvaTI+IbXlfn2qXwzbF8eghW/RmrZwE2sGx82I8etb8lVjQ+JrjejA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.1.tgz", + "integrity": "sha512-AW9qJ0prx2QEMy1gnhJ1Sl1WBQL2R3fx/VnG09FEmWprPIQPK14t0B83OB/pAGddpxiDCAAV0KiNNLf2c2Y/lQ==", "dev": true, "requires": { "@types/node": "^6.0.46", @@ -14787,7 +15973,7 @@ "jasminewd2": "^2.1.0", "optimist": "~0.6.0", "q": "1.4.1", - "saucelabs": "^1.5.0", + "saucelabs": "~1.3.0", "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", "webdriver-js-extender": "^1.0.0", @@ -14795,34 +15981,102 @@ }, "dependencies": { "@types/node": { - "version": "6.0.114", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz", - "integrity": "sha512-5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==", + "version": "6.0.105", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz", + "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==", "dev": true }, - "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "~3.0.0", + "semver": "~5.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2", + "debug": "2", + "extend": "3" + } + }, + "saucelabs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", + "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", + "dev": true, + "requires": { + "https-proxy-agent": "^1.0.0" + } + }, + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", + "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", "dev": true, "requires": { - "adm-zip": "^0.4.9", + "adm-zip": "^0.4.7", "chalk": "^1.1.1", "del": "^2.2.0", "glob": "^7.0.3", "ini": "^1.3.4", "minimist": "^1.2.0", "q": "^1.4.1", - "request": "^2.87.0", + "request": "^2.78.0", "rimraf": "^2.5.2", "semver": "^5.3.0", "xml2js": "^0.4.17" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } } } } @@ -14839,9 +16093,9 @@ } }, "proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.0.tgz", - "integrity": "sha512-g6n6vnk8fRf705ShN+FEXFG/SDJaW++lSs0d9KaJh4uBWW/wi7en4Cpo5VYQW3SZzAE121lhB/KLQrbURoubZw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.3.tgz", + "integrity": "sha512-PXVVVuH9tiQuxQltFJVSnXWuDtNr+8aNBP6XVDDCDiUuDN8eRCm+ii4/mFWmXWEA0w8jjJSlePa4LXlM4jIzNA==", "dev": true, "optional": true, "requires": { @@ -14850,21 +16104,9 @@ "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", "lru-cache": "^4.1.2", - "pac-proxy-agent": "^2.0.1", + "pac-proxy-agent": "^3.0.0", "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - } + "socks-proxy-agent": "^4.0.1" } }, "proxy-from-env": { @@ -14935,20 +16177,20 @@ } }, "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", "dev": true, "requires": { - "duplexify": "^3.6.0", + "duplexify": "^3.5.3", "inherits": "^2.0.3", "pump": "^2.0.0" } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "q": { @@ -14964,9 +16206,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true }, "query-string": { @@ -14988,21 +16230,43 @@ "dev": true }, "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -15057,12 +16321,12 @@ } }, "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "dev": true, "requires": { - "deep-extend": "^0.6.0", + "deep-extend": "~0.4.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -15247,9 +16511,9 @@ "dev": true }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", "dev": true }, "regenerator-runtime": { @@ -15418,9 +16682,9 @@ "dev": true }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -15431,6 +16695,7 @@ "forever-agent": "~0.6.1", "form-data": "~2.3.1", "har-validator": "~5.0.3", + "hawk": "~6.0.2", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -15440,6 +16705,7 @@ "performance-now": "^2.1.0", "qs": "~6.5.1", "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", "tough-cookie": "~2.3.3", "tunnel-agent": "^0.6.0", "uuid": "^3.1.0" @@ -15528,9 +16794,9 @@ "dev": true }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz", + "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==", "dev": true, "requires": { "path-parse": "^1.0.5" @@ -15606,9 +16872,9 @@ "dev": true }, "retry-request": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.2.tgz", - "integrity": "sha512-WIiGp37XXDC6e7ku3LFoi7LCL/Gs9luGeeqvbPRb+Zl6OQMw4RCRfSaW+aLfE6lhz1R941UavE6Svl3Dm5xGIQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", + "integrity": "sha512-PjAmtWIxjNj4Co/6FRtBl8afRP3CxrrIAnUzb1dzydfROd+6xt7xAebFeskgQgkfFf8NmzrXIoaB3HxmswXyxw==", "dev": true, "requires": { "request": "^2.81.0", @@ -15675,9 +16941,9 @@ } }, "router": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/router/-/router-1.3.3.tgz", - "integrity": "sha1-wUL2tepNazNZAiypW2WAvSF/ic8=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/router/-/router-1.3.2.tgz", + "integrity": "sha1-v6oWiIpSg9XuQNmZ2nqfoVKWpgw=", "dev": true, "requires": { "array-flatten": "2.1.1", @@ -15694,6 +16960,15 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } } } }, @@ -15737,9 +17012,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "safe-regex": { @@ -15855,25 +17130,101 @@ } }, "sauce-connect-launcher": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz", - "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.3.tgz", + "integrity": "sha1-0vkxrXro/avxlopEDnsgQXrKf4Y=", "dev": true, "requires": { "adm-zip": "~0.4.3", "async": "^2.1.2", - "https-proxy-agent": "^2.2.1", + "https-proxy-agent": "~1.0.0", "lodash": "^4.16.6", "rimraf": "^2.5.4" + }, + "dependencies": { + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "~3.0.0", + "semver": "~5.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2", + "debug": "2", + "extend": "3" + } + }, + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } } }, "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.4.0.tgz", + "integrity": "sha1-uTSpr52ih0s/QKrh/N5QpEZvXzg=", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "https-proxy-agent": "^1.0.0" + }, + "dependencies": { + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "~3.0.0", + "semver": "~5.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2", + "debug": "2", + "extend": "3" + } + }, + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } } }, "sax": { @@ -15883,18 +17234,18 @@ "dev": true }, "scss-bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/scss-bundle/-/scss-bundle-2.3.2.tgz", - "integrity": "sha512-Mp12Wa/PbTBY5E6zlN4Vq8ccK4Ex4WX9dvc8QP3BXzatfo9VvQijZIAsMQ4nT+vD0oM1I4m6Cy9twJWYr9oBew==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/scss-bundle/-/scss-bundle-2.1.3.tgz", + "integrity": "sha512-8gJxY6CmeSKNf/Kte/xAY/VhR+JF5RUCfHf6fu6pdAASqB9YN3Kuwp9mLbBIEKSl0LZvpK4aw0YfBH5TrA46Dg==", "dev": true, "requires": { "archy": "^1.0.0", "fs-extra": "^5.0.0", "globs": "^0.1.3", - "node-sass": "^4.9.0", + "node-sass": "^4.7.2", "pretty-bytes": "^4.0.2", "promise": "^8.0.1", - "yargs": "^11.0.0" + "yargs": "^10.0.3" }, "dependencies": { "ansi-regex": { @@ -15903,10 +17254,16 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "cliui": { + "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", "dev": true, "requires": { "string-width": "^2.1.1", @@ -15971,9 +17328,9 @@ } }, "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "dev": true, "requires": { "cliui": "^4.0.0", @@ -15987,7 +17344,16 @@ "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" } } } @@ -16079,6 +17445,15 @@ "statuses": "~1.3.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", @@ -16132,6 +17507,17 @@ "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "serve-static": { @@ -16306,9 +17692,9 @@ "dev": true }, "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", + "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==", "dev": true }, "smtp-connection": { @@ -16352,6 +17738,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -16369,6 +17764,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -16420,6 +17821,18 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -16430,17 +17843,6 @@ "dev": true, "requires": { "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "sntp": { @@ -16463,6 +17865,17 @@ "socket.io-adapter": "~1.1.0", "socket.io-client": "2.0.4", "socket.io-parser": "~3.1.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "socket.io-adapter": { @@ -16490,6 +17903,17 @@ "parseuri": "0.0.5", "socket.io-parser": "~3.1.1", "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "socket.io-parser": { @@ -16504,15 +17928,6 @@ "isarray": "2.0.1" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", @@ -16522,23 +17937,23 @@ } }, "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", + "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", "dev": true, "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" } }, "socks-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", - "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", + "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", "dev": true, "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" + "agent-base": "~4.2.0", + "socks": "~2.2.0" } }, "sorcery": { @@ -16564,18 +17979,17 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.0.0", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -16583,12 +17997,11 @@ } }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", "requires": { - "source-map": "^0.5.6" + "source-map": "^0.6.0" } }, "source-map-url": { @@ -16604,9 +18017,9 @@ "dev": true }, "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", "dev": true }, "spdx-correct": { @@ -16691,15 +18104,15 @@ } }, "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { "asn1": "~0.2.3", @@ -16709,7 +18122,6 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, @@ -16720,9 +18132,9 @@ "dev": true }, "state-toggle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", - "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.0.tgz", + "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=", "dev": true }, "static-extend": { @@ -16777,9 +18189,9 @@ "dev": true }, "stream-events": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.4.tgz", - "integrity": "sha512-D243NJaYs/xBN2QnoiMDY7IesJFIK7gEhnvAYqJa5JvDdnh2dC4qDBwlCf0ohPpX2QRlA/4gnbnPd3rs3KxVcA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.3.tgz", + "integrity": "sha512-SvnBCMhEBQSJml4/ImlWkzGWgchjo1tVxnoBUOa1i1g3BsYNWz4W6a9Hc8VhqfmwJiEGu6tLrGdNRm/K/I4YXw==", "dev": true, "requires": { "stubs": "^3.0.0" @@ -16801,17 +18213,6 @@ "debug": "^3.1.0", "mkdirp": "^0.5.1", "readable-stream": "^2.3.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "strict-uri-encode": { @@ -16875,9 +18276,9 @@ } }, "stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz", + "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=", "dev": true, "requires": { "character-entities-html4": "^1.0.0", @@ -16904,9 +18305,9 @@ "dev": true }, "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "dev": true }, "strip-ansi": { @@ -17023,21 +18424,6 @@ "color-convert": "^1.9.0" } }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, "autoprefixer": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", @@ -17052,17 +18438,6 @@ "postcss-value-parser": "^3.2.3" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "browserslist": { "version": "2.11.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", @@ -17091,9 +18466,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -17101,33 +18476,6 @@ "supports-color": "^5.3.0" } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", @@ -17160,36 +18508,12 @@ "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "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", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -17218,9 +18542,9 @@ "dev": true }, "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", "dev": true, "requires": { "camelcase-keys": "^4.0.0", @@ -17234,27 +18558,6 @@ "trim-newlines": "^2.0.0" } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -17266,14 +18569,14 @@ } }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.3.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^5.3.0" } }, "read-pkg": { @@ -17307,12 +18610,6 @@ "strip-indent": "^2.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -17345,9 +18642,9 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -17362,22 +18659,23 @@ } }, "stylus-lookup": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-2.0.0.tgz", - "integrity": "sha512-ZPwVUITlzCIgq1NBNl1xVX1grfFnJUBq9zzG9YOj/V3GrOCnpWuxGh6zUL8JTaVs0nMS9Eyok1qgOW9mUFx9kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-1.0.2.tgz", + "integrity": "sha1-eVm+rAu1V+vROvO8Osvu/7J2YNQ=", "dev": true, "requires": { - "commander": "^2.8.1", - "debug": "^3.1.0" + "commander": "~2.8.1", + "debug": "^3.1.0", + "is-relative-path": "~1.0.0" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { - "ms": "2.0.0" + "graceful-readlink": ">= 1.0.0" } } } @@ -17401,9 +18699,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -17418,26 +18716,20 @@ "dev": true }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.3.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^5.3.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -17446,9 +18738,9 @@ } }, "superstatic": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/superstatic/-/superstatic-5.0.2.tgz", - "integrity": "sha1-186TKe4w2qp2KwHUO1SNC3MGulQ=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/superstatic/-/superstatic-5.0.1.tgz", + "integrity": "sha1-8Kg5Qq2Ok8XFOpg0HEo94inf+U4=", "dev": true, "requires": { "as-array": "^2.0.0", @@ -17650,6 +18942,18 @@ "string-width": "^2.1.1" }, "dependencies": { + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -17666,9 +18970,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -17708,9 +19012,9 @@ } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -17719,23 +19023,23 @@ } }, "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, "tar": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.4.tgz", - "integrity": "sha512-mq9ixIYfNF9SK0IS/h2HKMu8Q2iaCuhDDsZhdEag/FHv8fOaYld4vN7ouMgcSSt5WKZzPs8atclTcJm36OTh4w==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "dev": true, "requires": { "chownr": "^1.0.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", + "minipass": "^2.2.4", "minizlib": "^1.1.0", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", + "safe-buffer": "^5.1.1", "yallist": "^3.0.2" }, "dependencies": { @@ -17748,17 +19052,14 @@ } }, "tar-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", - "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", + "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", "dev": true, "requires": { "bl": "^1.0.0", - "buffer-alloc": "^1.1.0", "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.0", + "readable-stream": "^2.0.0", "xtend": "^4.0.0" } }, @@ -17994,12 +19295,6 @@ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -18007,17 +19302,6 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "to-regex": { @@ -18040,6 +19324,17 @@ "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, "topo": { @@ -18066,23 +19361,23 @@ "dev": true, "requires": { "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } } }, "toxic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toxic/-/toxic-1.0.1.tgz", - "integrity": "sha512-WI3rIGdcaKULYg7KVoB0zcjikqvcYYvcuT6D89bFPz2rVR0Rl0PK6x8/X62rtdLtBKIE985NzVf/auTtGegIIg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toxic/-/toxic-1.0.0.tgz", + "integrity": "sha1-8RVNi2rCGHWslDqfdAjfLf4WTqI=", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^2.4.1" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } } }, "tr46": { @@ -18122,15 +19417,15 @@ "dev": true }, "trim-trailing-lines": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", - "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz", + "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=", "dev": true }, "trough": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.2.tgz", - "integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.1.tgz", + "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=", "dev": true }, "true-case-path": { @@ -18197,9 +19492,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -18213,19 +19508,34 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", + "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" @@ -18279,33 +19589,17 @@ "mkdirp": "^0.5.1", "source-map": "^0.6.0", "source-map-support": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, "tslint": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", - "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -18332,9 +19626,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -18349,9 +19643,9 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -18360,16 +19654,16 @@ } }, "tsscmp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", - "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, "optional": true }, "tsutils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz", - "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==", + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.26.1.tgz", + "integrity": "sha512-bnm9bcjOqOr1UljleL94wVCDlpa6KjfGaTkefeLch4GRafgDkROxPizbB/FxTEdI++5JqhxczRy/Qub0syNqZA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -18466,6 +19760,12 @@ "wordwrap": "0.0.2" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -18500,9 +19800,9 @@ "optional": true }, "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", "dev": true }, "unc-path-regex": { @@ -18537,9 +19837,9 @@ } }, "unherit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", - "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", + "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -18547,9 +19847,9 @@ } }, "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz", + "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==", "dev": true, "requires": { "bail": "^1.0.0", @@ -18557,6 +19857,7 @@ "is-plain-obj": "^1.1.0", "trough": "^1.0.0", "vfile": "^2.0.0", + "x-is-function": "^1.0.4", "x-is-string": "^0.1.0" } }, @@ -18617,101 +19918,76 @@ } }, "unist-util-find-all-after": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz", - "integrity": "sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.1.tgz", + "integrity": "sha1-TlUSq/734GFnga7Pex7XUcAK+Qg=", "dev": true, "requires": { "unist-util-is": "^2.0.0" } }, "unist-util-is": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", - "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.1.tgz", + "integrity": "sha1-DDEmKeP5YMZukx6BLT2A53AQlHs=", "dev": true }, "unist-util-modify-children": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz", - "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz", + "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=", "dev": true, "requires": { "array-iterate": "^1.0.0" } }, "unist-util-remove-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", - "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz", + "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=", "dev": true, "requires": { "unist-util-visit": "^1.1.0" } }, "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz", + "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=", "dev": true }, "unist-util-visit": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.1.tgz", - "integrity": "sha512-0fdB9EQJU0tho5tK0VzOJzAQpPv2LyLZ030b10GxuzAWEfvd54mpY7BMjQ1L69k2YNvL+SvxRzH0yUIehOO8aA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.0.tgz", + "integrity": "sha512-9ntYcxPFtl44gnwXrQKZ5bMqXMY0ZHzUpqMFiU4zcc8mmf/jzYm8GhYgezuUlX4cJIM1zIDYaO6fG/fI+L6iiQ==", "dev": true, "requires": { "unist-util-is": "^2.1.1" } }, "universal-analytics": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.17.tgz", - "integrity": "sha512-N2JFymxv4q2N5Wmftc5JCcM5t1tp+sc1kqeDRhDL4XLY5X6PBZ0kav2wvVUZJJMvmSq3WXrmzDu062p+cSFYfQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.3.11.tgz", + "integrity": "sha1-USh5GToSpm3L2RhRITibq5E81LY=", "dev": true, "requires": { - "debug": "^3.0.0", - "request": "2.86.0", - "uuid": "^3.0.0" + "async": "0.2.x", + "node-uuid": "1.x", + "request": "2.x", + "underscore": "1.x" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true }, - "request": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.86.0.tgz", - "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } + "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 } } }, @@ -18727,9 +20003,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", "dev": true }, "unpipe": { @@ -18775,6 +20051,12 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, @@ -18846,9 +20128,9 @@ "dev": true }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", + "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==", "dev": true }, "update-notifier": { @@ -18998,6 +20280,14 @@ "dev": true, "requires": { "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } } }, "urix": { @@ -19045,6 +20335,14 @@ "dev": true, "requires": { "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "user-home": { @@ -19118,9 +20416,9 @@ "dev": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", "dev": true }, "uws": { @@ -19164,9 +20462,9 @@ } }, "validate.js": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.9.0.tgz", - "integrity": "sha1-is8BRPFSChmDXGzGY/ReCDaqVsg=", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.12.0.tgz", + "integrity": "sha512-/x2RJSvbqEyxKj0RPN4xaRquK+EggjeVXiDDEyrJzsJogjtiZ9ov7lj/svVb4DM5Q5braQF4cooAryQbUwOxlA==", "dev": true }, "vargs": { @@ -19205,24 +20503,24 @@ } }, "vfile-location": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.3.tgz", - "integrity": "sha512-zM5/l4lfw1CBoPx3Jimxoc5RNDAHHpk6AM6LM0pTIkm5SUSsx8ZekZ0PVdf0WEZ7kjlhSt7ZlqbRL6Cd6dBs6A==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.2.tgz", + "integrity": "sha1-02dcWch3SY5JK0dW/2Xkrxp1IlU=", "dev": true }, "vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-vSGCkhNvJzO6VcWC6AlJW4NtYOVtS+RgCaqFIYUjoGIlHnFL+i0LbtYvonDWOMcB97uTPT4PRsyYY7REWC9vug==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz", + "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==", "dev": true, "requires": { "unist-util-stringify-position": "^1.1.1" } }, "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { "clone": "^2.1.1", @@ -19323,6 +20621,14 @@ "dev": true, "requires": { "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "vlq": { @@ -19344,21 +20650,44 @@ "dev": true }, "wd": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/wd/-/wd-1.10.1.tgz", - "integrity": "sha512-5qkDXM8+oRGu0LovGM6iw2Fo6YJfZBJHOGVC0eDi7DK0BVzbXODCUqonHGmOxsBV9BvaSWWQJtnrcjo8Bq6WjQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/wd/-/wd-1.6.1.tgz", + "integrity": "sha512-X3KnoYBqZ4Xj7phL3hWnraapl2w0N4z9lHKDFVNOpO2j3okoO2lhd9+oAFdd/qTbCNeNuGM59Pte360jx1hMVQ==", "dev": true, "requires": { - "archiver": "2.1.1", + "archiver": "1.3.0", "async": "2.0.1", - "lodash": "4.17.10", + "lodash": "4.16.2", "mkdirp": "^0.5.1", "q": "1.4.1", - "request": "2.85.0", + "request": "2.79.0", "underscore.string": "3.3.4", "vargs": "0.1.0" }, "dependencies": { + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "walkdir": "^0.0.11", + "zip-stream": "^1.1.0" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, "async": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz", @@ -19368,35 +20697,142 @@ "lodash": "^4.8.0" } }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "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, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "lodash": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", + "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", + "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.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "extend": "~3.0.0", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", - "http-signature": "~1.2.0", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.x.x" } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true } } }, @@ -19441,22 +20877,6 @@ "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", "dev": true }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "dev": true, - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } - }, "xml2js": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", @@ -19530,9 +20950,9 @@ "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -19545,12 +20965,12 @@ "dev": true }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2" } }, "widest-line": { @@ -19569,9 +20989,9 @@ "dev": true }, "winston": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz", - "integrity": "sha512-GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", + "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", "dev": true, "requires": { "async": "~1.0.0", @@ -19667,16 +21087,21 @@ } }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", "dev": true, "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "options": ">=0.0.5", + "ultron": "1.0.x" } }, + "x-is-function": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz", + "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=", + "dev": true + }, "x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", @@ -19774,6 +21199,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, + "optional": true, "requires": { "camelcase": "^4.1.0" }, @@ -19782,7 +21208,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "dev": true, + "optional": true } } }, diff --git a/package.json b/package.json index a434c2b6673e..896f5f60e78e 100644 --- a/package.json +++ b/package.json @@ -18,13 +18,15 @@ "deploy": "gulp deploy:devapp", "webdriver-manager": "webdriver-manager", "docs": "gulp docs", - "api": "gulp api-docs" + "api": "gulp api-docs", + "breaking-changes": "gulp breaking-changes" }, - "version": "6.4.0", "license": "MIT", "engines": { "node": ">= 5.4.1" }, + "version": "6.4.7", + "requiredAngularVersion": ">=6.0.0 <7.0.0", "dependencies": { "@angular/animations": "6.0.0", "@angular/common": "6.0.0", @@ -69,8 +71,8 @@ "axe-webdriverjs": "^1.1.1", "chalk": "^1.1.3", "codelyzer": "^4.3.0", - "dgeni": "^0.4.9", - "dgeni-packages": "^0.26.0", + "dgeni": "^0.4.10", + "dgeni-packages": "^0.26.9", "firebase": "^4.0.0", "firebase-admin": "^5.0.0", "firebase-tools": "^3.11.0", diff --git a/scripts/ci/sources/tunnel.sh b/scripts/ci/sources/tunnel.sh index 5256422d5073..18384f56eb36 100644 --- a/scripts/ci/sources/tunnel.sh +++ b/scripts/ci/sources/tunnel.sh @@ -8,7 +8,7 @@ WAIT_RETRIES=2 start_tunnel() { case "$MODE" in - e2e*|saucelabs*) + saucelabs*) ./scripts/saucelabs/start-tunnel.sh ;; browserstack*) @@ -21,7 +21,7 @@ start_tunnel() { wait_for_tunnel() { case "$MODE" in - e2e*|saucelabs*) + saucelabs*) retryCall ${WAIT_RETRIES} ./scripts/saucelabs/wait-tunnel.sh ;; browserstack*) @@ -34,7 +34,7 @@ wait_for_tunnel() { teardown_tunnel() { case "$MODE" in - e2e*|saucelabs*) + saucelabs*) ./scripts/saucelabs/stop-tunnel.sh ;; browserstack*) diff --git a/scripts/ci/travis-testing.sh b/scripts/ci/travis-testing.sh index 9ab10831ba99..e81143ebe627 100755 --- a/scripts/ci/travis-testing.sh +++ b/scripts/ci/travis-testing.sh @@ -34,7 +34,9 @@ wait_for_tunnel if is_lint; then $(npm bin)/gulp ci:lint elif is_e2e; then - $(npm bin)/gulp ci:e2e + # Run e2e tests inside of Xvfb because we need to test the HTML Fullscreen API's that cannot + # be tested within Chrome headless. + xvfb-run -a --server-args='-screen 0, 1024x768x16' $(npm bin)/gulp ci:e2e elif is_aot; then $(npm bin)/gulp ci:aot elif is_payload; then diff --git a/scripts/deploy/publish-build-artifacts.sh b/scripts/deploy/publish-build-artifacts.sh index b725186a150b..25888eaed98c 100755 --- a/scripts/deploy/publish-build-artifacts.sh +++ b/scripts/deploy/publish-build-artifacts.sh @@ -58,23 +58,22 @@ publishPackage() { echo "Starting cloning process of ${repoUrl} into ${repoDir}.." - # Clone the repository and only fetch the last commit to download less unused data. - git clone ${repoUrl} ${repoDir} --depth 1 + if [[ $(git ls-remote --heads ${repoUrl} ${branchName}) ]]; then + echo "Branch ${branchName} already exists. Cloning that branch." + git clone ${repoUrl} ${repoDir} --depth 1 --branch ${branchName} - echo "Successfully cloned ${repoUrl} into ${repoDir}." + cd ${repoDir} + echo "Cloned repository and switched into the repository directory (${repoDir})." + else + echo "Branch ${branchName} does not exist on ${packageRepo} yet." + echo "Cloning default branch and creating branch '${branchName}' on top of it." - # Create the build commit and push the changes to the repository. - cd ${repoDir} + git clone ${repoUrl} ${repoDir} --depth 1 + cd ${repoDir} - echo "Switched into the repository directory (${repoDir})." + echo "Cloned repository and switched into directory. Creating new branch now.." - if [[ $(git ls-remote --heads origin ${branchName}) ]]; then - git checkout ${branchName} - echo "Switched to ${branchName} branch." - else - echo "Branch ${branchName} does not exist on ${packageRepo} yet. Creating ${branchName}.." git checkout -b ${branchName} - echo "Branch created and checked out." fi # Copy the build files to the repository diff --git a/scripts/deploy/publish-docs-content.sh b/scripts/deploy/publish-docs-content.sh index 71af9da91f17..311c7c68d82e 100755 --- a/scripts/deploy/publish-docs-content.sh +++ b/scripts/deploy/publish-docs-content.sh @@ -56,23 +56,24 @@ echo "Starting deployment of the docs-content for ${buildVersionName} in ${branc # Remove the docs-content repository if the directory exists rm -Rf ${docsContentPath} -# Clone the docs-content repository. -git clone ${docsContentRepoUrl} ${docsContentPath} --depth 1 +echo "Starting cloning process of ${docsContentRepoUrl} into ${docsContentPath}.." -echo "Successfully cloned docs-content repository." +if [[ $(git ls-remote --heads ${docsContentRepoUrl} ${branchName}) ]]; then + echo "Branch ${branchName} already exists. Cloning that branch." + git clone ${docsContentRepoUrl} ${docsContentPath} --depth 1 --branch ${branchName} -# Go into the repository directory. -cd ${docsContentPath} + cd ${docsContentPath} + echo "Cloned repository and switched into the repository directory (${docsContentPath})." +else + echo "Branch ${branchName} does not exist yet." + echo "Cloning default branch and creating branch '${branchName}' on top of it." -echo "Switched into the repository directory." + git clone ${docsContentRepoUrl} ${docsContentPath} --depth 1 + cd ${docsContentPath} + + echo "Cloned repository and switched into directory. Creating new branch now.." -if [[ $(git ls-remote --heads origin ${branchName}) ]]; then - git checkout ${branchName} - echo "Switched to ${branchName} branch." -else - echo "Branch ${branchName} does not exist on the docs-content repo yet. Creating ${branchName}.." git checkout -b ${branchName} - echo "Branch created and checked out." fi # Remove everything inside of the docs-content repository. @@ -123,6 +124,6 @@ echo "Credentials for docs-content repository are now set up. Publishing.." git add -A git commit --allow-empty -m "${buildCommitMessage}" git tag "${buildTagName}" -git push origin master --tags +git push origin ${branchName} --tags echo "Published docs-content for ${buildVersionName} into ${branchName} successfully" diff --git a/scripts/saucelabs/sauce_config.js b/scripts/saucelabs/sauce_config.js deleted file mode 100644 index 52d4df6a4b34..000000000000 --- a/scripts/saucelabs/sauce_config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = process.env.SAUCE_ACCESS_KEY.split('').reverse().join(''); diff --git a/scripts/saucelabs/start-tunnel.sh b/scripts/saucelabs/start-tunnel.sh index d27068fddfd1..eec71ab1c304 100755 --- a/scripts/saucelabs/start-tunnel.sh +++ b/scripts/saucelabs/start-tunnel.sh @@ -2,7 +2,7 @@ set -e -o pipefail -TUNNEL_FILE="sc-4.4.12-linux.tar.gz" +TUNNEL_FILE="sc-4.5.0-linux.tar.gz" TUNNEL_URL="https://saucelabs.com/downloads/${TUNNEL_FILE}" TUNNEL_DIR="/tmp/saucelabs-connect" diff --git a/src/cdk-experimental/dialog/dialog-container.ts b/src/cdk-experimental/dialog/dialog-container.ts index 62218b6170db..ffe9ae17dffe 100644 --- a/src/cdk-experimental/dialog/dialog-container.ts +++ b/src/cdk-experimental/dialog/dialog-container.ts @@ -104,7 +104,7 @@ export class CdkDialogContainer extends BasePortalOutlet implements OnDestroy { _afterExit: Subject = new Subject(); constructor( - private _elementRef: ElementRef, + private _elementRef: ElementRef, private _focusTrapFactory: FocusTrapFactory, private _changeDetectorRef: ChangeDetectorRef, @Optional() @Inject(DOCUMENT) private _document: any, diff --git a/src/cdk-experimental/drag-drop/drag-drop-registry.spec.ts b/src/cdk-experimental/drag-drop/drag-drop-registry.spec.ts new file mode 100644 index 000000000000..5acc567d30cb --- /dev/null +++ b/src/cdk-experimental/drag-drop/drag-drop-registry.spec.ts @@ -0,0 +1,174 @@ +import {QueryList, ViewChildren, Component} from '@angular/core'; +import {fakeAsync, TestBed, ComponentFixture, inject} from '@angular/core/testing'; +import { + createMouseEvent, + dispatchMouseEvent, + createTouchEvent, + dispatchTouchEvent, +} from '@angular/cdk/testing'; +import {DragDropRegistry} from './drag-drop-registry'; +import {DragDropModule} from './drag-drop-module'; +import {CdkDrag} from './drag'; +import {CdkDrop} from './drop'; + +describe('DragDropRegistry', () => { + let fixture: ComponentFixture; + let testComponent: SimpleDropZone; + let registry: DragDropRegistry; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + imports: [DragDropModule], + declarations: [SimpleDropZone], + }).compileComponents(); + + fixture = TestBed.createComponent(SimpleDropZone); + testComponent = fixture.componentInstance; + fixture.detectChanges(); + + inject([DragDropRegistry], (c: DragDropRegistry) => { + registry = c; + })(); + })); + + afterEach(() => { + registry.ngOnDestroy(); + }); + + it('should be able to start dragging an item', () => { + const firstItem = testComponent.dragItems.first; + + expect(registry.isDragging(firstItem)).toBe(false); + registry.startDragging(firstItem, createMouseEvent('mousedown')); + expect(registry.isDragging(firstItem)).toBe(true); + }); + + it('should be able to stop dragging an item', () => { + const firstItem = testComponent.dragItems.first; + + registry.startDragging(firstItem, createMouseEvent('mousedown')); + expect(registry.isDragging(firstItem)).toBe(true); + + registry.stopDragging(firstItem); + expect(registry.isDragging(firstItem)).toBe(false); + }); + + it('should stop dragging an item if it is removed', () => { + const firstItem = testComponent.dragItems.first; + + registry.startDragging(firstItem, createMouseEvent('mousedown')); + expect(registry.isDragging(firstItem)).toBe(true); + + registry.removeDragItem(firstItem); + expect(registry.isDragging(firstItem)).toBe(false); + }); + + it('should dispatch `mousemove` events after starting to drag via the mouse', () => { + const spy = jasmine.createSpy('pointerMove spy'); + const subscription = registry.pointerMove.subscribe(spy); + + registry.startDragging(testComponent.dragItems.first, createMouseEvent('mousedown')); + dispatchMouseEvent(document, 'mousemove'); + + expect(spy).toHaveBeenCalled(); + + subscription.unsubscribe(); + }); + + it('should dispatch `touchmove` events after starting to drag via touch', () => { + const spy = jasmine.createSpy('pointerMove spy'); + const subscription = registry.pointerMove.subscribe(spy); + + registry.startDragging(testComponent.dragItems.first, + createTouchEvent('touchstart') as TouchEvent); + dispatchTouchEvent(document, 'touchmove'); + + expect(spy).toHaveBeenCalled(); + + subscription.unsubscribe(); + }); + + it('should dispatch `mouseup` events after ending the drag via the mouse', () => { + const spy = jasmine.createSpy('pointerUp spy'); + const subscription = registry.pointerUp.subscribe(spy); + + registry.startDragging(testComponent.dragItems.first, createMouseEvent('mousedown')); + dispatchMouseEvent(document, 'mouseup'); + + expect(spy).toHaveBeenCalled(); + + subscription.unsubscribe(); + }); + + it('should dispatch `touchend` events after ending the drag via touch', () => { + const spy = jasmine.createSpy('pointerUp spy'); + const subscription = registry.pointerUp.subscribe(spy); + + registry.startDragging(testComponent.dragItems.first, + createTouchEvent('touchstart') as TouchEvent); + dispatchTouchEvent(document, 'touchend'); + + expect(spy).toHaveBeenCalled(); + + subscription.unsubscribe(); + }); + + it('should complete the pointer event streams on destroy', () => { + const pointerUpSpy = jasmine.createSpy('pointerUp complete spy'); + const pointerMoveSpy = jasmine.createSpy('pointerMove complete spy'); + const pointerUpSubscription = registry.pointerUp.subscribe(undefined, undefined, pointerUpSpy); + const pointerMoveSubscription = + registry.pointerMove.subscribe(undefined, undefined, pointerMoveSpy); + + registry.ngOnDestroy(); + + expect(pointerUpSpy).toHaveBeenCalled(); + expect(pointerMoveSpy).toHaveBeenCalled(); + + pointerUpSubscription.unsubscribe(); + pointerMoveSubscription.unsubscribe(); + }); + + it('should not throw when trying to register the same container again', () => { + expect(() => registry.registerDropContainer(testComponent.dropInstances.first)).not.toThrow(); + }); + + it('should throw when trying to register a different container with the same id', () => { + expect(() => { + testComponent.showDuplicateContainer = true; + fixture.detectChanges(); + }).toThrowError(/Drop instance with id \"items\" has already been registered/); + }); + + it('should be able to get a drop container by its id', () => { + expect(registry.getDropContainer('items')).toBe(testComponent.dropInstances.first); + expect(registry.getDropContainer('does-not-exist')).toBeFalsy(); + }); + + it('should not prevent the default `touchmove` actions when nothing is being dragged', () => { + expect(dispatchTouchEvent(document, 'touchmove').defaultPrevented).toBe(false); + }); + + it('should prevent the default `touchmove` action when an item is being dragged', () => { + registry.startDragging(testComponent.dragItems.first, + createTouchEvent('touchstart') as TouchEvent); + expect(dispatchTouchEvent(document, 'touchmove').defaultPrevented).toBe(true); + }); + +}); + +@Component({ + template: ` + +
{{item}}
+
+ + + ` +}) +export class SimpleDropZone { + @ViewChildren(CdkDrag) dragItems: QueryList; + @ViewChildren(CdkDrop) dropInstances: QueryList; + items = ['Zero', 'One', 'Two', 'Three']; + showDuplicateContainer = false; +} diff --git a/src/cdk-experimental/drag-drop/drag-drop-registry.ts b/src/cdk-experimental/drag-drop/drag-drop-registry.ts new file mode 100644 index 000000000000..2e7604e23eb4 --- /dev/null +++ b/src/cdk-experimental/drag-drop/drag-drop-registry.ts @@ -0,0 +1,176 @@ +/** + * @license + * Copyright Google LLC 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, NgZone, OnDestroy, Inject} from '@angular/core'; +import {DOCUMENT} from '@angular/common'; +import {supportsPassiveEventListeners} from '@angular/cdk/platform'; +import {Subject} from 'rxjs'; + +/** Event options that can be used to bind an active event. */ +const activeEventOptions = supportsPassiveEventListeners() ? {passive: false} : false; + +/** Handler for a pointer event callback. */ +type PointerEventHandler = (event: TouchEvent | MouseEvent) => void; + +/** + * Service that keeps track of all the drag item and drop container + * instances, and manages global event listeners on the `document`. + * @docs-private + */ +// Note: this class is generic, rather than referencing CdkDrag and CdkDrop directly, in order to +// avoid circular imports. If we were to reference them here, importing the registry into the +// classes that are registering themselves will introduce a circular import. +@Injectable({providedIn: 'root'}) +export class DragDropRegistry implements OnDestroy { + private _document: Document; + + /** Registered drop container instances. */ + private _dropInstances = new Set(); + + /** Registered drag item instances. */ + private _dragInstances = new Set(); + + /** Drag item instances that are currently being dragged. */ + private _activeDragInstances = new Set(); + + /** Keeps track of the event listeners that we've bound to the `document`. */ + private _globalListeners = new Map(); + + /** + * Emits the `touchmove` or `mousemove` events that are dispatched + * while the user is dragging a drag item instance. + */ + readonly pointerMove: Subject = new Subject(); + + /** + * Emits the `touchend` or `mouseup` events that are dispatched + * while the user is dragging a drag item instance. + */ + readonly pointerUp: Subject = new Subject(); + + constructor( + private _ngZone: NgZone, + @Inject(DOCUMENT) _document: any) { + this._document = _document; + } + + /** Adds a drop container to the registry. */ + registerDropContainer(drop: C) { + if (!this._dropInstances.has(drop)) { + if (this.getDropContainer(drop.id)) { + throw Error(`Drop instance with id "${drop.id}" has already been registered.`); + } + + this._dropInstances.add(drop); + } + } + + /** Adds a drag item instance to the registry. */ + registerDragItem(drag: I) { + this._dragInstances.add(drag); + + if (this._dragInstances.size === 1) { + this._ngZone.runOutsideAngular(() => { + // The event handler has to be explicitly active, because + // newer browsers make it passive by default. + this._document.addEventListener('touchmove', this._preventScrollListener, + activeEventOptions); + }); + } + } + + /** Removes a drop container from the registry. */ + removeDropContainer(drop: C) { + this._dropInstances.delete(drop); + } + + /** Removes a drag item instance from the registry. */ + removeDragItem(drag: I) { + this._dragInstances.delete(drag); + this.stopDragging(drag); + + if (this._dragInstances.size === 0) { + this._document.removeEventListener('touchmove', this._preventScrollListener, + activeEventOptions as any); + } + } + + /** + * Starts the dragging sequence for a drag instance. + * @param drag Drag instance which is being dragged. + * @param event Event that initiated the dragging. + */ + startDragging(drag: I, event: TouchEvent | MouseEvent) { + this._activeDragInstances.add(drag); + + if (this._activeDragInstances.size === 1) { + const isTouchEvent = event.type.startsWith('touch'); + const moveEvent = isTouchEvent ? 'touchmove' : 'mousemove'; + const upEvent = isTouchEvent ? 'touchend' : 'mouseup'; + + // We explicitly bind __active__ listeners here, because newer browsers will default to + // passive ones for `mousemove` and `touchmove`. The events need to be active, because we + // use `preventDefault` to prevent the page from scrolling while the user is dragging. + this._globalListeners + .set(moveEvent, {handler: e => this.pointerMove.next(e), options: activeEventOptions}) + .set(upEvent, {handler: e => this.pointerUp.next(e)}) + .forEach((config, name) => { + this._ngZone.runOutsideAngular(() => { + this._document.addEventListener(name, config.handler, config.options); + }); + }); + } + } + + /** Stops dragging a drag item instance. */ + stopDragging(drag: I) { + this._activeDragInstances.delete(drag); + + if (this._activeDragInstances.size === 0) { + this._clearGlobalListeners(); + } + } + + /** Gets whether a drag item instance is currently being dragged. */ + isDragging(drag: I) { + return this._activeDragInstances.has(drag); + } + + /** Gets a drop container by its id. */ + getDropContainer(id: string): C | undefined { + return Array.from(this._dropInstances).find(instance => instance.id === id); + } + + ngOnDestroy() { + this._dragInstances.forEach(instance => this.removeDragItem(instance)); + this._dropInstances.forEach(instance => this.removeDropContainer(instance)); + this._clearGlobalListeners(); + this.pointerMove.complete(); + this.pointerUp.complete(); + } + + /** + * Listener used to prevent `touchmove` events while the element is being dragged. + * This gets bound once, ahead of time, because WebKit won't preventDefault on a + * dynamically-added `touchmove` listener. See https://bugs.webkit.org/show_bug.cgi?id=184250. + */ + private _preventScrollListener = (event: TouchEvent) => { + if (this._activeDragInstances.size) { + event.preventDefault(); + } + } + + /** Clears out the global event listeners from the `document`. */ + private _clearGlobalListeners() { + this._globalListeners.forEach((config, name) => { + this._document.removeEventListener(name, config.handler, config.options); + }); + + this._globalListeners.clear(); + } +} diff --git a/src/cdk-experimental/drag-drop/drag-events.ts b/src/cdk-experimental/drag-drop/drag-events.ts index 7d71eb4ca38e..4ba0db09c4ff 100644 --- a/src/cdk-experimental/drag-drop/drag-events.ts +++ b/src/cdk-experimental/drag-drop/drag-events.ts @@ -55,3 +55,13 @@ export interface CdkDragDrop { /** Container from which the item was picked up. Can be the same as the `container`. */ previousContainer: CdkDropContainer; } + +/** Event emitted as the user is dragging a draggable item. */ +export interface CdkDragMove { + /** Item that is being dragged. */ + source: CdkDrag; + /** Position of the user's pointer on the page. */ + pointerPosition: {x: number, y: number}; + /** Native event that is causing the dragging. */ + event: MouseEvent | TouchEvent; +} diff --git a/src/cdk-experimental/drag-drop/drag-utils.spec.ts b/src/cdk-experimental/drag-drop/drag-utils.spec.ts new file mode 100644 index 000000000000..47f9982823fe --- /dev/null +++ b/src/cdk-experimental/drag-drop/drag-utils.spec.ts @@ -0,0 +1,69 @@ +import {moveItemInArray, transferArrayItem} from './drag-utils'; + +describe('dragging utilities', () => { + describe('moveItemInArray', () => { + let array: number[]; + + beforeEach(() => array = [0, 1, 2, 3]); + + it('should be able to move an item inside an array', () => { + moveItemInArray(array, 1, 3); + expect(array).toEqual([0, 2, 3, 1]); + }); + + it('should not do anything if the index is the same', () => { + moveItemInArray(array, 2, 2); + expect(array).toEqual([0, 1, 2, 3]); + }); + + it('should handle an index greater than the length', () => { + moveItemInArray(array, 0, 7); + expect(array).toEqual([1, 2, 3, 0]); + }); + + it('should handle an index less than zero', () => { + moveItemInArray(array, 3, -1); + expect(array).toEqual([3, 0, 1, 2]); + }); + }); + + describe('transferArrayItem', () => { + it('should be able to move an item from one array to another', () => { + const a = [0, 1, 2]; + const b = [3, 4, 5]; + + transferArrayItem(a, b, 1, 2); + expect(a).toEqual([0, 2]); + expect(b).toEqual([3, 4, 1, 5]); + }); + + it('should handle an index greater than the target array length', () => { + const a = [0, 1, 2]; + const b = [3, 4, 5]; + + transferArrayItem(a, b, 0, 7); + + expect(a).toEqual([1, 2]); + expect(b).toEqual([3, 4, 5, 0]); + }); + + it('should handle an index less than zero', () => { + const a = [0, 1, 2]; + const b = [3, 4, 5]; + + transferArrayItem(a, b, 2, -1); + expect(a).toEqual([0, 1]); + expect(b).toEqual([2, 3, 4, 5]); + }); + + it('should not do anything if the source array is empty', () => { + const a = []; + const b = [3, 4, 5]; + + transferArrayItem(a, b, 0, 0); + expect(a).toEqual([]); + expect(b).toEqual([3, 4, 5]); + }); + + }); +}); diff --git a/src/cdk-experimental/drag-drop/drag-utils.ts b/src/cdk-experimental/drag-drop/drag-utils.ts index da8cecb5becb..4a7d51b0ab6d 100644 --- a/src/cdk-experimental/drag-drop/drag-utils.ts +++ b/src/cdk-experimental/drag-drop/drag-utils.ts @@ -13,18 +13,21 @@ * @param toIndex Index to which the item should be moved. */ export function moveItemInArray(array: T[], fromIndex: number, toIndex: number): void { - if (fromIndex === toIndex) { + const from = clamp(fromIndex, array.length - 1); + const to = clamp(toIndex, array.length - 1); + + if (from === to) { return; } - const target = array[fromIndex]; - const delta = toIndex < fromIndex ? -1 : 1; + const target = array[from]; + const delta = to < from ? -1 : 1; - for (let i = fromIndex; i !== toIndex; i += delta) { + for (let i = from; i !== to; i += delta) { array[i] = array[i + delta]; } - array[toIndex] = target; + array[to] = target; } @@ -39,5 +42,16 @@ export function transferArrayItem(currentArray: T[], targetArray: T[], currentIndex: number, targetIndex: number): void { - targetArray.splice(targetIndex, 0, currentArray.splice(currentIndex, 1)[0]); + + const from = clamp(currentIndex, currentArray.length - 1); + const to = clamp(targetIndex, targetArray.length); + + if (currentArray.length) { + targetArray.splice(to, 0, currentArray.splice(from, 1)[0]); + } +} + +/** Clamps a number between zero and a maximum. */ +function clamp(value: number, max: number): number { + return Math.max(0, Math.min(max, value)); } diff --git a/src/cdk-experimental/drag-drop/drag.spec.ts b/src/cdk-experimental/drag-drop/drag.spec.ts index 19146dfaff9a..487a684e7234 100644 --- a/src/cdk-experimental/drag-drop/drag.spec.ts +++ b/src/cdk-experimental/drag-drop/drag.spec.ts @@ -1,12 +1,13 @@ import { + AfterViewInit, Component, + ElementRef, + NgZone, + Provider, + QueryList, Type, ViewChild, - ElementRef, ViewChildren, - QueryList, - AfterViewInit, - Provider, ViewEncapsulation, } from '@angular/core'; import {TestBed, ComponentFixture, fakeAsync, flush, tick} from '@angular/core/testing'; @@ -15,7 +16,7 @@ import {dispatchMouseEvent, dispatchTouchEvent} from '@angular/cdk/testing'; import {Directionality} from '@angular/cdk/bidi'; import {CdkDrag} from './drag'; import {CdkDragDrop} from './drag-events'; -import {moveItemInArray, transferArrayItem} from './drag-utils'; +import {moveItemInArray} from './drag-utils'; import {CdkDrop} from './drop'; import {CdkDragHandle} from './drag-handle'; @@ -201,6 +202,82 @@ describe('CdkDrag', () => { // go into an infinite loop trying to stringify the event, if the test fails. expect(event).toEqual({source: fixture.componentInstance.dragInstance}); })); + + it('should emit when the user is moving the drag element', () => { + const fixture = createComponent(StandaloneDraggable); + fixture.detectChanges(); + + const spy = jasmine.createSpy('move spy'); + const subscription = fixture.componentInstance.dragInstance.moved.subscribe(spy); + + dragElementViaMouse(fixture, fixture.componentInstance.dragElement.nativeElement, 5, 10); + expect(spy).toHaveBeenCalledTimes(1); + + dragElementViaMouse(fixture, fixture.componentInstance.dragElement.nativeElement, 10, 20); + expect(spy).toHaveBeenCalledTimes(2); + + subscription.unsubscribe(); + }); + + it('should emit to `moved` inside the NgZone', () => { + const fixture = createComponent(StandaloneDraggable); + fixture.detectChanges(); + + const spy = jasmine.createSpy('move spy'); + const subscription = fixture.componentInstance.dragInstance.moved + .subscribe(() => spy(NgZone.isInAngularZone())); + + dragElementViaMouse(fixture, fixture.componentInstance.dragElement.nativeElement, 10, 20); + expect(spy).toHaveBeenCalledWith(true); + + subscription.unsubscribe(); + }); + + it('should complete the `moved` stream on destroy', () => { + const fixture = createComponent(StandaloneDraggable); + fixture.detectChanges(); + + const spy = jasmine.createSpy('move spy'); + const subscription = fixture.componentInstance.dragInstance.moved + .subscribe(undefined, undefined, spy); + + fixture.destroy(); + expect(spy).toHaveBeenCalled(); + subscription.unsubscribe(); + }); + + it('should be able to lock dragging along the x axis', fakeAsync(() => { + const fixture = createComponent(StandaloneDraggable); + fixture.detectChanges(); + fixture.componentInstance.dragInstance.lockAxis = 'x'; + + const dragElement = fixture.componentInstance.dragElement.nativeElement; + + expect(dragElement.style.transform).toBeFalsy(); + + dragElementViaMouse(fixture, dragElement, 50, 100); + expect(dragElement.style.transform).toBe('translate3d(50px, 0px, 0px)'); + + dragElementViaMouse(fixture, dragElement, 100, 200); + expect(dragElement.style.transform).toBe('translate3d(150px, 0px, 0px)'); + })); + + it('should be able to lock dragging along the y axis', fakeAsync(() => { + const fixture = createComponent(StandaloneDraggable); + fixture.detectChanges(); + fixture.componentInstance.dragInstance.lockAxis = 'y'; + + const dragElement = fixture.componentInstance.dragElement.nativeElement; + + expect(dragElement.style.transform).toBeFalsy(); + + dragElementViaMouse(fixture, dragElement, 50, 100); + expect(dragElement.style.transform).toBe('translate3d(0px, 100px, 0px)'); + + dragElementViaMouse(fixture, dragElement, 100, 200); + expect(dragElement.style.transform).toBe('translate3d(0px, 300px, 0px)'); + })); + }); describe('draggable with a handle', () => { @@ -265,6 +342,26 @@ describe('CdkDrag', () => { expect(fixture.componentInstance.dropInstance.data).toBe(fixture.componentInstance.items); }); + it('should be able to attach data to a drag item', () => { + const fixture = createComponent(DraggableInDropZone); + fixture.detectChanges(); + + expect(fixture.componentInstance.dragItems.first.data) + .toBe(fixture.componentInstance.items[0]); + }); + + it('should be able to overwrite the drop zone id', fakeAsync(() => { + const fixture = createComponent(DraggableInDropZone); + + fixture.componentInstance.dropZoneId = 'custom-id'; + fixture.detectChanges(); + + const drop = fixture.componentInstance.dropInstance; + + expect(drop.id).toBe('custom-id'); + expect(drop.element.nativeElement.getAttribute('id')).toBe('custom-id'); + })); + it('should toggle a class when the user starts dragging an item', fakeAsync(() => { const fixture = createComponent(DraggableInDropZone); fixture.detectChanges(); @@ -320,6 +417,29 @@ describe('CdkDrag', () => { .toEqual(['One', 'Two', 'Zero', 'Three']); })); + it('should not move the original element from its initial DOM position', fakeAsync(() => { + const fixture = createComponent(DraggableInDropZone); + fixture.detectChanges(); + const root = fixture.nativeElement as HTMLElement; + let dragElements = Array.from(root.querySelectorAll('.cdk-drag')); + + expect(dragElements.map(el => el.textContent)).toEqual(['Zero', 'One', 'Two', 'Three']); + + // Stub out the original call so the list doesn't get re-rendered. + // We're testing the DOM order explicitly. + fixture.componentInstance.droppedSpy.and.callFake(() => {}); + + const thirdItemRect = dragElements[2].getBoundingClientRect(); + + dragElementViaMouse(fixture, fixture.componentInstance.dragItems.first.element.nativeElement, + thirdItemRect.left + 1, thirdItemRect.top + 1); + flush(); + fixture.detectChanges(); + + dragElements = Array.from(root.querySelectorAll('.cdk-drag')); + expect(dragElements.map(el => el.textContent)).toEqual(['Zero', 'One', 'Two', 'Three']); + })); + it('should dispatch the `dropped` event in a horizontal drop zone', fakeAsync(() => { const fixture = createComponent(DraggableInHorizontalDropZone); fixture.detectChanges(); @@ -460,7 +580,9 @@ describe('CdkDrag', () => { it('should move the placeholder as an item is being sorted down', fakeAsync(() => { const fixture = createComponent(DraggableInDropZone); fixture.detectChanges(); - assertDownwardSorting(fixture); + assertDownwardSorting(fixture, fixture.componentInstance.dragItems.map(item => { + return item.element.nativeElement; + })); })); it('should move the placeholder as an item is being sorted down on a scrolled page', @@ -470,14 +592,18 @@ describe('CdkDrag', () => { const cleanup = makePageScrollable(); scrollTo(0, 500); - assertDownwardSorting(fixture); + assertDownwardSorting(fixture, fixture.componentInstance.dragItems.map(item => { + return item.element.nativeElement; + })); cleanup(); })); it('should move the placeholder as an item is being sorted up', fakeAsync(() => { const fixture = createComponent(DraggableInDropZone); fixture.detectChanges(); - assertUpwardSorting(fixture); + assertUpwardSorting(fixture, fixture.componentInstance.dragItems.map(item => { + return item.element.nativeElement; + })); })); it('should move the placeholder as an item is being sorted up on a scrolled page', @@ -487,7 +613,9 @@ describe('CdkDrag', () => { const cleanup = makePageScrollable(); scrollTo(0, 500); - assertUpwardSorting(fixture); + assertUpwardSorting(fixture, fixture.componentInstance.dragItems.map(item => { + return item.element.nativeElement; + })); cleanup(); })); @@ -511,7 +639,7 @@ describe('CdkDrag', () => { // Add a few pixels to the left offset so we get some overlap. dispatchMouseEvent(document, 'mousemove', elementRect.left + 5, elementRect.top); fixture.detectChanges(); - expect(getElementIndex(placeholder)).toBe(i); + expect(getElementIndexByPosition(placeholder, 'left')).toBe(i); } dispatchMouseEvent(document, 'mouseup'); @@ -539,7 +667,7 @@ describe('CdkDrag', () => { // Remove a few pixels from the right offset so we get some overlap. dispatchMouseEvent(document, 'mousemove', elementRect.right - 5, elementRect.top); fixture.detectChanges(); - expect(getElementIndex(placeholder)).toBe(Math.min(i + 1, items.length - 1)); + expect(getElementIndexByPosition(placeholder, 'left')).toBe(i); } dispatchMouseEvent(document, 'mouseup'); @@ -594,6 +722,65 @@ describe('CdkDrag', () => { expect(preview.style.transform).toBe('translate3d(50px, 50px, 0px)'); })); + it('should lock position inside a drop container along the x axis', fakeAsync(() => { + const fixture = createComponent(DraggableInDropZoneWithCustomPreview); + fixture.detectChanges(); + + const item = fixture.componentInstance.dragItems.toArray()[1]; + const element = item.element.nativeElement; + + item.lockAxis = 'x'; + + dispatchMouseEvent(element, 'mousedown', 50, 50); + fixture.detectChanges(); + + dispatchMouseEvent(element, 'mousemove', 100, 100); + fixture.detectChanges(); + + const preview = document.querySelector('.cdk-drag-preview')! as HTMLElement; + + expect(preview.style.transform).toBe('translate3d(100px, 50px, 0px)'); + })); + + it('should lock position inside a drop container along the y axis', fakeAsync(() => { + const fixture = createComponent(DraggableInDropZoneWithCustomPreview); + fixture.detectChanges(); + + const item = fixture.componentInstance.dragItems.toArray()[1]; + const element = item.element.nativeElement; + + item.lockAxis = 'y'; + + dispatchMouseEvent(element, 'mousedown', 50, 50); + fixture.detectChanges(); + + dispatchMouseEvent(element, 'mousemove', 100, 100); + fixture.detectChanges(); + + const preview = document.querySelector('.cdk-drag-preview')! as HTMLElement; + + expect(preview.style.transform).toBe('translate3d(50px, 100px, 0px)'); + })); + + it('should inherit the position locking from the drop container', fakeAsync(() => { + const fixture = createComponent(DraggableInDropZoneWithCustomPreview); + fixture.detectChanges(); + + const element = fixture.componentInstance.dragItems.toArray()[1].element.nativeElement; + + fixture.componentInstance.dropInstance.lockAxis = 'x'; + + dispatchMouseEvent(element, 'mousedown', 50, 50); + fixture.detectChanges(); + + dispatchMouseEvent(element, 'mousemove', 100, 100); + fixture.detectChanges(); + + const preview = document.querySelector('.cdk-drag-preview')! as HTMLElement; + + expect(preview.style.transform).toBe('translate3d(100px, 50px, 0px)'); + })); + it('should be able to customize the placeholder', fakeAsync(() => { const fixture = createComponent(DraggableInDropZoneWithCustomPlaceholder); fixture.detectChanges(); @@ -609,6 +796,31 @@ describe('CdkDrag', () => { expect(placeholder.textContent!.trim()).toContain('Custom placeholder'); })); + it('should clear the `transform` value from siblings when item is dropped`', fakeAsync(() => { + const fixture = createComponent(DraggableInDropZone); + fixture.detectChanges(); + + const dragItems = fixture.componentInstance.dragItems; + const firstItem = dragItems.first; + const thirdItem = dragItems.toArray()[2].element.nativeElement; + const thirdItemRect = thirdItem.getBoundingClientRect(); + + dispatchMouseEvent(firstItem.element.nativeElement, 'mousedown'); + fixture.detectChanges(); + + dispatchMouseEvent(document, 'mousemove', thirdItemRect.left + 1, thirdItemRect.top + 1); + fixture.detectChanges(); + + expect(thirdItem.style.transform).toBeTruthy(); + + dispatchMouseEvent(document, 'mouseup'); + fixture.detectChanges(); + flush(); + fixture.detectChanges(); + + expect(thirdItem.style.transform).toBeFalsy(); + })); + }); describe('in a connected drop container', () => { @@ -617,9 +829,249 @@ describe('CdkDrag', () => { const fixture = createComponent(ConnectedDropZones); fixture.detectChanges(); - // TODO - // console.log(fixture.componentInstance.groupedDragItems.map(d => d.length)); + const groups = fixture.componentInstance.groupedDragItems; + const item = groups[0][1]; + const targetRect = groups[1][2].element.nativeElement.getBoundingClientRect(); + + dragElementViaMouse(fixture, item.element.nativeElement, + targetRect.left + 1, targetRect.top + 1); + flush(); + fixture.detectChanges(); + + expect(fixture.componentInstance.droppedSpy).toHaveBeenCalledTimes(1); + + const event = fixture.componentInstance.droppedSpy.calls.mostRecent().args[0]; + + expect(event).toEqual({ + previousIndex: 1, + currentIndex: 3, + item, + container: fixture.componentInstance.dropInstances.toArray()[1], + previousContainer: fixture.componentInstance.dropInstances.first + }); })); + + it('should be able to move the element over a new container and return it', fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + fixture.detectChanges(); + + const groups = fixture.componentInstance.groupedDragItems; + const dropZones = fixture.componentInstance.dropInstances.map(d => d.element.nativeElement); + const item = groups[0][1]; + const initialRect = item.element.nativeElement.getBoundingClientRect(); + const targetRect = groups[1][2].element.nativeElement.getBoundingClientRect(); + + dispatchMouseEvent(item.element.nativeElement, 'mousedown'); + fixture.detectChanges(); + + const placeholder = dropZones[0].querySelector('.cdk-drag-placeholder')!; + + expect(placeholder).toBeTruthy(); + expect(dropZones[0].contains(placeholder)) + .toBe(true, 'Expected placeholder to be inside the first container.'); + + dispatchMouseEvent(document, 'mousemove', targetRect.left + 1, targetRect.top + 1); + fixture.detectChanges(); + + expect(dropZones[1].contains(placeholder)) + .toBe(true, 'Expected placeholder to be inside second container.'); + + dispatchMouseEvent(document, 'mousemove', initialRect.left + 1, initialRect.top + 1); + fixture.detectChanges(); + + expect(dropZones[0].contains(placeholder)) + .toBe(true, 'Expected placeholder to be back inside first container.'); + + dispatchMouseEvent(document, 'mouseup'); + fixture.detectChanges(); + + expect(fixture.componentInstance.droppedSpy).not.toHaveBeenCalled(); + })); + + it('should transfer the DOM element from one drop zone to another', fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + fixture.detectChanges(); + + const groups = fixture.componentInstance.groupedDragItems.slice(); + const element = groups[0][1].element.nativeElement; + const dropInstances = fixture.componentInstance.dropInstances.toArray(); + const targetRect = groups[1][2].element.nativeElement.getBoundingClientRect(); + + dragElementViaMouse(fixture, element, targetRect.left + 1, targetRect.top + 1); + flush(); + fixture.detectChanges(); + + const event = fixture.componentInstance.droppedSpy.calls.mostRecent().args[0]; + + expect(event).toBeTruthy(); + expect(event).toEqual({ + previousIndex: 1, + currentIndex: 3, + item: groups[0][1], + container: dropInstances[1], + previousContainer: dropInstances[0] + }); + })); + + it('should not be able to transfer an item into a container that is not in `connectedTo`', + fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + + fixture.detectChanges(); + fixture.componentInstance.dropInstances.forEach(d => d.connectedTo = []); + fixture.detectChanges(); + + const groups = fixture.componentInstance.groupedDragItems.slice(); + const element = groups[0][1].element.nativeElement; + const dropInstances = fixture.componentInstance.dropInstances.toArray(); + const targetRect = groups[1][2].element.nativeElement.getBoundingClientRect(); + + dragElementViaMouse(fixture, element, targetRect.left + 1, targetRect.top + 1); + flush(); + fixture.detectChanges(); + + const event = fixture.componentInstance.droppedSpy.calls.mostRecent().args[0]; + + expect(event).toBeTruthy(); + expect(event).toEqual({ + previousIndex: 1, + currentIndex: 1, + item: groups[0][1], + container: dropInstances[0], + previousContainer: dropInstances[0] + }); + })); + + it('should not be able to transfer an item that does not match the `enterPredicate`', + fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + + fixture.detectChanges(); + fixture.componentInstance.dropInstances.forEach(d => d.enterPredicate = () => false); + fixture.detectChanges(); + + const groups = fixture.componentInstance.groupedDragItems.slice(); + const element = groups[0][1].element.nativeElement; + const dropInstances = fixture.componentInstance.dropInstances.toArray(); + const targetRect = groups[1][2].element.nativeElement.getBoundingClientRect(); + + dragElementViaMouse(fixture, element, targetRect.left + 1, targetRect.top + 1); + flush(); + fixture.detectChanges(); + + const event = fixture.componentInstance.droppedSpy.calls.mostRecent().args[0]; + + expect(event).toBeTruthy(); + expect(event).toEqual({ + previousIndex: 1, + currentIndex: 1, + item: groups[0][1], + container: dropInstances[0], + previousContainer: dropInstances[0] + }); + })); + + it('should be able to start dragging after an item has been transferred', fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + fixture.detectChanges(); + + const groups = fixture.componentInstance.groupedDragItems; + const element = groups[0][1].element.nativeElement; + const dropZone = fixture.componentInstance.dropInstances.toArray()[1].element.nativeElement; + const targetRect = dropZone.getBoundingClientRect(); + + // Drag the element into the drop zone and move it to the top. + [1, -1].forEach(offset => { + dragElementViaMouse(fixture, element, targetRect.left + offset, targetRect.top + offset); + flush(); + fixture.detectChanges(); + }); + + assertDownwardSorting(fixture, Array.from(dropZone.querySelectorAll('.cdk-drag'))); + })); + + it('should be able to return the last item inside its initial container', fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + + // Make sure there's only one item in the first list. + fixture.componentInstance.todo = ['things']; + fixture.detectChanges(); + + const groups = fixture.componentInstance.groupedDragItems; + const dropZones = fixture.componentInstance.dropInstances.map(d => d.element.nativeElement); + const item = groups[0][0]; + const initialRect = item.element.nativeElement.getBoundingClientRect(); + const targetRect = groups[1][0].element.nativeElement.getBoundingClientRect(); + + dispatchMouseEvent(item.element.nativeElement, 'mousedown'); + fixture.detectChanges(); + + const placeholder = dropZones[0].querySelector('.cdk-drag-placeholder')!; + + expect(placeholder).toBeTruthy(); + + expect(dropZones[0].contains(placeholder)) + .toBe(true, 'Expected placeholder to be inside the first container.'); + + dispatchMouseEvent(document, 'mousemove', targetRect.left + 1, targetRect.top + 1); + fixture.detectChanges(); + + expect(dropZones[1].contains(placeholder)) + .toBe(true, 'Expected placeholder to be inside second container.'); + + dispatchMouseEvent(document, 'mousemove', initialRect.left + 1, initialRect.top + 1); + fixture.detectChanges(); + + expect(dropZones[0].contains(placeholder)) + .toBe(true, 'Expected placeholder to be back inside first container.'); + + dispatchMouseEvent(document, 'mouseup'); + fixture.detectChanges(); + + expect(fixture.componentInstance.droppedSpy).not.toHaveBeenCalled(); + })); + + it('should assign a default id on each drop zone', fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + fixture.detectChanges(); + + expect(fixture.componentInstance.dropInstances.toArray().every(dropZone => { + return !!dropZone.id && !!dropZone.element.nativeElement.getAttribute('id'); + })).toBe(true); + })); + + it('should be able to connect two drop zones by id', fakeAsync(() => { + const fixture = createComponent(ConnectedDropZones); + fixture.detectChanges(); + + const dropInstances = fixture.componentInstance.dropInstances.toArray(); + + dropInstances[0].id = 'todo'; + dropInstances[1].id = 'done'; + dropInstances[0].connectedTo = ['done']; + dropInstances[1].connectedTo = ['todo']; + fixture.detectChanges(); + + const groups = fixture.componentInstance.groupedDragItems; + const element = groups[0][1].element.nativeElement; + const targetRect = groups[1][2].element.nativeElement.getBoundingClientRect(); + + dragElementViaMouse(fixture, element, targetRect.left + 1, targetRect.top + 1); + flush(); + fixture.detectChanges(); + + const event = fixture.componentInstance.droppedSpy.calls.mostRecent().args[0]; + + expect(event).toBeTruthy(); + expect(event).toEqual({ + previousIndex: 1, + currentIndex: 3, + item: groups[0][1], + container: dropInstances[1], + previousContainer: dropInstances[0] + }); + })); + }); }); @@ -699,11 +1151,13 @@ export class StandaloneDraggableWithMultipleHandles { template: `
{{item}}
` @@ -712,6 +1166,7 @@ export class DraggableInDropZone { @ViewChildren(CdkDrag) dragItems: QueryList; @ViewChild(CdkDrop) dropInstance: CdkDrop; items = ['Zero', 'One', 'Two', 'Three']; + dropZoneId = 'items'; droppedSpy = jasmine.createSpy('dropped spy').and.callFake((event: CdkDragDrop) => { moveItemInArray(this.items, event.previousIndex, event.currentIndex); }); @@ -767,6 +1222,7 @@ export class DraggableInHorizontalDropZone { ` }) export class DraggableInDropZoneWithCustomPreview { + @ViewChild(CdkDrop) dropInstance: CdkDrop; @ViewChildren(CdkDrag) dragItems: QueryList; items = ['Zero', 'One', 'Two', 'Three']; } @@ -790,29 +1246,36 @@ export class DraggableInDropZoneWithCustomPlaceholder { @Component({ + encapsulation: ViewEncapsulation.None, + styles: [` + .cdk-drop { + display: block; + width: 100px; + min-height: ${ITEM_HEIGHT}px; + background: hotpink; + } + + .cdk-drag { + display: block; + height: ${ITEM_HEIGHT}px; + background: red; + } + `], template: ` -
{{item}}
+
{{item}}
-
{{item}}
+
{{item}}
` }) @@ -821,20 +1284,9 @@ export class ConnectedDropZones implements AfterViewInit { @ViewChildren(CdkDrop) dropInstances: QueryList; groupedDragItems: CdkDrag[][] = []; - todo = ['Zero', 'One', 'Two', 'Three']; done = ['Four', 'Five', 'Six']; - - droppedSpy = jasmine.createSpy('dropped spy').and.callFake((event: CdkDragDrop) => { - if (event.previousContainer === event.container) { - moveItemInArray(event.container.data, event.previousIndex, event.currentIndex); - } else { - transferArrayItem(event.previousContainer.data, - event.container.data, - event.previousIndex, - event.currentIndex); - } - }); + droppedSpy = jasmine.createSpy('dropped spy'); ngAfterViewInit() { this.dropInstances.forEach((dropZone, index) => { @@ -889,9 +1341,15 @@ function dragElementViaTouch(fixture: ComponentFixture, fixture.detectChanges(); } -/** Gets the index of a DOM element inside its parent. */ -function getElementIndex(element: HTMLElement) { - return element.parentElement ? Array.from(element.parentElement.children).indexOf(element) : -1; +/** Gets the index of an element among its siblings, based on their position on the page. */ +function getElementIndexByPosition(element: HTMLElement, direction: 'top' | 'left') { + if (!element.parentElement) { + return -1; + } + + return Array.from(element.parentElement.children) + .sort((a, b) => a.getBoundingClientRect()[direction] - b.getBoundingClientRect()[direction]) + .indexOf(element); } /** @@ -913,10 +1371,10 @@ function makePageScrollable() { /** * Asserts that sorting an element down works correctly. * @param fixture Fixture against which to run the assertions. + * @param items Array of items against which to test sorting. */ -function assertDownwardSorting(fixture: ComponentFixture) { - const items = fixture.componentInstance.dragItems.toArray(); - const draggedItem = items[0].element.nativeElement; +function assertDownwardSorting(fixture: ComponentFixture, items: Element[]) { + const draggedItem = items[0]; const {top, left} = draggedItem.getBoundingClientRect(); dispatchMouseEvent(draggedItem, 'mousedown', left, top); @@ -926,12 +1384,12 @@ function assertDownwardSorting(fixture: ComponentFixture) { // Drag over each item one-by-one going downwards. for (let i = 0; i < items.length; i++) { - const elementRect = items[i].element.nativeElement.getBoundingClientRect(); + const elementRect = items[i].getBoundingClientRect(); // Add a few pixels to the top offset so we get some overlap. dispatchMouseEvent(document, 'mousemove', elementRect.left, elementRect.top + 5); fixture.detectChanges(); - expect(getElementIndex(placeholder)).toBe(i); + expect(getElementIndexByPosition(placeholder, 'top')).toBe(i); } dispatchMouseEvent(document, 'mouseup'); @@ -942,10 +1400,10 @@ function assertDownwardSorting(fixture: ComponentFixture) { /** * Asserts that sorting an element up works correctly. * @param fixture Fixture against which to run the assertions. + * @param items Array of items against which to test sorting. */ -function assertUpwardSorting(fixture: ComponentFixture) { - const items = fixture.componentInstance.dragItems.toArray(); - const draggedItem = items[items.length - 1].element.nativeElement; +function assertUpwardSorting(fixture: ComponentFixture, items: Element[]) { + const draggedItem = items[items.length - 1]; const {top, left} = draggedItem.getBoundingClientRect(); dispatchMouseEvent(draggedItem, 'mousedown', left, top); @@ -955,12 +1413,12 @@ function assertUpwardSorting(fixture: ComponentFixture) { // Drag over each item one-by-one going upwards. for (let i = items.length - 1; i > -1; i--) { - const elementRect = items[i].element.nativeElement.getBoundingClientRect(); + const elementRect = items[i].getBoundingClientRect(); // Remove a few pixels from the bottom offset so we get some overlap. dispatchMouseEvent(document, 'mousemove', elementRect.left, elementRect.bottom - 5); fixture.detectChanges(); - expect(getElementIndex(placeholder)).toBe(Math.min(i + 1, items.length - 1)); + expect(getElementIndexByPosition(placeholder, 'top')).toBe(i); } dispatchMouseEvent(document, 'mouseup'); diff --git a/src/cdk-experimental/drag-drop/drag.ts b/src/cdk-experimental/drag-drop/drag.ts index 6093f2ffe387..ac4ddad852ce 100644 --- a/src/cdk-experimental/drag-drop/drag.ts +++ b/src/cdk-experimental/drag-drop/drag.ts @@ -7,36 +7,43 @@ */ import { - Directive, ContentChild, - Inject, - Optional, + ContentChildren, + Directive, ElementRef, - AfterContentInit, + EmbeddedViewRef, + EventEmitter, + Inject, + Input, NgZone, - SkipSelf, OnDestroy, + Optional, Output, - EventEmitter, - ViewContainerRef, - EmbeddedViewRef, - ContentChildren, QueryList, + SkipSelf, + ViewContainerRef, } from '@angular/core'; -import {DOCUMENT} from '@angular/platform-browser'; +import {DOCUMENT} from '@angular/common'; import {Directionality} from '@angular/cdk/bidi'; import {CdkDragHandle} from './drag-handle'; import {CdkDropContainer, CDK_DROP_CONTAINER} from './drop-container'; -import {supportsPassiveEventListeners} from '@angular/cdk/platform'; -import {CdkDragStart, CdkDragEnd, CdkDragExit, CdkDragEnter, CdkDragDrop} from './drag-events'; +import { + CdkDragStart, + CdkDragEnd, + CdkDragExit, + CdkDragEnter, + CdkDragDrop, + CdkDragMove, +} from './drag-events'; import {CdkDragPreview} from './drag-preview'; import {CdkDragPlaceholder} from './drag-placeholder'; import {ViewportRuler} from '@angular/cdk/overlay'; +import {DragDropRegistry} from './drag-drop-registry'; +import {Subject, merge, Observable} from 'rxjs'; +import {takeUntil} from 'rxjs/operators'; -/** Event options that can be used to bind an active event. */ -const activeEventOptions = supportsPassiveEventListeners() ? {passive: false} : false; - -// TODO: add an API for moving a draggable up/down the +// TODO(crisbeto): add auto-scrolling functionality. +// TODO(crisbeto): add an API for moving a draggable up/down the // list programmatically. Useful for keyboard controls. /** Element that can be moved inside a CdkDrop container. */ @@ -49,8 +56,9 @@ const activeEventOptions = supportsPassiveEventListeners() ? {passive: false} : '(touchstart)': '_startDragging($event)', } }) -export class CdkDrag implements AfterContentInit, OnDestroy { +export class CdkDrag implements OnDestroy { private _document: Document; + private _destroyed = new Subject(); /** Element displayed next to the user's pointer while the element is dragged. */ private _preview: HTMLElement; @@ -70,6 +78,12 @@ export class CdkDrag implements AfterContentInit, OnDestroy { /** Coordinates on the page at which the user picked up the element. */ private _pickupPositionOnPage: Point; + /** + * Reference to the element that comes after the draggable in the DOM, at the time + * it was picked up. Used for restoring its initial position when it's dropped. + */ + private _nextSibling: Node | null; + /** * CSS `transform` applied to the element when it isn't being dragged. We need a * passive transform in order for the dragged element to retain its new position @@ -81,9 +95,6 @@ export class CdkDrag implements AfterContentInit, OnDestroy { /** CSS `transform` that is applied to the element while it's being dragged. */ private _activeTransform: Point = {x: 0, y: 0}; - /** Whether the element is being dragged. */ - private _isDragging = false; - /** Whether the element has moved since the user started dragging it. */ private _hasMoved = false; @@ -93,31 +104,61 @@ export class CdkDrag implements AfterContentInit, OnDestroy { /** Cached scroll position on the page when the element was picked up. */ private _scrollPosition: {top: number, left: number}; + /** Emits when the item is being moved. */ + private _moveEvents = new Subject>(); + + /** + * Amount of subscriptions to the move event. Used to avoid + * hitting the zone if the consumer didn't subscribe to it. + */ + private _moveEventSubscriptions = 0; + /** Elements that can be used to drag the draggable item. */ @ContentChildren(CdkDragHandle) _handles: QueryList; /** Element that will be used as a template to create the draggable item's preview. */ @ContentChild(CdkDragPreview) _previewTemplate: CdkDragPreview; - /** - * Template for placeholder element rendered to show where a draggable would be dropped. - */ + /** Template for placeholder element rendered to show where a draggable would be dropped. */ @ContentChild(CdkDragPlaceholder) _placeholderTemplate: CdkDragPlaceholder; + /** Arbitrary data to attach to this drag instance. */ + @Input('cdkDragData') data: T; + + /** Locks the position of the dragged element along the specified axis. */ + @Input('cdkDragLockAxis') lockAxis: 'x' | 'y'; + /** Emits when the user starts dragging the item. */ - @Output('cdkDragStarted') started = new EventEmitter(); + @Output('cdkDragStarted') started: EventEmitter = new EventEmitter(); /** Emits when the user stops dragging an item in the container. */ - @Output('cdkDragEnded') ended = new EventEmitter(); + @Output('cdkDragEnded') ended: EventEmitter = new EventEmitter(); /** Emits when the user has moved the item into a new container. */ - @Output('cdkDragEntered') entered = new EventEmitter>(); + @Output('cdkDragEntered') entered: EventEmitter> = + new EventEmitter>(); /** Emits when the user removes the item its container by dragging it into another container. */ - @Output('cdkDragExited') exited = new EventEmitter>(); + @Output('cdkDragExited') exited: EventEmitter> = + new EventEmitter>(); /** Emits when the user drops the item inside a container. */ - @Output('cdkDragDropped') dropped = new EventEmitter>(); + @Output('cdkDragDropped') dropped: EventEmitter> = + new EventEmitter>(); + + /** + * Emits as the user is dragging the item. Use with caution, + * because this event will fire for every pixel that the user has dragged. + */ + @Output('cdkDragMoved') moved: Observable> = Observable.create(observer => { + const subscription = this._moveEvents.subscribe(observer); + this._moveEventSubscriptions++; + + return () => { + subscription.unsubscribe(); + this._moveEventSubscriptions--; + }; + }); constructor( /** Element that the draggable is attached to. */ @@ -128,8 +169,10 @@ export class CdkDrag implements AfterContentInit, OnDestroy { private _ngZone: NgZone, private _viewContainerRef: ViewContainerRef, private _viewportRuler: ViewportRuler, + private _dragDropRegistry: DragDropRegistry, CdkDropContainer>, @Optional() private _dir: Directionality) { this._document = document; + _dragDropRegistry.registerDragItem(this); } /** @@ -140,27 +183,23 @@ export class CdkDrag implements AfterContentInit, OnDestroy { return this._placeholder; } - ngAfterContentInit() { - // WebKit won't preventDefault on a dynamically-added `touchmove` listener, which means that - // we need to add one ahead of time. See https://bugs.webkit.org/show_bug.cgi?id=184250. - // TODO: move into a central registry. - this._ngZone.runOutsideAngular(() => { - this._document.addEventListener('touchmove', this._preventScrollListener, activeEventOptions); - }); - } - ngOnDestroy() { - this._removeDocumentEvents(); this._destroyPreview(); this._destroyPlaceholder(); - this._document.removeEventListener('touchmove', this._preventScrollListener, - activeEventOptions as any); - if (this._isDragging) { + // Do this check before removing from the registry since it'll + // stop being considered as dragged once it is removed. + if (this._dragDropRegistry.isDragging(this)) { // Since we move out the element to the end of the body while it's being // dragged, we have to make sure that it's removed if it gets destroyed. this._removeElement(this.element.nativeElement); } + + this._nextSibling = null; + this._dragDropRegistry.removeDragItem(this); + this._moveEvents.complete(); + this._destroyed.next(); + this._destroyed.complete(); } /** Starts the dragging sequence. */ @@ -184,11 +223,21 @@ export class CdkDrag implements AfterContentInit, OnDestroy { /** Handler for when the pointer is pressed down on the element or the handle. */ private _pointerDown = (referenceElement: ElementRef, event: MouseEvent | TouchEvent) => { - if (this._isDragging) { + if (this._dragDropRegistry.isDragging(this)) { return; } - this._isDragging = true; + const endedOrDestroyed = merge(this.ended, this._destroyed); + + this._dragDropRegistry.pointerMove + .pipe(takeUntil(endedOrDestroyed)) + .subscribe(this._pointerMove); + + this._dragDropRegistry.pointerUp + .pipe(takeUntil(endedOrDestroyed)) + .subscribe(this._pointerUp); + + this._dragDropRegistry.startDragging(this, event); this._initialContainer = this.dropContainer; this._scrollPosition = this._viewportRuler.getViewportScrollPosition(); @@ -197,7 +246,6 @@ export class CdkDrag implements AfterContentInit, OnDestroy { this._pickupPositionInElement = this._previewTemplate ? {x: 0, y: 0} : this._getPointerPositionInElement(referenceElement, event); this._pickupPositionOnPage = this._getPointerPositionOnPage(event); - this._registerMoveListeners(event); // Emit the event on the item before the one on the container. this.started.emit({source: this}); @@ -211,6 +259,7 @@ export class CdkDrag implements AfterContentInit, OnDestroy { // place will throw off the consumer's `:last-child` selectors. We can't remove the element // from the DOM completely, because iOS will stop firing all subsequent events in the chain. element.style.display = 'none'; + this._nextSibling = element.nextSibling; this._document.body.appendChild(element.parentNode!.replaceChild(placeholder, element)); this._document.body.appendChild(preview); this.dropContainer.start(); @@ -219,32 +268,49 @@ export class CdkDrag implements AfterContentInit, OnDestroy { /** Handler that is invoked when the user moves their pointer after they've initiated a drag. */ private _pointerMove = (event: MouseEvent | TouchEvent) => { - if (!this._isDragging) { + // TODO(crisbeto): this should start dragging after a certain threshold, + // otherwise we risk interfering with clicks on the element. + if (!this._dragDropRegistry.isDragging(this)) { return; } this._hasMoved = true; event.preventDefault(); + const pointerPosition = this._getConstrainedPointerPosition(event); + if (this.dropContainer) { - this._updateActiveDropContainer(event); + this._updateActiveDropContainer(pointerPosition); } else { const activeTransform = this._activeTransform; - const {x: pageX, y: pageY} = this._getPointerPositionOnPage(event); - activeTransform.x = pageX - this._pickupPositionOnPage.x + this._passiveTransform.x; - activeTransform.y = pageY - this._pickupPositionOnPage.y + this._passiveTransform.y; + activeTransform.x = + pointerPosition.x - this._pickupPositionOnPage.x + this._passiveTransform.x; + activeTransform.y = + pointerPosition.y - this._pickupPositionOnPage.y + this._passiveTransform.y; this._setTransform(this.element.nativeElement, activeTransform.x, activeTransform.y); } + + // Since this event gets fired for every pixel while dragging, we only + // want to fire it if the consumer opted into it. Also we have to + // re-enter the zone becaus we run all of the events on the outside. + if (this._moveEventSubscriptions > 0) { + this._ngZone.run(() => { + this._moveEvents.next({ + source: this, + pointerPosition, + event + }); + }); + } } /** Handler that is invoked when the user lifts their pointer up, after initiating a drag. */ private _pointerUp = () => { - if (!this._isDragging) { + if (!this._dragDropRegistry.isDragging(this)) { return; } - this._removeDocumentEvents(); - this._isDragging = false; + this._dragDropRegistry.stopDragging(this); if (!this.dropContainer) { // Convert the active transform into a passive one. This means that next time @@ -261,14 +327,24 @@ export class CdkDrag implements AfterContentInit, OnDestroy { /** Cleans up the DOM artifacts that were added to facilitate the element being dragged. */ private _cleanupDragArtifacts() { + // Restore the element's visibility and insert it at its old position in the DOM. + // It's important that we maintain the position, because moving the element around in the DOM + // can throw off `NgFor` which does smart diffing and re-creates elements only when necessary, + // while moving the existing elements in all other cases. + this.element.nativeElement.style.display = ''; + + if (this._nextSibling) { + this._nextSibling.parentNode!.insertBefore(this.element.nativeElement, this._nextSibling); + } else { + this._placeholder.parentNode!.appendChild(this.element.nativeElement); + } + this._destroyPreview(); - this._placeholder.parentNode!.insertBefore(this.element.nativeElement, this._placeholder); this._destroyPlaceholder(); - this.element.nativeElement.style.display = ''; // Re-enter the NgZone since we bound `document` events on the outside. this._ngZone.run(() => { - const currentIndex = this._getElementIndexInDom(); + const currentIndex = this.dropContainer.getItemIndex(this); this.ended.emit({source: this}); this.dropped.emit({ @@ -286,21 +362,19 @@ export class CdkDrag implements AfterContentInit, OnDestroy { * Updates the item's position in its drop container, or moves it * into a new one, depending on its current drag position. */ - private _updateActiveDropContainer(event: MouseEvent | TouchEvent) { - const {x, y} = this._getPointerPositionOnPage(event); - + private _updateActiveDropContainer({x, y}) { // Drop container that draggable has been moved into. - const newContainer = this.dropContainer._getSiblingContainerFromPosition(x, y); + const newContainer = this.dropContainer._getSiblingContainerFromPosition(this, x, y); if (newContainer) { this._ngZone.run(() => { // Notify the old container that the item has left. - this.exited.emit({ item: this, container: this.dropContainer }); + this.exited.emit({item: this, container: this.dropContainer}); this.dropContainer.exit(this); // Notify the new container that the item has entered. - this.entered.emit({ item: this, container: newContainer }); + this.entered.emit({item: this, container: newContainer}); this.dropContainer = newContainer; - this.dropContainer.enter(this); + this.dropContainer.enter(this, x, y); }); } @@ -358,39 +432,6 @@ export class CdkDrag implements AfterContentInit, OnDestroy { return placeholder; } - /** Gets the index of the dragable element, based on its index in the DOM. */ - private _getElementIndexInDom(): number { - // Note: we may be able to figure this in memory while sorting, but doing so won't be very - // reliable when transferring between containers, because the new container doesn't have - // the proper indices yet. Also this will work better for the case where the consumer - // isn't using an `ngFor` to render the list. - const element = this.element.nativeElement; - - if (!element.parentElement) { - return -1; - } - - // Avoid accessing `children` and `children.length` too much since they're a "live collection". - let index = 0; - const siblings = element.parentElement.children; - const siblingsLength = siblings.length; - const draggableElements = this.dropContainer._draggables - .filter(item => item !== this) - .map(item => item.element.nativeElement); - - // Loop through the sibling elements to find out the index of the - // current one, while skipping any elements that aren't draggable. - for (let i = 0; i < siblingsLength; i++) { - if (siblings[i] === element) { - return index; - } else if (draggableElements.indexOf(siblings[i] as HTMLElement) > -1) { - index++; - } - } - - return -1; - } - /** * Figures out the coordinates at which an element was picked up. * @param referenceElement Element that initiated the dragging. @@ -436,7 +477,7 @@ export class CdkDrag implements AfterContentInit, OnDestroy { // we need to trigger a style recalculation in order for the `cdk-drag-animating` class to // apply its style, we take advantage of the available info to figure out whether we need to // bind the event in the first place. - const duration = this._getTransitionDurationInMs(this._preview); + const duration = getTransitionDurationInMs(this._preview); if (duration === 0) { return Promise.resolve(); @@ -481,16 +522,6 @@ export class CdkDrag implements AfterContentInit, OnDestroy { } } - /** Removes the global event listeners that were bound by this draggable. */ - private _removeDocumentEvents() { - this._document.removeEventListener('mousemove', this._pointerMove, - activeEventOptions as any); - this._document.removeEventListener('touchmove', this._pointerMove, - activeEventOptions as any); - this._document.removeEventListener('mouseup', this._pointerUp); - this._document.removeEventListener('touchend', this._pointerUp); - } - /** Determines the point of the page that was touched by the user. */ private _getPointerPositionOnPage(event: MouseEvent | TouchEvent): Point { const point = this._isTouchEvent(event) ? event.touches[0] : event; @@ -501,11 +532,18 @@ export class CdkDrag implements AfterContentInit, OnDestroy { }; } - /** Listener used to prevent `touchmove` events while the element is being dragged. */ - private _preventScrollListener = (event: TouchEvent) => { - if (this._isDragging) { - event.preventDefault(); + /** Gets the pointer position on the page, accounting for any position constraints. */ + private _getConstrainedPointerPosition(event: MouseEvent | TouchEvent): Point { + const point = this._getPointerPositionOnPage(event); + const dropContainerLock = this.dropContainer ? this.dropContainer.lockAxis : null; + + if (this.lockAxis === 'x' || dropContainerLock === 'x') { + point.y = this._pickupPositionOnPage.y; + } else if (this.lockAxis === 'y' || dropContainerLock === 'y') { + point.x = this._pickupPositionOnPage.x; } + + return point; } /** Determines whether an event is a touch event. */ @@ -538,35 +576,25 @@ export class CdkDrag implements AfterContentInit, OnDestroy { this._placeholder = this._placeholderRef = null!; } +} - /** - * Registers global event listeners that are used for moving the element. - * @param event Event that initiated the dragging. - */ - private _registerMoveListeners(event: MouseEvent | TouchEvent) { - this._ngZone.runOutsideAngular(() => { - const isTouchEvent = this._isTouchEvent(event); - - // We explicitly bind __active__ listeners here, because newer browsers - // will default to passive ones for `mousemove` and `touchmove`. - // TODO: this should be bound in `mousemove` and after a certain threshold, - // otherwise it'll interfere with clicks on the element. - this._document.addEventListener(isTouchEvent ? 'touchmove' : 'mousemove', this._pointerMove, - activeEventOptions); - this._document.addEventListener(isTouchEvent ? 'touchend' : 'mouseup', this._pointerUp); - }); - } +/** Parses a CSS time value to milliseconds. */ +function parseCssTimeUnitsToMs(value: string): number { + // Some browsers will return it in seconds, whereas others will return milliseconds. + const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000; + return parseFloat(value) * multiplier; +} - /** Gets the `transition-duration` of an element in milliseconds. */ - private _getTransitionDurationInMs(element: HTMLElement): number { - const rawDuration = getComputedStyle(element).getPropertyValue('transition-duration'); +/** Gets the transition duration, including the delay, of an element in milliseconds. */ +function getTransitionDurationInMs(element: HTMLElement): number { + const computedStyle = getComputedStyle(element); + const rawDuration = computedStyle.getPropertyValue('transition-duration'); + const rawDelay = computedStyle.getPropertyValue('transition-delay'); - // Some browsers will return it in seconds, whereas others will return milliseconds. - const multiplier = rawDuration.toLowerCase().indexOf('ms') > -1 ? 1 : 1000; - return parseFloat(rawDuration) * multiplier; - } + return parseCssTimeUnitsToMs(rawDuration) + parseCssTimeUnitsToMs(rawDelay); } + /** Point on the page or within an element. */ interface Point { x: number; diff --git a/src/cdk-experimental/drag-drop/drop-container.ts b/src/cdk-experimental/drag-drop/drop-container.ts index ae9aaedb3ecc..4bbed64e63d6 100644 --- a/src/cdk-experimental/drag-drop/drop-container.ts +++ b/src/cdk-experimental/drag-drop/drop-container.ts @@ -9,14 +9,19 @@ import {InjectionToken, QueryList} from '@angular/core'; import {CdkDrag} from './drag'; -/** @docs-private */ export interface CdkDropContainer { /** Arbitrary data to attach to all events emitted by this container. */ data: T; + /** Unique ID for the drop zone. */ + id: string; + /** Direction in which the list is oriented. */ orientation: 'horizontal' | 'vertical'; + /** Locks the position of the draggable elements inside the container along the specified axis. */ + lockAxis: 'x' | 'y'; + /** Starts dragging an item. */ start(): void; @@ -31,8 +36,10 @@ export interface CdkDropContainer { /** * Emits an event to indicate that the user moved an item into the container. * @param item Item that was moved into the container. + * @param xOffset Position of the item along the X axis. + * @param yOffset Position of the item along the Y axis. */ - enter(item: CdkDrag): void; + enter(item: CdkDrag, xOffset: number, yOffset: number): void; /** * Removes an item from the container after it was dragged into another container by the user. @@ -47,12 +54,11 @@ export interface CdkDropContainer { getItemIndex(item: CdkDrag): number; _sortItem(item: CdkDrag, xOffset: number, yOffset: number): void; _draggables: QueryList; - _getSiblingContainerFromPosition(x: number, y: number): CdkDropContainer | null; + _getSiblingContainerFromPosition(item: CdkDrag, x: number, y: number): CdkDropContainer | null; } /** * Injection token that is used to provide a CdkDrop instance to CdkDrag. * Used for avoiding circular imports. - * @docs-private */ export const CDK_DROP_CONTAINER = new InjectionToken('CDK_DROP_CONTAINER'); diff --git a/src/cdk-experimental/drag-drop/drop.scss b/src/cdk-experimental/drag-drop/drop.scss index 897ceaea6d2b..700ff5cb61b7 100644 --- a/src/cdk-experimental/drag-drop/drop.scss +++ b/src/cdk-experimental/drag-drop/drop.scss @@ -6,3 +6,18 @@ $cdk-z-index-drag-preview: 1000; left: 0; z-index: $cdk-z-index-drag-preview; } + +.cdk-drag, +.cdk-drag-handle { + touch-action: none; + -webkit-user-drag: none; + -webkit-tap-highlight-color: transparent; + + // stylelint-disable material/no-prefixes + // normally we have a mixin for these, but it's in material/core. + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + // stylelint-enable material/no-prefixes +} diff --git a/src/cdk-experimental/drag-drop/drop.ts b/src/cdk-experimental/drag-drop/drop.ts index 9d50b832d782..613dc414c715 100644 --- a/src/cdk-experimental/drag-drop/drop.ts +++ b/src/cdk-experimental/drag-drop/drop.ts @@ -7,20 +7,26 @@ */ import { + ChangeDetectionStrategy, Component, ContentChildren, + ElementRef, + EventEmitter, forwardRef, Input, - ViewEncapsulation, - ChangeDetectionStrategy, + OnDestroy, + OnInit, Output, - EventEmitter, - ElementRef, QueryList, + ViewEncapsulation, } from '@angular/core'; import {CdkDrag} from './drag'; import {CdkDragExit, CdkDragEnter, CdkDragDrop} from './drag-events'; import {CDK_DROP_CONTAINER} from './drop-container'; +import {DragDropRegistry} from './drag-drop-registry'; + +/** Counter used to generate unique ids for drop zones. */ +let _uniqueIdCounter = 0; /** Container that wraps a set of draggable items. */ @Component({ @@ -36,54 +42,89 @@ import {CDK_DROP_CONTAINER} from './drop-container'; ], host: { 'class': 'cdk-drop', + '[id]': 'id', '[class.cdk-drop-dragging]': '_dragging' } }) -export class CdkDrop { +export class CdkDrop implements OnInit, OnDestroy { /** Draggable items in the container. */ @ContentChildren(forwardRef(() => CdkDrag)) _draggables: QueryList; /** - * Other draggable containers that this container is connected - * to and into which the container's items can be transferred. + * Other draggable containers that this container is connected to and into which the + * container's items can be transferred. Can either be references to other drop containers, + * or their unique IDs. */ - @Input() connectedTo: CdkDrop[] = []; + @Input() connectedTo: (CdkDrop | string)[] = []; - /** Arbitrary data to attach to all events emitted by this container. */ + /** Arbitrary data to attach to this container. */ @Input() data: T; /** Direction in which the list is oriented. */ @Input() orientation: 'horizontal' | 'vertical' = 'vertical'; + /** + * Unique ID for the drop zone. Can be used as a reference + * in the `connectedTo` of another `CdkDrop`. + */ + @Input() id: string = `cdk-drop-${_uniqueIdCounter++}`; + + /** Locks the position of the draggable elements inside the container along the specified axis. */ + @Input() lockAxis: 'x' | 'y'; + + /** + * Function that is used to determine whether an item + * is allowed to be moved into a drop container. + */ + @Input() enterPredicate: (drag?: CdkDrag, drop?: CdkDrop) => boolean = () => true; + /** Emits when the user drops an item inside the container. */ - @Output() dropped = new EventEmitter>(); + @Output() dropped: EventEmitter> = new EventEmitter>(); /** * Emits when the user has moved a new drag item into this container. */ - @Output() entered = new EventEmitter>(); + @Output() entered: EventEmitter> = new EventEmitter>(); /** * Emits when the user removes an item from the container * by dragging it into another container. */ - @Output() exited = new EventEmitter>(); + @Output() exited: EventEmitter> = new EventEmitter>(); - constructor(public element: ElementRef) {} + constructor( + public element: ElementRef, + private _dragDropRegistry: DragDropRegistry>) {} + + ngOnInit() { + this._dragDropRegistry.registerDropContainer(this); + } + + ngOnDestroy() { + this._dragDropRegistry.removeDropContainer(this); + } /** Whether an item in the container is being dragged. */ _dragging = false; /** Cache of the dimensions of all the items and the sibling containers. */ private _positionCache = { - items: [] as {drag: CdkDrag, clientRect: ClientRect}[], + items: [] as {drag: CdkDrag, clientRect: ClientRect, offset: number}[], siblings: [] as {drop: CdkDrop, clientRect: ClientRect}[] }; + /** + * Draggable items that are currently active inside the container. Includes the items + * from `_draggables`, as well as any items that have been dragged in, but haven't + * been dropped yet. + */ + private _activeDraggables: CdkDrag[]; + /** Starts dragging an item. */ start(): void { this._dragging = true; - this._refreshPositions(); + this._activeDraggables = this._draggables.toArray(); + this._cachePositions(); } /** @@ -93,25 +134,57 @@ export class CdkDrop { * @param previousContainer Container from which the item got dragged in. */ drop(item: CdkDrag, currentIndex: number, previousContainer: CdkDrop): void { + this._reset(); this.dropped.emit({ item, currentIndex, previousIndex: previousContainer.getItemIndex(item), container: this, - // TODO: reconsider whether to make this null if the containers are the same. + // TODO(crisbeto): reconsider whether to make this null if the containers are the same. previousContainer }); - - this._reset(); } /** * Emits an event to indicate that the user moved an item into the container. * @param item Item that was moved into the container. + * @param xOffset Position of the item along the X axis. + * @param yOffset Position of the item along the Y axis. */ - enter(item: CdkDrag): void { + enter(item: CdkDrag, xOffset: number, yOffset: number): void { this.entered.emit({item, container: this}); this.start(); + + // We use the coordinates of where the item entered the drop + // zone to figure out at which index it should be inserted. + const newIndex = this._getItemIndexFromPointerPosition(item, xOffset, yOffset); + const currentIndex = this._activeDraggables.indexOf(item); + const newPositionReference = this._activeDraggables[newIndex]; + const placeholder = item.getPlaceholderElement(); + + // Since the item may be in the `activeDraggables` already (e.g. if the user dragged it + // into another container and back again), we have to ensure that it isn't duplicated. + if (currentIndex > -1) { + this._activeDraggables.splice(currentIndex, 1); + } + + // Don't use items that are being dragged as a reference, because + // their element has been moved down to the bottom of the body. + if (newPositionReference && !this._dragDropRegistry.isDragging(newPositionReference)) { + const element = newPositionReference.element.nativeElement; + element.parentElement!.insertBefore(placeholder, element); + this._activeDraggables.splice(newIndex, 0, item); + } else { + this.element.nativeElement.appendChild(placeholder); + this._activeDraggables.push(item); + } + + // The transform needs to be cleared so it doesn't throw off the measurements. + placeholder.style.transform = ''; + + // Note that the positions were already cached when we called `start` above, + // but we need to refresh them since the amount of items has changed. + this._cachePositions(); } /** @@ -128,7 +201,9 @@ export class CdkDrop { * @param item Item whose index should be determined. */ getItemIndex(item: CdkDrag): number { - return this._draggables.toArray().indexOf(item); + return this._dragging ? + this._positionCache.items.findIndex(currentItem => currentItem.drag === item) : + this._draggables.toArray().indexOf(item); } /** @@ -139,64 +214,143 @@ export class CdkDrop { */ _sortItem(item: CdkDrag, xOffset: number, yOffset: number): void { const siblings = this._positionCache.items; - const newPosition = siblings.find(({drag, clientRect}) => { - if (drag === item) { - return false; - } - - return this.orientation === 'horizontal' ? - xOffset > clientRect.left && xOffset < clientRect.right : - yOffset > clientRect.top && yOffset < clientRect.bottom; - }); + const isHorizontal = this.orientation === 'horizontal'; + const newIndex = this._getItemIndexFromPointerPosition(item, xOffset, yOffset); + const placeholder = item.getPlaceholderElement(); - if (!newPosition && siblings.length > 0) { + if (newIndex === -1 && siblings.length > 0) { return; } - const element = newPosition ? newPosition.drag.element.nativeElement : null; - const next = element ? element!.nextSibling : null; - const parent = element ? element.parentElement! : this.element.nativeElement; - const placeholder = item.getPlaceholderElement(); + const currentIndex = siblings.findIndex(currentItem => currentItem.drag === item); + const currentPosition = siblings[currentIndex]; + const newPosition = siblings[newIndex]; - if (next) { - parent.insertBefore(placeholder, next === placeholder ? element : next); - } else { - parent.appendChild(placeholder); - } + // Figure out the offset necessary for the items to be swapped. + const offset = isHorizontal ? + currentPosition.clientRect.left - newPosition.clientRect.left : + currentPosition.clientRect.top - newPosition.clientRect.top; + const topAdjustment = isHorizontal ? 0 : offset; + const leftAdjustment = isHorizontal ? offset : 0; + + // Since we've moved the items with a `transform`, we need to adjust their cached + // client rects to reflect their new position, as well as swap their positions in the cache. + // Note that we shouldn't use `getBoundingClientRect` here to update the cache, because the + // elements may be mid-animation which will give us a wrong result. + this._adjustClientRect(currentPosition.clientRect, -topAdjustment, -leftAdjustment); + currentPosition.offset -= offset; + siblings[currentIndex] = newPosition; + + this._adjustClientRect(newPosition.clientRect, topAdjustment, leftAdjustment); + newPosition.offset += offset; + siblings[newIndex] = currentPosition; + + // Swap the placeholder's position with the one of the target draggable. + placeholder.style.transform = isHorizontal ? + `translate3d(${currentPosition.offset}px, 0, 0)` : + `translate3d(0, ${currentPosition.offset}px, 0)`; - this._refreshPositions(); + newPosition.drag.element.nativeElement.style.transform = isHorizontal ? + `translate3d(${newPosition.offset}px, 0, 0)` : + `translate3d(0, ${newPosition.offset}px, 0)`; } /** * Figures out whether an item should be moved into a sibling * drop container, based on its current position. + * @param item Drag item that is being moved. * @param x Position of the item along the X axis. * @param y Position of the item along the Y axis. */ - _getSiblingContainerFromPosition(x: number, y: number): CdkDrop | null { + _getSiblingContainerFromPosition(item: CdkDrag, x: number, y: number): CdkDrop | null { const result = this._positionCache.siblings.find(({clientRect}) => { const {top, bottom, left, right} = clientRect; return y >= top && y <= bottom && x >= left && x <= right; }); - return result ? result.drop : null; + return result && result.drop.enterPredicate(item, this) ? result.drop : null; } /** Refreshes the position cache of the items and sibling containers. */ - private _refreshPositions() { - this._positionCache.items = this._draggables - .map(drag => ({drag, clientRect: drag.element.nativeElement.getBoundingClientRect()})) + private _cachePositions() { + this._positionCache.items = this._activeDraggables + .map(drag => { + const elementToMeasure = this._dragDropRegistry.isDragging(drag) ? + // If the element is being dragged, we have to measure the + // placeholder, because the element is hidden. + drag.getPlaceholderElement() : + drag.element.nativeElement; + const clientRect = elementToMeasure.getBoundingClientRect(); + + return { + drag, + offset: 0, + // We need to clone the `clientRect` here, because all the values on it are readonly + // and we need to be able to update them. Also we can't use a spread here, because + // the values on a `ClientRect` aren't own properties. See: + // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#Notes + clientRect: { + top: clientRect.top, + right: clientRect.right, + bottom: clientRect.bottom, + left: clientRect.left, + width: clientRect.width, + height: clientRect.height + } + }; + }) .sort((a, b) => a.clientRect.top - b.clientRect.top); - // TODO: add filter here that ensures that the current container isn't being passed to itself. this._positionCache.siblings = this.connectedTo + .map(drop => typeof drop === 'string' ? this._dragDropRegistry.getDropContainer(drop)! : drop) + .filter(drop => drop && drop !== this) .map(drop => ({drop, clientRect: drop.element.nativeElement.getBoundingClientRect()})); } /** Resets the container to its initial state. */ private _reset() { this._dragging = false; + + // TODO(crisbeto): may have to wait for the animations to finish. + this._activeDraggables.forEach(item => item.element.nativeElement.style.transform = ''); + this._activeDraggables = []; this._positionCache.items = []; this._positionCache.siblings = []; } + + /** + * Updates the top/left positions of a `ClientRect`, as well as their bottom/right counterparts. + * @param clientRect `ClientRect` that should be updated. + * @param top New value for the `top` position. + * @param left New value for the `left` position. + */ + private _adjustClientRect(clientRect: ClientRect, top: number, left: number) { + clientRect.top += top; + clientRect.bottom = clientRect.top + clientRect.height; + + clientRect.left += left; + clientRect.right = clientRect.left + clientRect.width; + } + + /** + * Gets the index of an item in the drop container, based on the position of the user's pointer. + * @param item Item that is being sorted. + * @param xOffset Position of the user's pointer along the X axis. + * @param yOffset Position of the user's pointer along the Y axis. + */ + private _getItemIndexFromPointerPosition(item: CdkDrag, xOffset: number, yOffset: number) { + return this._positionCache.items.findIndex(({drag, clientRect}, _, array) => { + if (drag === item) { + // If there's only one item left in the container, it must be + // the dragged item itself so we use it as a reference. + return array.length < 2; + } + + return this.orientation === 'horizontal' ? + // Round these down since most browsers report client rects with + // sub-pixel precision, whereas the mouse coordinates are rounded to pixels. + xOffset >= Math.floor(clientRect.left) && xOffset <= Math.floor(clientRect.right) : + yOffset >= Math.floor(clientRect.top) && yOffset <= Math.floor(clientRect.bottom); + }); + } } diff --git a/src/cdk-experimental/drag-drop/public-api.ts b/src/cdk-experimental/drag-drop/public-api.ts index d5389296c30a..d0c8a3035c71 100644 --- a/src/cdk-experimental/drag-drop/public-api.ts +++ b/src/cdk-experimental/drag-drop/public-api.ts @@ -7,6 +7,7 @@ */ export * from './drop'; +export * from './drop-container'; export * from './drag'; export * from './drag-handle'; export * from './drag-events'; @@ -14,3 +15,4 @@ export * from './drag-utils'; export * from './drag-preview'; export * from './drag-placeholder'; export * from './drag-drop-module'; +export * from './drag-drop-registry'; diff --git a/src/cdk-experimental/scrolling/BUILD.bazel b/src/cdk-experimental/scrolling/BUILD.bazel index 9fdbbb7b5752..054f9f5aae51 100644 --- a/src/cdk-experimental/scrolling/BUILD.bazel +++ b/src/cdk-experimental/scrolling/BUILD.bazel @@ -12,6 +12,7 @@ ng_module( deps = [ "//src/cdk/coercion", "//src/cdk/collections", + "//src/cdk/platform", "@rxjs", ], tsconfig = "//src/cdk-experimental:tsconfig-build.json", diff --git a/src/cdk-experimental/scrolling/auto-size-virtual-scroll.ts b/src/cdk-experimental/scrolling/auto-size-virtual-scroll.ts index f93d79427750..b42c8062dae5 100644 --- a/src/cdk-experimental/scrolling/auto-size-virtual-scroll.ts +++ b/src/cdk-experimental/scrolling/auto-size-virtual-scroll.ts @@ -9,6 +9,7 @@ import {coerceNumberProperty} from '@angular/cdk/coercion'; import {ListRange} from '@angular/cdk/collections'; import {Directive, forwardRef, Input, OnChanges} from '@angular/core'; +import {Observable} from 'rxjs'; import {VIRTUAL_SCROLL_STRATEGY, VirtualScrollStrategy} from './virtual-scroll-strategy'; import {CdkVirtualScrollViewport} from './virtual-scroll-viewport'; @@ -65,6 +66,13 @@ export class ItemSizeAverager { /** Virtual scrolling strategy for lists with items of unknown or dynamic size. */ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy { + /** @docs-private Implemented as part of VirtualScrollStrategy. */ + scrolledIndexChange = Observable.create(() => { + // TODO(mmalerba): Implement. + throw Error('cdk-virtual-scroll: scrolledIndexChange is currently not supported for the' + + ' autosize scroll strategy'); + }); + /** The attached viewport. */ private _viewport: CdkVirtualScrollViewport | null = null; @@ -151,6 +159,13 @@ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy { } } + /** Scroll to the offset for the given index. */ + scrollToIndex(): void { + // TODO(mmalerba): Implement. + throw Error('cdk-virtual-scroll: scrollToIndex is currently not supported for the autosize' + + ' scroll strategy'); + } + /** * Update the buffer parameters. * @param minBufferPx The minimum amount of buffer rendered beyond the viewport (in pixels). diff --git a/src/cdk-experimental/scrolling/fixed-size-virtual-scroll.ts b/src/cdk-experimental/scrolling/fixed-size-virtual-scroll.ts index 06e5d2ea376f..ba9d058b06bc 100644 --- a/src/cdk-experimental/scrolling/fixed-size-virtual-scroll.ts +++ b/src/cdk-experimental/scrolling/fixed-size-virtual-scroll.ts @@ -9,12 +9,19 @@ import {coerceNumberProperty} from '@angular/cdk/coercion'; import {ListRange} from '@angular/cdk/collections'; import {Directive, forwardRef, Input, OnChanges} from '@angular/core'; +import {Observable, Subject} from 'rxjs'; +import {distinctUntilChanged} from 'rxjs/operators'; import {VIRTUAL_SCROLL_STRATEGY, VirtualScrollStrategy} from './virtual-scroll-strategy'; import {CdkVirtualScrollViewport} from './virtual-scroll-viewport'; /** Virtual scrolling strategy for lists with items of known fixed size. */ export class FixedSizeVirtualScrollStrategy implements VirtualScrollStrategy { + private _scrolledIndexChange = new Subject(); + + /** @docs-private Implemented as part of VirtualScrollStrategy. */ + scrolledIndexChange: Observable = this._scrolledIndexChange.pipe(distinctUntilChanged()); + /** The attached viewport. */ private _viewport: CdkVirtualScrollViewport | null = null; @@ -45,6 +52,7 @@ export class FixedSizeVirtualScrollStrategy implements VirtualScrollStrategy { /** Detaches this scroll strategy from the currently attached viewport. */ detach() { + this._scrolledIndexChange.complete(); this._viewport = null; } @@ -77,6 +85,17 @@ export class FixedSizeVirtualScrollStrategy implements VirtualScrollStrategy { /** @docs-private Implemented as part of VirtualScrollStrategy. */ onRenderedOffsetChanged() { /* no-op */ } + /** + * Scroll to the offset for the given index. + * @param index The index of the element to scroll to. + * @param behavior The ScrollBehavior to use when scrolling. + */ + scrollToIndex(index: number, behavior: ScrollBehavior): void { + if (this._viewport) { + this._viewport.scrollToOffset(index * this._itemSize, behavior); + } + } + /** Update the viewport's total content size. */ private _updateTotalContentSize() { if (!this._viewport) { @@ -102,6 +121,8 @@ export class FixedSizeVirtualScrollStrategy implements VirtualScrollStrategy { this._bufferSize); this._viewport.setRenderedRange(range); this._viewport.setRenderedContentOffset(this._itemSize * range.start); + + this._scrolledIndexChange.next(firstVisibleIndex); } /** diff --git a/src/cdk-experimental/scrolling/virtual-for-of.ts b/src/cdk-experimental/scrolling/virtual-for-of.ts index 22c5b4ee5a0d..f5fa0dca3fe3 100644 --- a/src/cdk-experimental/scrolling/virtual-for-of.ts +++ b/src/cdk-experimental/scrolling/virtual-for-of.ts @@ -49,8 +49,13 @@ export type CdkVirtualForOfContext = { }; -/** Helper to extract size from a ClientRect. */ -function getSize(orientation: 'horizontal' | 'vertical', rect: ClientRect): number { +/** Helper to extract size from a DOM Node. */ +function getSize(orientation: 'horizontal' | 'vertical', node: Node): number { + const el = node as Element; + if (!el.getBoundingClientRect) { + return 0; + } + const rect = el.getBoundingClientRect(); return orientation == 'horizontal' ? rect.width : rect.height; } @@ -193,7 +198,6 @@ export class CdkVirtualForOf implements CollectionViewer, DoCheck, OnDestroy const rangeLen = range.end - range.start; // Loop over all root nodes for all items in the range and sum up their size. - // TODO(mmalerba): Make this work with non-element nodes. let totalSize = 0; let i = rangeLen; while (i--) { @@ -201,7 +205,7 @@ export class CdkVirtualForOf implements CollectionViewer, DoCheck, OnDestroy EmbeddedViewRef> | null; let j = view ? view.rootNodes.length : 0; while (j--) { - totalSize += getSize(orientation, (view!.rootNodes[j] as Element).getBoundingClientRect()); + totalSize += getSize(orientation, view!.rootNodes[j]); } } diff --git a/src/cdk-experimental/scrolling/virtual-scroll-strategy.ts b/src/cdk-experimental/scrolling/virtual-scroll-strategy.ts index cbb667201709..f5bee1630c76 100644 --- a/src/cdk-experimental/scrolling/virtual-scroll-strategy.ts +++ b/src/cdk-experimental/scrolling/virtual-scroll-strategy.ts @@ -6,8 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {CdkVirtualScrollViewport} from './virtual-scroll-viewport'; import {InjectionToken} from '@angular/core'; +import {Observable} from 'rxjs'; +import {CdkVirtualScrollViewport} from './virtual-scroll-viewport'; /** The injection token used to specify the virtual scrolling strategy. */ @@ -17,6 +18,9 @@ export const VIRTUAL_SCROLL_STRATEGY = /** A strategy that dictates which items should be rendered in the viewport. */ export interface VirtualScrollStrategy { + /** Emits when the index of the first element visible in the viewport changes. */ + scrolledIndexChange: Observable; + /** * Attaches this scroll strategy to a viewport. * @param viewport The viewport to attach this strategy to. @@ -37,4 +41,11 @@ export interface VirtualScrollStrategy { /** Called when the offset of the rendered items changed. */ onRenderedOffsetChanged(); + + /** + * Scroll to the offset for the given index. + * @param index The index of the element to scroll to. + * @param behavior The ScrollBehavior to use when scrolling. + */ + scrollToIndex(index: number, behavior: ScrollBehavior): void; } diff --git a/src/cdk-experimental/scrolling/virtual-scroll-viewport.html b/src/cdk-experimental/scrolling/virtual-scroll-viewport.html index 5fc18943645a..e545f0ff4dd7 100644 --- a/src/cdk-experimental/scrolling/virtual-scroll-viewport.html +++ b/src/cdk-experimental/scrolling/virtual-scroll-viewport.html @@ -2,8 +2,7 @@ Wrap the rendered content in an element that will be used to offset it based on the scroll position. --> -
+
+ +## Styling utilities +The CDK `a11y` package comes with a set of CSS styles that can be used when building accessible +components. To take advantage of them, you have to include the styles in your global stylesheet. +If you're using Material together with the CDK, these styles have been included for you already. + +```scss +@import '~@angular/cdk/text-field/text-field'; + +@include cdk-a11y(); +``` + +### Hiding elements, while keeping them available for screen readers +By default, screen readers and other assistive technology will skip elements that have +`display: none`, `visibility: hidden` etc. In some cases you may need to visually hide an element, +while keeping it available for assistive technology. You can do so using the `cdk-visually-hidden` +class: + +```html +
+ +
+``` + +### Targeting high contrast users +The `a11y` package offers a mixin that allows you to target users that have the Windows high +contrast mode turned on, via a media query. To target high contrast users, you can wrap your +styles with the `cdk-high-contrast` mixin: + +```scss +button { + @include cdk-high-contrast { + outline: solid 1px; + } +} +``` diff --git a/src/cdk/a11y/aria-describer/aria-describer.spec.ts b/src/cdk/a11y/aria-describer/aria-describer.spec.ts index 2a098fedfea3..aa3b932552d0 100644 --- a/src/cdk/a11y/aria-describer/aria-describer.spec.ts +++ b/src/cdk/a11y/aria-describer/aria-describer.spec.ts @@ -181,16 +181,16 @@ function expectMessage(el: Element, message: string) { `, }) class TestApp { - @ViewChild('element1') _element1: ElementRef; + @ViewChild('element1') _element1: ElementRef; get element1(): Element { return this._element1.nativeElement; } - @ViewChild('element2') _element2: ElementRef; + @ViewChild('element2') _element2: ElementRef; get element2(): Element { return this._element2.nativeElement; } - @ViewChild('element3') _element3: ElementRef; + @ViewChild('element3') _element3: ElementRef; get element3(): Element { return this._element3.nativeElement; } - @ViewChild('element4') _element4: ElementRef; + @ViewChild('element4') _element4: ElementRef; get element4(): Element { return this._element4.nativeElement; } diff --git a/src/cdk/a11y/aria-describer/aria-describer.ts b/src/cdk/a11y/aria-describer/aria-describer.ts index a63e15f397a4..40664b1929db 100644 --- a/src/cdk/a11y/aria-describer/aria-describer.ts +++ b/src/cdk/a11y/aria-describer/aria-describer.ts @@ -225,12 +225,12 @@ export class AriaDescriber implements OnDestroy { } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function ARIA_DESCRIBER_PROVIDER_FACTORY(parentDispatcher: AriaDescriber, _document: any) { return parentDispatcher || new AriaDescriber(_document); } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export const ARIA_DESCRIBER_PROVIDER = { // If there is already an AriaDescriber available, use that. Otherwise, provide a new one. provide: AriaDescriber, diff --git a/src/cdk/a11y/focus-monitor/focus-monitor.ts b/src/cdk/a11y/focus-monitor/focus-monitor.ts index 67b59c14a52d..926999a4d1a9 100644 --- a/src/cdk/a11y/focus-monitor/focus-monitor.ts +++ b/src/cdk/a11y/focus-monitor/focus-monitor.ts @@ -149,13 +149,28 @@ export class FocusMonitor implements OnDestroy { * @param origin Focus origin. * @param options Options that can be used to configure the focus behavior. */ - focusVia(element: HTMLElement, origin: FocusOrigin, options?: FocusOptions): void { + focusVia(element: HTMLElement, origin: FocusOrigin, options?: FocusOptions): void; + + /** + * Focuses the element via the specified focus origin. + * @param element Element to focus. + * @param origin Focus origin. + * @param options Options that can be used to configure the focus behavior. + */ + focusVia(element: ElementRef, origin: FocusOrigin, options?: FocusOptions): void; + + focusVia(element: HTMLElement | ElementRef, + origin: FocusOrigin, + options?: FocusOptions): void { + + const nativeElement = this._getNativeElement(element); + this._setOriginForCurrentEventQueue(origin); // `focus` isn't available on the server - if (typeof element.focus === 'function') { + if (typeof nativeElement.focus === 'function') { // Cast the element to `any`, because the TS typings don't have the `options` parameter yet. - (element as any).focus(options); + (nativeElement as any).focus(options); } } @@ -370,6 +385,10 @@ export class FocusMonitor implements OnDestroy { this._unregisterGlobalListeners = () => {}; } } + + private _getNativeElement(element: HTMLElement | ElementRef): HTMLElement { + return element instanceof ElementRef ? element.nativeElement : element; + } } @@ -389,7 +408,7 @@ export class CdkMonitorFocus implements OnDestroy { private _monitorSubscription: Subscription; @Output() cdkFocusChange = new EventEmitter(); - constructor(private _elementRef: ElementRef, private _focusMonitor: FocusMonitor) { + constructor(private _elementRef: ElementRef, private _focusMonitor: FocusMonitor) { this._monitorSubscription = this._focusMonitor.monitor( this._elementRef.nativeElement, this._elementRef.nativeElement.hasAttribute('cdkMonitorSubtreeFocus')) @@ -402,13 +421,13 @@ export class CdkMonitorFocus implements OnDestroy { } } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function FOCUS_MONITOR_PROVIDER_FACTORY( parentDispatcher: FocusMonitor, ngZone: NgZone, platform: Platform) { return parentDispatcher || new FocusMonitor(ngZone, platform); } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export const FOCUS_MONITOR_PROVIDER = { // If there is already a FocusMonitor available, use that. Otherwise, provide a new one. provide: FocusMonitor, diff --git a/src/cdk/a11y/focus-trap/focus-trap.ts b/src/cdk/a11y/focus-trap/focus-trap.ts index 9e406e5fd6b3..4549dd478059 100644 --- a/src/cdk/a11y/focus-trap/focus-trap.ts +++ b/src/cdk/a11y/focus-trap/focus-trap.ts @@ -152,7 +152,7 @@ export class FocusTrap { `[cdk-focus-${bound}]`) as NodeListOf; for (let i = 0; i < markers.length; i++) { - // @deletion-target 7.0.0 + // @breaking-change 7.0.0 if (markers[i].hasAttribute(`cdk-focus-${bound}`)) { console.warn(`Found use of deprecated attribute 'cdk-focus-${bound}', ` + `use 'cdkFocusRegion${bound}' instead. The deprecated ` + @@ -181,7 +181,7 @@ export class FocusTrap { `[cdkFocusInitial]`) as HTMLElement; if (redirectToElement) { - // @deletion-target 7.0.0 + // @breaking-change 7.0.0 if (redirectToElement.hasAttribute(`cdk-focus-initial`)) { console.warn(`Found use of deprecated attribute 'cdk-focus-initial', ` + `use 'cdkFocusInitial' instead. The deprecated attribute ` + @@ -350,7 +350,7 @@ export class CdkTrapFocus implements OnDestroy, AfterContentInit, DoCheck { private _autoCapture: boolean; constructor( - private _elementRef: ElementRef, + private _elementRef: ElementRef, private _focusTrapFactory: FocusTrapFactory, @Inject(DOCUMENT) _document: any) { diff --git a/src/cdk/a11y/key-manager/list-key-manager.ts b/src/cdk/a11y/key-manager/list-key-manager.ts index fe653843579a..c3478ad82355 100644 --- a/src/cdk/a11y/key-manager/list-key-manager.ts +++ b/src/cdk/a11y/key-manager/list-key-manager.ts @@ -305,7 +305,7 @@ export class ListKeyManager { * Allows setting of the activeItemIndex without any other effects. * @param index The new activeItemIndex. * @deprecated Use `updateActiveItem` instead. - * @deletion-target 7.0.0 + * @breaking-change 7.0.0 */ updateActiveItemIndex(index: number): void { this.updateActiveItem(index); diff --git a/src/cdk/a11y/live-announcer/live-announcer.spec.ts b/src/cdk/a11y/live-announcer/live-announcer.spec.ts index 5de2ea9ae33c..7a37b21d4340 100644 --- a/src/cdk/a11y/live-announcer/live-announcer.spec.ts +++ b/src/cdk/a11y/live-announcer/live-announcer.spec.ts @@ -69,7 +69,7 @@ describe('LiveAnnouncer', () => { // Call the lifecycle hook manually since Angular won't do it in tests. announcer.ngOnDestroy(); - expect(document.body.querySelector('[aria-live]')) + expect(document.body.querySelector('.cdk-live-announcer-element')) .toBeFalsy('Expected that the aria-live element was remove from the DOM.'); })); @@ -81,6 +81,33 @@ describe('LiveAnnouncer', () => { tick(100); expect(spy).toHaveBeenCalled(); })); + + it('should ensure that there is only one live element at a time', fakeAsync(() => { + announcer.ngOnDestroy(); + fixture.destroy(); + + TestBed.resetTestingModule().configureTestingModule({ + imports: [A11yModule], + declarations: [TestApp], + }); + + const extraElement = document.createElement('div'); + extraElement.classList.add('cdk-live-announcer-element'); + document.body.appendChild(extraElement); + + inject([LiveAnnouncer], (la: LiveAnnouncer) => { + announcer = la; + ariaLiveElement = getLiveElement(); + fixture = TestBed.createComponent(TestApp); + })(); + + announcer.announce('Hey Google'); + tick(100); + + expect(document.body.querySelectorAll('.cdk-live-announcer-element').length) + .toBe(1, 'Expected only one live announcer element in the DOM.'); + })); + }); describe('with a custom element', () => { @@ -184,7 +211,7 @@ describe('CdkAriaLive', () => { function getLiveElement(): Element { - return document.body.querySelector('[aria-live]')!; + return document.body.querySelector('.cdk-live-announcer-element')!; } @Component({template: ``}) diff --git a/src/cdk/a11y/live-announcer/live-announcer.ts b/src/cdk/a11y/live-announcer/live-announcer.ts index 67748555c46d..4299273819ff 100644 --- a/src/cdk/a11y/live-announcer/live-announcer.ts +++ b/src/cdk/a11y/live-announcer/live-announcer.ts @@ -29,15 +29,17 @@ export type AriaLivePoliteness = 'off' | 'polite' | 'assertive'; @Injectable({providedIn: 'root'}) export class LiveAnnouncer implements OnDestroy { - private readonly _liveElement: Element; + private readonly _liveElement: HTMLElement; + private _document: Document; constructor( @Optional() @Inject(LIVE_ANNOUNCER_ELEMENT_TOKEN) elementToken: any, - @Inject(DOCUMENT) private _document: any) { + @Inject(DOCUMENT) _document: any) { - // We inject the live element as `any` because the constructor signature cannot reference - // browser globals (HTMLElement) on non-browser environments, since having a class decorator - // causes TypeScript to preserve the constructor signature types. + // We inject the live element and document as `any` because the constructor signature cannot + // reference browser globals (HTMLElement, Document) on non-browser environments, since having + // a class decorator causes TypeScript to preserve the constructor signature types. + this._document = _document; this._liveElement = elementToken || this._createLiveElement(); } @@ -72,10 +74,19 @@ export class LiveAnnouncer implements OnDestroy { } } - private _createLiveElement(): Element { - let liveEl = this._document.createElement('div'); + private _createLiveElement(): HTMLElement { + const elementClass = 'cdk-live-announcer-element'; + const previousElements = this._document.getElementsByClassName(elementClass); + // Remove any old containers. This can happen when coming in from a server-side-rendered page. + for (let i = 0; i < previousElements.length; i++) { + previousElements[i].parentNode!.removeChild(previousElements[i]); + } + + const liveEl = this._document.createElement('div'); + liveEl.classList.add(elementClass); liveEl.classList.add('cdk-visually-hidden'); + liveEl.setAttribute('aria-atomic', 'true'); liveEl.setAttribute('aria-live', 'polite'); @@ -106,13 +117,16 @@ export class CdkAriaLive implements OnDestroy { this._subscription.unsubscribe(); this._subscription = null; } - } else { - if (!this._subscription) { - this._subscription = this._ngZone.runOutsideAngular( - () => this._contentObserver.observe(this._elementRef.nativeElement).subscribe( - () => this._liveAnnouncer.announce( - this._elementRef.nativeElement.innerText, this._politeness))); - } + } else if (!this._subscription) { + this._subscription = this._ngZone.runOutsideAngular(() => { + return this._contentObserver + .observe(this._elementRef) + .subscribe(() => { + // Note that we use textContent here, rather than innerText, in order to avoid a reflow. + const element = this._elementRef.nativeElement; + this._liveAnnouncer.announce(element.textContent, this._politeness); + }); + }); } } private _politeness: AriaLivePoliteness = 'off'; @@ -130,14 +144,14 @@ export class CdkAriaLive implements OnDestroy { } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function LIVE_ANNOUNCER_PROVIDER_FACTORY( parentDispatcher: LiveAnnouncer, liveElement: any, _document: any) { return parentDispatcher || new LiveAnnouncer(liveElement, _document); } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export const LIVE_ANNOUNCER_PROVIDER: Provider = { // If there is already a LiveAnnouncer available, use that. Otherwise, provide a new one. provide: LiveAnnouncer, diff --git a/src/cdk/accordion/accordion.ts b/src/cdk/accordion/accordion.ts index cb35f01536a3..e3edebbabbda 100644 --- a/src/cdk/accordion/accordion.ts +++ b/src/cdk/accordion/accordion.ts @@ -6,8 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {Directive, Input} from '@angular/core'; import {coerceBooleanProperty} from '@angular/cdk/coercion'; +import {Directive, Input, OnChanges, OnDestroy, SimpleChanges} from '@angular/core'; import {Subject} from 'rxjs'; /** Used to generate unique ID for each accordion. */ @@ -20,7 +20,10 @@ let nextId = 0; selector: 'cdk-accordion, [cdkAccordion]', exportAs: 'cdkAccordion', }) -export class CdkAccordion { +export class CdkAccordion implements OnDestroy, OnChanges { + /** Emits when the state of the accordion changes */ + readonly _stateChanges = new Subject(); + /** Stream that emits true/false when openAll/closeAll is triggered. */ readonly _openCloseAllActions: Subject = new Subject(); @@ -43,6 +46,14 @@ export class CdkAccordion { this._openCloseAll(false); } + ngOnChanges(changes: SimpleChanges) { + this._stateChanges.next(changes); + } + + ngOnDestroy() { + this._stateChanges.complete(); + } + private _openCloseAll(expanded: boolean): void { if (this.multi) { this._openCloseAllActions.next(expanded); diff --git a/src/cdk/bidi/dir.ts b/src/cdk/bidi/dir.ts index f5fe1230a839..dbf246361376 100644 --- a/src/cdk/bidi/dir.ts +++ b/src/cdk/bidi/dir.ts @@ -41,9 +41,9 @@ export class Dir implements Directionality, AfterContentInit, OnDestroy { /** @docs-private */ @Input() get dir(): Direction { return this._dir; } - set dir(v: Direction) { + set dir(value: Direction) { const old = this._dir; - this._dir = v; + this._dir = (value === 'ltr' || value === 'rtl') ? value : 'ltr'; if (old !== this._dir && this._isInitialized) { this.change.emit(this._dir); } diff --git a/src/cdk/bidi/directionality.spec.ts b/src/cdk/bidi/directionality.spec.ts index 7451d3247ba9..89414a81859b 100644 --- a/src/cdk/bidi/directionality.spec.ts +++ b/src/cdk/bidi/directionality.spec.ts @@ -1,7 +1,7 @@ import {async, fakeAsync, TestBed} from '@angular/core/testing'; -import {Component} from '@angular/core'; +import {Component, ViewChild} from '@angular/core'; import {By} from '@angular/platform-browser'; -import {BidiModule, Directionality, Direction, DIR_DOCUMENT} from './index'; +import {BidiModule, Directionality, Dir, Direction, DIR_DOCUMENT} from './index'; describe('Directionality', () => { let fakeDocument: FakeDocument; @@ -55,6 +55,15 @@ describe('Directionality', () => { subscription.unsubscribe(); }); + it('should default to ltr if an invalid direction is set on the body', () => { + fakeDocument.body.dir = 'not-valid'; + + const fixture = TestBed.createComponent(InjectsDirectionality); + const testComponent = fixture.debugElement.componentInstance; + + expect(testComponent.dir.value).toBe('ltr'); + }); + }); describe('Dir directive', () => { @@ -103,6 +112,17 @@ describe('Directionality', () => { subscription.unsubscribe(); })); + it('should default to ltr if an invalid value is passed in', () => { + const fixture = TestBed.createComponent(ElementWithDir); + + fixture.detectChanges(); + expect(fixture.componentInstance.dir.value).toBe('rtl'); + + fixture.componentInstance.direction = 'not-valid'; + fixture.detectChanges(); + expect(fixture.componentInstance.dir.value).toBe('ltr'); + }); + }); }); @@ -115,6 +135,7 @@ describe('Directionality', () => { ` }) class ElementWithDir { + @ViewChild(Dir) dir: Dir; direction = 'rtl'; changeCount = 0; } diff --git a/src/cdk/bidi/directionality.ts b/src/cdk/bidi/directionality.ts index 88a5c068d9eb..1c95de0109f8 100644 --- a/src/cdk/bidi/directionality.ts +++ b/src/cdk/bidi/directionality.ts @@ -33,7 +33,8 @@ export class Directionality implements OnDestroy { // but getComputedStyle return either "ltr" or "rtl". avoiding getComputedStyle for now const bodyDir = _document.body ? _document.body.dir : null; const htmlDir = _document.documentElement ? _document.documentElement.dir : null; - this.value = (bodyDir || htmlDir || 'ltr') as Direction; + const value = bodyDir || htmlDir; + this.value = (value === 'ltr' || value === 'rtl') ? value : 'ltr'; } } diff --git a/src/cdk/collections/collections.md b/src/cdk/collections/collections.md index 1306b8f8df89..ac299cc63334 100644 --- a/src/cdk/collections/collections.md +++ b/src/cdk/collections/collections.md @@ -1,3 +1,34 @@ -### Collections +The `collections` package provides a set of utilities for managing collections. -A set of utilities for managing collections. \ No newline at end of file +### `SelectionModel` +`SelectionModel` is a utility for powering selection of one or more options from a list. +This model is used in components such as the selection list, table selections and chip lists. + +#### Basic Usage +```javascript +const model = new SelectionModel( + true, // multiple selection or not + [2,1,3] // initial selected values +); + +// select a value +model.select(4); +console.log(model.selected.length) //-> 4 + +// deselect a value +model.deselect(4); +console.log(model.selected.length) //-> 3 + +// toggle a value +model.toggle(4); +console.log(model.selected.length) //-> 4 + +// check for selection +console.log(model.isSelected(4)) //-> true + +// sort the selections +console.log(model.sort()) //-> [1,2,3,4] + +// listen for changes +model.changes.subscribe(s => console.log(s)); +``` diff --git a/src/cdk/collections/selection.spec.ts b/src/cdk/collections/selection.spec.ts index 67b4e9806e6a..3f285f4d0d2f 100644 --- a/src/cdk/collections/selection.spec.ts +++ b/src/cdk/collections/selection.spec.ts @@ -43,7 +43,7 @@ describe('SelectionModel', () => { it('should be able to select multiple options', () => { const onChangeSpy = jasmine.createSpy('onChange spy'); - model.onChange!.subscribe(onChangeSpy); + model.changed!.subscribe(onChangeSpy); model.select(1); model.select(2); @@ -56,7 +56,7 @@ describe('SelectionModel', () => { it('should be able to select multiple options at the same time', () => { const onChangeSpy = jasmine.createSpy('onChange spy'); - model.onChange!.subscribe(onChangeSpy); + model.changed!.subscribe(onChangeSpy); model.select(1, 2); expect(model.selected.length).toBe(2); @@ -112,7 +112,7 @@ describe('SelectionModel', () => { model.select(1); - model.onChange!.subscribe(spy); + model.changed!.subscribe(spy); model.select(2); @@ -144,7 +144,7 @@ describe('SelectionModel', () => { model = new SelectionModel(true); spy = jasmine.createSpy('SelectionModel change event'); - model.onChange!.subscribe(spy); + model.changed!.subscribe(spy); }); it('should emit an event when a value is selected', () => { @@ -167,7 +167,7 @@ describe('SelectionModel', () => { it('should not emit an event when preselecting values', () => { model = new SelectionModel(false, [1]); spy = jasmine.createSpy('SelectionModel initial change event'); - model.onChange!.subscribe(spy); + model.changed!.subscribe(spy); expect(spy).not.toHaveBeenCalled(); }); @@ -181,7 +181,7 @@ describe('SelectionModel', () => { model = new SelectionModel(true, [1, 2, 3]); spy = jasmine.createSpy('SelectionModel change event'); - model.onChange!.subscribe(spy); + model.changed!.subscribe(spy); }); it('should emit an event when a value is deselected', () => { @@ -218,7 +218,7 @@ describe('SelectionModel', () => { }); it('should not have an onChange stream if change events are disabled', () => { - expect(model.onChange).toBeFalsy(); + expect(model.changed).toBeFalsy(); }); it('should still update the select value', () => { diff --git a/src/cdk/collections/selection.ts b/src/cdk/collections/selection.ts index d159b2b11b90..728cd29a1126 100644 --- a/src/cdk/collections/selection.ts +++ b/src/cdk/collections/selection.ts @@ -34,7 +34,14 @@ export class SelectionModel { } /** Event emitted when the value has changed. */ - onChange: Subject> | null = this._emitChanges ? new Subject() : null; + changed: Subject> | null = this._emitChanges ? new Subject() : null; + + /** + * Event emitted when the value has changed. + * @deprecated Use `changed` instead. + * @breaking-change 8.0.0 To be changed to `changed` + */ + onChange: Subject> | null = this.changed; constructor( private _multiple = false, @@ -129,8 +136,8 @@ export class SelectionModel { this._selected = null; if (this._selectedToEmit.length || this._deselectedToEmit.length) { - if (this.onChange) { - this.onChange.next({ + if (this.changed) { + this.changed.next({ source: this, added: this._selectedToEmit, removed: this._deselectedToEmit diff --git a/src/cdk/layout/breakpoints-observer.spec.ts b/src/cdk/layout/breakpoints-observer.spec.ts index 296d09142e00..4bb2d9ab5049 100644 --- a/src/cdk/layout/breakpoints-observer.spec.ts +++ b/src/cdk/layout/breakpoints-observer.spec.ts @@ -34,7 +34,7 @@ describe('BreakpointObserver', () => { }); it('retrieves the whether a query is currently matched', () => { - let query = 'everything starts as true in the FakeMediaMatcher'; + const query = 'everything starts as true in the FakeMediaMatcher'; expect(breakpointManager.isMatched(query)).toBeTruthy(); }); @@ -61,15 +61,15 @@ describe('BreakpointObserver', () => { }); it('accepts an array of queries', () => { - let queries = ['1 query', '2 query', 'red query', 'blue query']; + const queries = ['1 query', '2 query', 'red query', 'blue query']; breakpointManager.observe(queries); expect(mediaMatcher.queryCount).toBe(queries.length); }); it('completes all events when the breakpoint manager is destroyed', () => { - let firstTest = jasmine.createSpy('test1'); + const firstTest = jasmine.createSpy('test1'); breakpointManager.observe('test1').subscribe(undefined, undefined, firstTest); - let secondTest = jasmine.createSpy('test2'); + const secondTest = jasmine.createSpy('test2'); breakpointManager.observe('test2').subscribe(undefined, undefined, secondTest); expect(firstTest).not.toHaveBeenCalled(); @@ -82,8 +82,8 @@ describe('BreakpointObserver', () => { }); it('emits an event on the observable when values change', () => { - let query = '(width: 999px)'; - let queryMatchState: boolean = false; + const query = '(width: 999px)'; + let queryMatchState = false; breakpointManager.observe(query).subscribe((state: BreakpointState) => { queryMatchState = state.matches; }); @@ -93,14 +93,31 @@ describe('BreakpointObserver', () => { expect(queryMatchState).toBeFalsy(); }); + it('emits an event on the observable with the matching state of all queries provided', () => { + const queryOne = '(width: 999px)'; + const queryTwo = '(width: 700px)'; + let state: BreakpointState = {matches: false, breakpoints: {}}; + breakpointManager.observe([queryOne, queryTwo]).subscribe((breakpoint: BreakpointState) => { + state = breakpoint; + }); + + mediaMatcher.setMatchesQuery(queryOne, false); + mediaMatcher.setMatchesQuery(queryTwo, false); + expect(state.breakpoints).toEqual({[queryOne]: false, [queryTwo]: false}); + + mediaMatcher.setMatchesQuery(queryOne, true); + mediaMatcher.setMatchesQuery(queryTwo, false); + expect(state.breakpoints).toEqual({[queryOne]: true, [queryTwo]: false}); + }); + it('emits a true matches state when the query is matched', () => { - let query = '(width: 999px)'; + const query = '(width: 999px)'; mediaMatcher.setMatchesQuery(query, true); expect(breakpointManager.isMatched(query)).toBeTruthy(); }); it('emits a false matches state when the query is not matched', () => { - let query = '(width: 999px)'; + const query = '(width: 999px)'; mediaMatcher.setMatchesQuery(query, false); expect(breakpointManager.isMatched(query)).toBeTruthy(); }); @@ -130,7 +147,7 @@ export class FakeMediaQueryList implements MediaQueryList { @Injectable() export class FakeMediaMatcher { /** A map of match media queries. */ - private queries: Map = new Map(); + private queries = new Map(); /** The number of distinct queries created in the media matcher during a test. */ get queryCount(): number { @@ -139,7 +156,7 @@ export class FakeMediaMatcher { /** Fakes the match media response to be controlled in tests. */ matchMedia(query: string): FakeMediaQueryList { - let mql = new FakeMediaQueryList(true, query); + const mql = new FakeMediaQueryList(true, query); this.queries.set(query, mql); return mql; } diff --git a/src/cdk/layout/breakpoints-observer.ts b/src/cdk/layout/breakpoints-observer.ts index 31dee92a619e..1e476c0d63ff 100644 --- a/src/cdk/layout/breakpoints-observer.ts +++ b/src/cdk/layout/breakpoints-observer.ts @@ -16,10 +16,25 @@ import {coerceArray} from '@angular/cdk/coercion'; export interface BreakpointState { /** Whether the breakpoint is currently matching. */ matches: boolean; + /** + * A key boolean pair for each query provided to the observe method, + * with its current matched state. + */ + breakpoints: { + [key: string]: boolean; + }; +} + +/** The current state of a layout breakpoint. */ +interface InternalBreakpointState { + /** Whether the breakpoint is currently matching. */ + matches: boolean; + /** The media query being to be matched */ + query: string; } interface Query { - observable: Observable; + observable: Observable; mql: MediaQueryList; } @@ -27,9 +42,9 @@ interface Query { @Injectable({providedIn: 'root'}) export class BreakpointObserver implements OnDestroy { /** A map of all media queries currently being listened for. */ - private _queries: Map = new Map(); + private _queries = new Map(); /** A subject for all other observables to takeUntil based on. */ - private _destroySubject: Subject<{}> = new Subject(); + private _destroySubject = new Subject(); constructor(private mediaMatcher: MediaMatcher, private zone: NgZone) {} @@ -59,10 +74,16 @@ export class BreakpointObserver implements OnDestroy { const queries = splitQueries(coerceArray(value)); const observables = queries.map(query => this._registerQuery(query).observable); - return combineLatest(observables).pipe(map((breakpointStates: BreakpointState[]) => { - return { - matches: breakpointStates.some(state => state && state.matches) + return combineLatest(observables).pipe(map((breakpointStates: InternalBreakpointState[]) => { + const response: BreakpointState = { + matches: false, + breakpoints: {}, }; + breakpointStates.forEach((state: InternalBreakpointState) => { + response.matches = response.matches || state.matches; + response.breakpoints[state.query] = state.matches; + }); + return response; })); } @@ -90,11 +111,11 @@ export class BreakpointObserver implements OnDestroy { .pipe( takeUntil(this._destroySubject), startWith(mql), - map((nextMql: MediaQueryList) => ({matches: nextMql.matches})) + map((nextMql: MediaQueryList) => ({query, matches: nextMql.matches})) ); // Add the MediaQueryList to the set of queries. - const output = {observable: queryObservable, mql: mql}; + const output = {observable: queryObservable, mql}; this._queries.set(query, output); return output; } diff --git a/src/cdk/observers/observe-content.spec.ts b/src/cdk/observers/observe-content.spec.ts index 8c3077645689..ba9137f1cb76 100644 --- a/src/cdk/observers/observe-content.spec.ts +++ b/src/cdk/observers/observe-content.spec.ts @@ -2,9 +2,6 @@ import {Component, ElementRef, ViewChild} from '@angular/core'; import {async, ComponentFixture, fakeAsync, inject, TestBed, tick} from '@angular/core/testing'; import {ContentObserver, MutationObserverFactory, ObserversModule} from './observe-content'; -// TODO(elad): `ProxyZone` doesn't seem to capture the events raised by -// `MutationObserver` and needs to be investigated - describe('Observe content directive', () => { describe('basic usage', () => { beforeEach(async(() => { @@ -159,7 +156,7 @@ describe('ContentObserver injectable', () => { const fixture = TestBed.createComponent(UnobservedComponentWithTextContent); fixture.detectChanges(); - contentObserver.observe(fixture.componentInstance.contentEl.nativeElement) + contentObserver.observe(fixture.componentInstance.contentEl) .subscribe(() => spy()); expect(spy).not.toHaveBeenCalled(); @@ -177,9 +174,9 @@ describe('ContentObserver injectable', () => { const fixture = TestBed.createComponent(UnobservedComponentWithTextContent); fixture.detectChanges(); - const sub1 = contentObserver.observe(fixture.componentInstance.contentEl.nativeElement) + const sub1 = contentObserver.observe(fixture.componentInstance.contentEl) .subscribe(() => spy()); - contentObserver.observe(fixture.componentInstance.contentEl.nativeElement) + contentObserver.observe(fixture.componentInstance.contentEl) .subscribe(() => spy()); expect(mof.create).toHaveBeenCalledTimes(1); diff --git a/src/cdk/observers/observe-content.ts b/src/cdk/observers/observe-content.ts index bef0fa804ca5..baef9349ac45 100644 --- a/src/cdk/observers/observe-content.ts +++ b/src/cdk/observers/observe-content.ts @@ -54,7 +54,17 @@ export class ContentObserver implements OnDestroy { * Observe content changes on an element. * @param element The element to observe for content changes. */ - observe(element: Element): Observable { + observe(element: Element): Observable; + + /** + * Observe content changes on an element. + * @param element The element to observe for content changes. + */ + observe(element: ElementRef): Observable; + + observe(elementOrRef: Element | ElementRef): Observable { + const element = elementOrRef instanceof ElementRef ? elementOrRef.nativeElement : elementOrRef; + return Observable.create(observer => { const stream = this._observeElement(element); const subscription = stream.subscribe(observer); @@ -135,11 +145,7 @@ export class CdkObserveContent implements AfterContentInit, OnDestroy { get disabled() { return this._disabled; } set disabled(value: any) { this._disabled = coerceBooleanProperty(value); - if (this._disabled) { - this._unsubscribe(); - } else { - this._subscribe(); - } + this._disabled ? this._unsubscribe() : this._subscribe(); } private _disabled = false; @@ -154,7 +160,8 @@ export class CdkObserveContent implements AfterContentInit, OnDestroy { private _currentSubscription: Subscription | null = null; - constructor(private _contentObserver: ContentObserver, private _elementRef: ElementRef, + constructor(private _contentObserver: ContentObserver, + private _elementRef: ElementRef, private _ngZone: NgZone) {} ngAfterContentInit() { @@ -169,7 +176,7 @@ export class CdkObserveContent implements AfterContentInit, OnDestroy { private _subscribe() { this._unsubscribe(); - const stream = this._contentObserver.observe(this._elementRef.nativeElement); + const stream = this._contentObserver.observe(this._elementRef); // TODO(mmalerba): We shouldn't be emitting on this @Output() outside the zone. // Consider brining it back inside the zone next time we're making breaking changes. diff --git a/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.spec.ts b/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.spec.ts index 3f8ddd4dca8b..2381d6b53f56 100644 --- a/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.spec.ts +++ b/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.spec.ts @@ -157,6 +157,27 @@ describe('OverlayKeyboardDispatcher', () => { expect(overlayOneSpy).toHaveBeenCalled(); }); + it('should not add the same overlay to the stack multiple times', () => { + const overlayOne = overlay.create(); + const overlayTwo = overlay.create(); + const overlayOneSpy = jasmine.createSpy('overlayOne keyboard event spy'); + const overlayTwoSpy = jasmine.createSpy('overlayTwo keyboard event spy'); + + overlayOne.keydownEvents().subscribe(overlayOneSpy); + overlayTwo.keydownEvents().subscribe(overlayTwoSpy); + + keyboardDispatcher.add(overlayOne); + keyboardDispatcher.add(overlayTwo); + keyboardDispatcher.add(overlayOne); + + dispatchKeyboardEvent(document.body, 'keydown', ESCAPE); + + expect(keyboardDispatcher._attachedOverlays).toEqual([overlayTwo, overlayOne]); + + expect(overlayTwoSpy).not.toHaveBeenCalled(); + expect(overlayOneSpy).toHaveBeenCalled(); + }); + }); diff --git a/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts b/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts index a0886b218a88..48b5ad78440e 100644 --- a/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts +++ b/src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts @@ -42,6 +42,9 @@ export class OverlayKeyboardDispatcher implements OnDestroy { /** Add a new overlay to the list of attached overlay refs. */ add(overlayRef: OverlayRef): void { + // Ensure that we don't get the same overlay multiple times. + this.remove(overlayRef); + // Lazily start dispatcher once first overlay is added if (!this._isAttached) { this._document.body.addEventListener('keydown', this._keydownListener, true); @@ -93,13 +96,13 @@ export class OverlayKeyboardDispatcher implements OnDestroy { } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function OVERLAY_KEYBOARD_DISPATCHER_PROVIDER_FACTORY( dispatcher: OverlayKeyboardDispatcher, _document: any) { return dispatcher || new OverlayKeyboardDispatcher(_document); } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export const OVERLAY_KEYBOARD_DISPATCHER_PROVIDER = { // If there is already an OverlayKeyboardDispatcher available, use that. // Otherwise, provide a new one. diff --git a/src/cdk/overlay/overlay-container.ts b/src/cdk/overlay/overlay-container.ts index fa5a63ce4998..0b043bc80050 100644 --- a/src/cdk/overlay/overlay-container.ts +++ b/src/cdk/overlay/overlay-container.ts @@ -55,13 +55,13 @@ export class OverlayContainer implements OnDestroy { } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function OVERLAY_CONTAINER_PROVIDER_FACTORY(parentContainer: OverlayContainer, _document: any) { return parentContainer || new OverlayContainer(_document); } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export const OVERLAY_CONTAINER_PROVIDER = { // If there is already an OverlayContainer available, use that. Otherwise, provide a new one. provide: OverlayContainer, diff --git a/src/cdk/overlay/overlay-directives.spec.ts b/src/cdk/overlay/overlay-directives.spec.ts index 875a0a16ecc2..685052565e40 100644 --- a/src/cdk/overlay/overlay-directives.spec.ts +++ b/src/cdk/overlay/overlay-directives.spec.ts @@ -51,15 +51,11 @@ describe('Overlay directives', () => { fixture.detectChanges(); expect(overlayContainerElement.textContent).toContain('Menu content'); - expect(getPaneElement().style.pointerEvents) - .toBe('auto', 'Expected the overlay pane to enable pointerEvents when attached.'); fixture.componentInstance.isOpen = false; fixture.detectChanges(); expect(overlayContainerElement.textContent).toBe(''); - expect(getPaneElement().style.pointerEvents) - .toBe('none', 'Expected the overlay pane to disable pointerEvents when detached.'); }); it('should destroy the overlay when the directive is destroyed', () => { diff --git a/src/cdk/overlay/overlay-directives.ts b/src/cdk/overlay/overlay-directives.ts index da50ed72485c..5df1a9267c29 100644 --- a/src/cdk/overlay/overlay-directives.ts +++ b/src/cdk/overlay/overlay-directives.ts @@ -73,7 +73,7 @@ const defaultPositionList: ConnectedPosition[] = [ export const CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY = new InjectionToken<() => ScrollStrategy>('cdk-connected-overlay-scroll-strategy'); -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_FACTORY(overlay: Overlay): () => ScrollStrategy { return (config?: RepositionScrollStrategyConfig) => overlay.scrollStrategies.reposition(config); diff --git a/src/cdk/overlay/overlay-module.ts b/src/cdk/overlay/overlay-module.ts index d10c320bd797..4dcfc324e5f5 100644 --- a/src/cdk/overlay/overlay-module.ts +++ b/src/cdk/overlay/overlay-module.ts @@ -35,7 +35,7 @@ export class OverlayModule {} /** * @deprecated Use `OverlayModule` instead. - * @deletion-target 7.0.0 + * @breaking-change 7.0.0 */ export const OVERLAY_PROVIDERS: Provider[] = [ Overlay, diff --git a/src/cdk/overlay/overlay-ref.ts b/src/cdk/overlay/overlay-ref.ts index 3ff749565ed8..e0bfeceb593d 100644 --- a/src/cdk/overlay/overlay-ref.ts +++ b/src/cdk/overlay/overlay-ref.ts @@ -9,8 +9,8 @@ import {Direction, Directionality} from '@angular/cdk/bidi'; import {ComponentPortal, Portal, PortalOutlet, TemplatePortal} from '@angular/cdk/portal'; import {ComponentRef, EmbeddedViewRef, NgZone} from '@angular/core'; -import {Observable, Subject} from 'rxjs'; -import {take} from 'rxjs/operators'; +import {Observable, Subject, merge} from 'rxjs'; +import {take, takeUntil} from 'rxjs/operators'; import {OverlayKeyboardDispatcher} from './keyboard/overlay-keyboard-dispatcher'; import {OverlayConfig} from './overlay-config'; import {coerceCssPixelValue, coerceArray} from '@angular/cdk/coercion'; @@ -31,6 +31,12 @@ export class OverlayRef implements PortalOutlet, OverlayReference { private _backdropClick: Subject = new Subject(); private _attachments = new Subject(); private _detachments = new Subject(); + + /** + * Reference to the parent of the `_host` at the time it was detached. Used to restore + * the `_host` to its original position in the DOM when it gets re-attached. + */ + private _previousHostParent: HTMLElement; private _keydownEventsObservable: Observable = Observable.create(observer => { const subscription = this._keydownEvents.subscribe(observer); this._keydownEventSubscriptions++; @@ -99,6 +105,10 @@ export class OverlayRef implements PortalOutlet, OverlayReference { } // Update the pane element with the given configuration. + if (!this._host.parentElement && this._previousHostParent) { + this._previousHostParent.appendChild(this._host); + } + this._updateStackingOrder(); this._updateElementSize(); this._updateElementDirection(); @@ -176,6 +186,26 @@ export class OverlayRef implements PortalOutlet, OverlayReference { // Remove this overlay from keyboard dispatcher tracking. this._keyboardDispatcher.remove(this); + // Keeping the host element in DOM the can cause scroll jank, because it still gets rendered, + // even though it's transparent and unclickable. We can't remove the host here immediately, + // because the overlay pane's content might still be animating. This stream helps us avoid + // interrupting the animation by waiting for the pane to become empty. + const subscription = this._ngZone.onStable + .asObservable() + .pipe(takeUntil(merge(this._attachments, this._detachments))) + .subscribe(() => { + // Needs a couple of checks for the pane and host, because + // they may have been removed by the time the zone stabilizes. + if (!this._pane || !this._host || this._pane.children.length === 0) { + if (this._host && this._host.parentElement) { + this._previousHostParent = this._host.parentElement; + this._previousHostParent.removeChild(this._host); + } + + subscription.unsubscribe(); + } + }); + return detachmentResult; } @@ -203,7 +233,7 @@ export class OverlayRef implements PortalOutlet, OverlayReference { this._host = null!; } - this._pane = null!; + this._previousHostParent = this._pane = null!; if (isAttached) { this._detachments.next(); diff --git a/src/cdk/overlay/overlay.md b/src/cdk/overlay/overlay.md index 58c47f1dedfe..fb46abc343f0 100644 --- a/src/cdk/overlay/overlay.md +++ b/src/cdk/overlay/overlay.md @@ -1,5 +1,15 @@ The `overlay` package provides a way to open floating panels on the screen. +### Initial setup +The CDK overlays depend on a small set of structural styles to work correctly. If you're using +Angular Material, these styles have been included together with the theme, otherwise if you're +using the CDK on its own, you'll have to include the styles yourself. You can do so by importing +the prebuilt styles in your global stylesheet: + +```scss +@import '~@angular/cdk/overlay-prebuilt.css'; +``` + ### Creating overlays Calling `overlay.create()` will return an `OverlayRef` instance. This instance is a handle for managing that specific overlay. diff --git a/src/cdk/overlay/overlay.spec.ts b/src/cdk/overlay/overlay.spec.ts index bde5039aaf3e..05f944422ee1 100644 --- a/src/cdk/overlay/overlay.spec.ts +++ b/src/cdk/overlay/overlay.spec.ts @@ -7,9 +7,10 @@ import { ErrorHandler, Injectable, EventEmitter, + NgZone, } from '@angular/core'; import {Direction, Directionality} from '@angular/cdk/bidi'; -import {dispatchFakeEvent} from '@angular/cdk/testing'; +import {dispatchFakeEvent, MockNgZone} from '@angular/cdk/testing'; import { ComponentPortal, PortalModule, @@ -35,19 +36,26 @@ describe('Overlay', () => { let overlayContainer: OverlayContainer; let viewContainerFixture: ComponentFixture; let dir: Direction; + let zone: MockNgZone; beforeEach(async(() => { dir = 'ltr'; TestBed.configureTestingModule({ imports: [OverlayModule, PortalModule, OverlayTestModule], - providers: [{ - provide: Directionality, - useFactory: () => { - const fakeDirectionality = {}; - Object.defineProperty(fakeDirectionality, 'value', {get: () => dir}); - return fakeDirectionality; - } - }], + providers: [ + { + provide: Directionality, + useFactory: () => { + const fakeDirectionality = {}; + Object.defineProperty(fakeDirectionality, 'value', {get: () => dir}); + return fakeDirectionality; + } + }, + { + provide: NgZone, + useFactory: () => zone = new MockNgZone() + }, + ], }).compileComponents(); })); @@ -342,6 +350,33 @@ describe('Overlay', () => { expect(overlayRef.getDirection()).toBe('ltr'); }); + it('should add and remove the overlay host as the ref is being attached and detached', () => { + const overlayRef = overlay.create(); + + overlayRef.attach(componentPortal); + viewContainerFixture.detectChanges(); + + expect(overlayRef.hostElement.parentElement) + .toBeTruthy('Expected host element to be in the DOM.'); + + overlayRef.detach(); + + expect(overlayRef.hostElement.parentElement) + .toBeTruthy('Expected host element not to have been removed immediately.'); + + viewContainerFixture.detectChanges(); + zone.simulateZoneExit(); + + expect(overlayRef.hostElement.parentElement) + .toBeFalsy('Expected host element to have been removed once the zone stabilizes.'); + + overlayRef.attach(componentPortal); + viewContainerFixture.detectChanges(); + + expect(overlayRef.hostElement.parentElement) + .toBeTruthy('Expected host element to be back in the DOM.'); + }); + describe('positioning', () => { let config: OverlayConfig; @@ -354,6 +389,7 @@ describe('Overlay', () => { overlay.create(config).attach(componentPortal); viewContainerFixture.detectChanges(); + zone.simulateZoneExit(); tick(); expect(overlayContainerElement.querySelectorAll('.fake-positioned').length).toBe(1); diff --git a/src/cdk/overlay/position/connected-position-strategy.spec.ts b/src/cdk/overlay/position/connected-position-strategy.spec.ts index 4a67c1ff2142..44be604f080b 100644 --- a/src/cdk/overlay/position/connected-position-strategy.spec.ts +++ b/src/cdk/overlay/position/connected-position-strategy.spec.ts @@ -63,7 +63,7 @@ describe('ConnectedPositionStrategy', () => { let originElement: HTMLElement; let positionStrategy: ConnectedPositionStrategy; - let fakeElementRef: ElementRef; + let fakeElementRef: ElementRef; let originRect: ClientRect | null; let originCenterX: number | null; @@ -73,7 +73,7 @@ describe('ConnectedPositionStrategy', () => { // The origin and overlay elements need to be in the document body in order to have geometry. originElement = createPositionedBlockElement(); document.body.appendChild(originElement); - fakeElementRef = new ElementRef(originElement); + fakeElementRef = new ElementRef(originElement); }); afterEach(() => { @@ -583,7 +583,7 @@ describe('ConnectedPositionStrategy', () => { let positionChangeHandler: jasmine.Spy; let onPositionChangeSubscription: Subscription; let positionChange: ConnectedOverlayPositionChange; - let fakeElementRef: ElementRef; + let fakeElementRef: ElementRef; let positionStrategy: ConnectedPositionStrategy; beforeEach(() => { @@ -597,14 +597,14 @@ describe('ConnectedPositionStrategy', () => { scrollable.appendChild(originElement); // Create a strategy with knowledge of the scrollable container - fakeElementRef = new ElementRef(originElement); + fakeElementRef = new ElementRef(originElement); positionStrategy = overlay.position().connectedTo( fakeElementRef, {originX: 'start', originY: 'bottom'}, {overlayX: 'start', overlayY: 'top'}); positionStrategy.withScrollableContainers([ - new CdkScrollable(new ElementRef(scrollable), null!, null!)]); + new CdkScrollable(new ElementRef(scrollable), null!, null!)]); positionChangeHandler = jasmine.createSpy('positionChangeHandler'); onPositionChangeSubscription = positionStrategy.onPositionChange.subscribe(positionChangeHandler); @@ -673,13 +673,13 @@ describe('ConnectedPositionStrategy', () => { describe('positioning properties', () => { let originElement: HTMLElement; let positionStrategy: ConnectedPositionStrategy; - let fakeElementRef: ElementRef; + let fakeElementRef: ElementRef; beforeEach(() => { // The origin and overlay elements need to be in the document body in order to have geometry. originElement = createPositionedBlockElement(); document.body.appendChild(originElement); - fakeElementRef = new ElementRef(originElement); + fakeElementRef = new ElementRef(originElement); }); afterEach(() => { diff --git a/src/cdk/overlay/position/connected-position-strategy.ts b/src/cdk/overlay/position/connected-position-strategy.ts index 4fa8931f6e39..8f95424c32fd 100644 --- a/src/cdk/overlay/position/connected-position-strategy.ts +++ b/src/cdk/overlay/position/connected-position-strategy.ts @@ -28,7 +28,7 @@ import {OverlayReference} from '../overlay-reference'; * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner * of the overlay. * @deprecated Use `FlexibleConnectedPositionStrategy` instead. - * @deletion-target 7.0.0 + * @breaking-change 7.0.0 */ export class ConnectedPositionStrategy implements PositionStrategy { /** @@ -58,10 +58,10 @@ export class ConnectedPositionStrategy implements PositionStrategy { constructor( originPos: OriginConnectionPosition, overlayPos: OverlayConnectionPosition, - connectedTo: ElementRef, + connectedTo: ElementRef, viewportRuler: ViewportRuler, document: Document, - // @deletion-target 7.0.0 `platform` parameter to be made required. + // @breaking-change 7.0.0 `platform` parameter to be made required. platform?: Platform) { // Since the `ConnectedPositionStrategy` is deprecated and we don't want to maintain diff --git a/src/cdk/overlay/position/flexible-connected-position-strategy.spec.ts b/src/cdk/overlay/position/flexible-connected-position-strategy.spec.ts index 8edb456a4ff8..4f30a0b485c2 100644 --- a/src/cdk/overlay/position/flexible-connected-position-strategy.spec.ts +++ b/src/cdk/overlay/position/flexible-connected-position-strategy.spec.ts @@ -1575,7 +1575,7 @@ describe('FlexibleConnectedPositionStrategy', () => { }]); strategy.withScrollableContainers([ - new CdkScrollable(new ElementRef(scrollable), null!, null!) + new CdkScrollable(new ElementRef(scrollable), null!, null!) ]); positionChangeHandler = jasmine.createSpy('positionChange handler'); diff --git a/src/cdk/overlay/position/flexible-connected-position-strategy.ts b/src/cdk/overlay/position/flexible-connected-position-strategy.ts index f033d6d784d0..75791a3c7c16 100644 --- a/src/cdk/overlay/position/flexible-connected-position-strategy.ts +++ b/src/cdk/overlay/position/flexible-connected-position-strategy.ts @@ -132,7 +132,7 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy { connectedTo: ElementRef | HTMLElement, private _viewportRuler: ViewportRuler, private _document: Document, - // @deletion-target 7.0.0 `_platform` and `_overlayContainer` parameters to be made required. + // @breaking-change 7.0.0 `_platform` and `_overlayContainer` parameters to be made required. private _platform?: Platform, private _overlayContainer?: OverlayContainer) { this.setOrigin(connectedTo); @@ -171,7 +171,7 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy { */ apply(): void { // We shouldn't do anything if the strategy was disposed or we're on the server. - // @deletion-target 7.0.0 Remove `_platform` null check once it's guaranteed to be defined. + // @breaking-change 7.0.0 Remove `_platform` null check once it's guaranteed to be defined. if (this._isDisposed || (this._platform && !this._platform.isBrowser)) { return; } @@ -842,7 +842,7 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy { overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect); } - // @deletion-target 7.0.0 Currently the `_overlayContainer` is optional in order to avoid a + // @breaking-change 7.0.0 Currently the `_overlayContainer` is optional in order to avoid a // breaking change. The null check here can be removed once the `_overlayContainer` becomes // a required parameter. let virtualKeyboardOffset = this._overlayContainer ? diff --git a/src/cdk/overlay/position/global-position-strategy.ts b/src/cdk/overlay/position/global-position-strategy.ts index 389c67506288..1787e5832355 100644 --- a/src/cdk/overlay/position/global-position-strategy.ts +++ b/src/cdk/overlay/position/global-position-strategy.ts @@ -93,7 +93,7 @@ export class GlobalPositionStrategy implements PositionStrategy { * Sets the overlay width and clears any previously set width. * @param value New width for the overlay * @deprecated Pass the `width` through the `OverlayConfig`. - * @deletion-target 7.0.0 + * @breaking-change 7.0.0 */ width(value: string = ''): this { if (this._overlayRef) { @@ -109,7 +109,7 @@ export class GlobalPositionStrategy implements PositionStrategy { * Sets the overlay height and clears any previously set height. * @param value New height for the overlay * @deprecated Pass the `height` through the `OverlayConfig`. - * @deletion-target 7.0.0 + * @breaking-change 7.0.0 */ height(value: string = ''): this { if (this._overlayRef) { diff --git a/src/cdk/overlay/position/overlay-position-builder.ts b/src/cdk/overlay/position/overlay-position-builder.ts index ad8705f49d36..864c30a3b037 100644 --- a/src/cdk/overlay/position/overlay-position-builder.ts +++ b/src/cdk/overlay/position/overlay-position-builder.ts @@ -23,7 +23,7 @@ export class OverlayPositionBuilder { constructor( private _viewportRuler: ViewportRuler, @Inject(DOCUMENT) private _document: any, - // @deletion-target 7.0.0 `_platform` and `_overlayContainer` parameters to be made required. + // @breaking-change 7.0.0 `_platform` and `_overlayContainer` parameters to be made required. @Optional() private _platform?: Platform, @Optional() private _overlayContainer?: OverlayContainer) { } @@ -40,7 +40,7 @@ export class OverlayPositionBuilder { * @param originPos * @param overlayPos * @deprecated Use `flexibleConnectedTo` instead. - * @deletion-target 7.0.0 + * @breaking-change 7.0.0 */ connectedTo( elementRef: ElementRef, diff --git a/src/cdk/platform/features.ts b/src/cdk/platform/features.ts index 10cd148f40f6..6b31384fc376 100644 --- a/src/cdk/platform/features.ts +++ b/src/cdk/platform/features.ts @@ -27,6 +27,12 @@ export function supportsPassiveEventListeners(): boolean { return supportsPassiveEvents; } +/** Check whether the browser supports scroll behaviors. */ +export function supportsScrollBehavior(): boolean { + return !!(document && document.documentElement && document.documentElement.style && + 'scrollBehavior' in document.documentElement.style); +} + /** Cached result Set of input types support by the current browser. */ let supportedInputTypes: Set; diff --git a/src/cdk/platform/platform.ts b/src/cdk/platform/platform.ts index fd14d3bdd019..a708f4de4577 100755 --- a/src/cdk/platform/platform.ts +++ b/src/cdk/platform/platform.ts @@ -68,7 +68,7 @@ export class Platform { SAFARI: boolean = this.isBrowser && /safari/i.test(navigator.userAgent) && this.WEBKIT; /** - * @deletion-target v7.0.0 remove optional decorator + * @breaking-change v7.0.0 remove optional decorator */ constructor(@Optional() @Inject(PLATFORM_ID) private _platformId?: Object) { } diff --git a/src/cdk/scrolling/scroll-dispatcher.spec.ts b/src/cdk/scrolling/scroll-dispatcher.spec.ts index 6e5624a7a190..03f4e305530d 100644 --- a/src/cdk/scrolling/scroll-dispatcher.spec.ts +++ b/src/cdk/scrolling/scroll-dispatcher.spec.ts @@ -117,7 +117,7 @@ describe('ScrollDispatcher', () => { describe('Nested scrollables', () => { let scroll: ScrollDispatcher; let fixture: ComponentFixture; - let element: ElementRef; + let element: ElementRef; beforeEach(inject([ScrollDispatcher], (s: ScrollDispatcher) => { scroll = s; @@ -228,7 +228,7 @@ describe('ScrollDispatcher', () => { }) class ScrollingComponent { @ViewChild(CdkScrollable) scrollable: CdkScrollable; - @ViewChild('scrollingElement') scrollingElement: ElementRef; + @ViewChild('scrollingElement') scrollingElement: ElementRef; } @@ -245,7 +245,7 @@ class ScrollingComponent { ` }) class NestedScrollingComponent { - @ViewChild('interestingElement') interestingElement: ElementRef; + @ViewChild('interestingElement') interestingElement: ElementRef; } const TEST_COMPONENTS = [ScrollingComponent, NestedScrollingComponent]; diff --git a/src/cdk/scrolling/scroll-dispatcher.ts b/src/cdk/scrolling/scroll-dispatcher.ts index a17fd96c2bbc..9af317c31e06 100644 --- a/src/cdk/scrolling/scroll-dispatcher.ts +++ b/src/cdk/scrolling/scroll-dispatcher.ts @@ -141,14 +141,14 @@ export class ScrollDispatcher implements OnDestroy { /** Returns true if the element is contained within the provided Scrollable. */ private _scrollableContainsElement(scrollable: CdkScrollable, elementRef: ElementRef): boolean { - let element = elementRef.nativeElement; + let element: HTMLElement | null = elementRef.nativeElement; let scrollableElement = scrollable.getElementRef().nativeElement; // Traverse through the element parents until we reach null, checking if any of the elements // are the scrollable's element. do { if (element == scrollableElement) { return true; } - } while (element = element.parentElement); + } while (element = element!.parentElement); return false; } @@ -170,13 +170,13 @@ export class ScrollDispatcher implements OnDestroy { } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function SCROLL_DISPATCHER_PROVIDER_FACTORY( parentDispatcher: ScrollDispatcher, ngZone: NgZone, platform: Platform) { return parentDispatcher || new ScrollDispatcher(ngZone, platform); } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export const SCROLL_DISPATCHER_PROVIDER = { // If there is already a ScrollDispatcher available, use that. Otherwise, provide a new one. provide: ScrollDispatcher, diff --git a/src/cdk/scrolling/viewport-ruler.ts b/src/cdk/scrolling/viewport-ruler.ts index 779c9dd9f0de..f8e8c6a166d2 100644 --- a/src/cdk/scrolling/viewport-ruler.ts +++ b/src/cdk/scrolling/viewport-ruler.ts @@ -123,14 +123,14 @@ export class ViewportRuler implements OnDestroy { } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export function VIEWPORT_RULER_PROVIDER_FACTORY(parentRuler: ViewportRuler, platform: Platform, ngZone: NgZone) { return parentRuler || new ViewportRuler(platform, ngZone); } -/** @docs-private @deprecated @deletion-target 7.0.0 */ +/** @docs-private @deprecated @breaking-change 7.0.0 */ export const VIEWPORT_RULER_PROVIDER = { // If there is already a ViewportRuler available, use that. Otherwise, provide a new one. provide: ViewportRuler, diff --git a/src/cdk/stepper/stepper.ts b/src/cdk/stepper/stepper.ts index c216a9556b26..a2df89e7e0f3 100644 --- a/src/cdk/stepper/stepper.ts +++ b/src/cdk/stepper/stepper.ts @@ -19,6 +19,7 @@ import { ContentChildren, Directive, EventEmitter, + ElementRef, forwardRef, Inject, Input, @@ -31,6 +32,7 @@ import { ViewChild, ViewEncapsulation, } from '@angular/core'; +import {DOCUMENT} from '@angular/common'; import {AbstractControl} from '@angular/forms'; import {CdkStepLabel} from './step-label'; import {Observable, Subject, of as obaservableOf} from 'rxjs'; @@ -164,6 +166,12 @@ export class CdkStepper implements AfterViewInit, OnDestroy { /** Used for managing keyboard focus. */ private _keyManager: FocusKeyManager; + /** + * @breaking-change 8.0.0 Remove `| undefined` once the `_document` + * constructor param is required. + */ + private _document: Document | undefined; + /** The list of step components that the stepper is holding. */ @ContentChildren(CdkStep) _steps: QueryList; @@ -200,7 +208,7 @@ export class CdkStepper implements AfterViewInit, OnDestroy { /** The step that is selected. */ @Input() get selected(): CdkStep { - // @deletion-target 7.0.0 Change return type to `CdkStep | undefined`. + // @breaking-change 7.0.0 Change return type to `CdkStep | undefined`. return this._steps ? this._steps.toArray()[this.selectedIndex] : undefined!; } set selected(step: CdkStep) { @@ -218,8 +226,12 @@ export class CdkStepper implements AfterViewInit, OnDestroy { constructor( @Optional() private _dir: Directionality, - private _changeDetectorRef: ChangeDetectorRef) { + private _changeDetectorRef: ChangeDetectorRef, + // @breaking-change 8.0.0 `_elementRef` and `_document` parameters to become required. + private _elementRef?: ElementRef, + @Inject(DOCUMENT) _document?: any) { this._groupId = nextId++; + this._document = _document; } ngAfterViewInit() { @@ -232,6 +244,12 @@ export class CdkStepper implements AfterViewInit, OnDestroy { .subscribe(direction => this._keyManager.withHorizontalOrientation(direction)); this._keyManager.updateActiveItemIndex(this._selectedIndex); + + this._steps.changes.pipe(takeUntil(this._destroyed)).subscribe(() => { + if (!this.selected) { + this._selectedIndex = Math.max(this._selectedIndex - 1, 0); + } + }); } ngOnDestroy() { @@ -305,7 +323,14 @@ export class CdkStepper implements AfterViewInit, OnDestroy { selectedStep: stepsArray[newIndex], previouslySelectedStep: stepsArray[this._selectedIndex], }); - this._keyManager.updateActiveItemIndex(newIndex); + + // If focus is inside the stepper, move it to the next header, otherwise it may become + // lost when the active step content is hidden. We can't be more granular with the check + // (e.g. checking whether focus is inside the active step), because we don't have a + // reference to the elements that are rendering out the content. + this._containsFocus() ? this._keyManager.setActiveItem(newIndex) : + this._keyManager.updateActiveItemIndex(newIndex); + this._selectedIndex = newIndex; this._stateChanged(); } @@ -348,4 +373,15 @@ export class CdkStepper implements AfterViewInit, OnDestroy { private _layoutDirection(): Direction { return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr'; } + + /** Checks whether the stepper contains the focused element. */ + private _containsFocus(): boolean { + if (!this._document || !this._elementRef) { + return false; + } + + const stepperElement = this._elementRef.nativeElement; + const focusedElement = this._document.activeElement; + return stepperElement === focusedElement || stepperElement.contains(focusedElement); + } } diff --git a/src/cdk/table/BUILD.bazel b/src/cdk/table/BUILD.bazel index bd6e1469962c..cc610cb81733 100644 --- a/src/cdk/table/BUILD.bazel +++ b/src/cdk/table/BUILD.bazel @@ -11,6 +11,7 @@ ng_module( "//src/cdk/bidi", "//src/cdk/collections", "//src/cdk/coercion", + "//src/cdk/platform", "@rxjs", ], tsconfig = "//src/cdk:tsconfig-build.json", diff --git a/src/cdk/table/row.ts b/src/cdk/table/row.ts index 6b5363f62c92..d9cf19517f3c 100644 --- a/src/cdk/table/row.ts +++ b/src/cdk/table/row.ts @@ -14,6 +14,7 @@ import { IterableDiffer, IterableDiffers, OnChanges, + OnDestroy, SimpleChanges, TemplateRef, ViewContainerRef, @@ -207,7 +208,7 @@ export interface CdkCellOutletMultiRowContext { * @docs-private */ @Directive({selector: '[cdkCellOutlet]'}) -export class CdkCellOutlet { +export class CdkCellOutlet implements OnDestroy { /** The ordered list of cells to render within this outlet's view container */ cells: CdkCellDef[]; @@ -226,6 +227,14 @@ export class CdkCellOutlet { constructor(public _viewContainer: ViewContainerRef) { CdkCellOutlet.mostRecentCellOutlet = this; } + + ngOnDestroy() { + // If this was the last outlet being rendered in the view, remove the reference + // from the static property after it has been destroyed to avoid leaking memory. + if (CdkCellOutlet.mostRecentCellOutlet === this) { + CdkCellOutlet.mostRecentCellOutlet = null; + } + } } /** Header template container that contains the cell outlet. Adds the right class and role. */ diff --git a/src/cdk/table/sticky-styler.ts b/src/cdk/table/sticky-styler.ts index 8525fdb3e8b9..763cb0acc0ed 100644 --- a/src/cdk/table/sticky-styler.ts +++ b/src/cdk/table/sticky-styler.ts @@ -32,10 +32,12 @@ export class StickyStyler { * sticky positioning applied. * @param direction The directionality context of the table (ltr/rtl); affects column positioning * by reversing left/right positions. + * @param _isBrowser Whether the table is currently being rendered on the server or the client. */ constructor(private isNativeHtmlTable: boolean, private stickCellCss: string, - public direction: Direction) { } + public direction: Direction, + private _isBrowser = true) { } /** * Clears the sticky positioning styles from the row and its cells by resetting the `position` @@ -45,7 +47,14 @@ export class StickyStyler { */ clearStickyPositioning(rows: HTMLElement[], stickyDirections: StickyDirection[]) { for (const row of rows) { + // If the row isn't an element (e.g. if it's an `ng-container`), + // it won't have inline styles or `children` so we skip it. + if (row.nodeType !== row.ELEMENT_NODE) { + continue; + } + this._removeStickyStyle(row, stickyDirections); + for (let i = 0; i < row.children.length; i++) { const cell = row.children[i] as HTMLElement; this._removeStickyStyle(cell, stickyDirections); @@ -66,7 +75,7 @@ export class StickyStyler { rows: HTMLElement[], stickyStartStates: boolean[], stickyEndStates: boolean[]) { const hasStickyColumns = stickyStartStates.some(state => state) || stickyEndStates.some(state => state); - if (!rows.length || !hasStickyColumns) { + if (!rows.length || !hasStickyColumns || !this._isBrowser) { return; } @@ -104,6 +113,11 @@ export class StickyStyler { * */ stickRows(rowsToStick: HTMLElement[], stickyStates: boolean[], position: 'top' | 'bottom') { + // Since we can't measure the rows on the server, we can't stick the rows properly. + if (!this._isBrowser) { + return; + } + // If positioning the rows to the bottom, reverse their order when evaluating the sticky // position such that the last row stuck will be "bottom: 0px" and so on. const rows = position === 'bottom' ? rowsToStick.reverse() : rowsToStick; diff --git a/src/cdk/table/table.spec.ts b/src/cdk/table/table.spec.ts index fecc5783f907..7bd119f6b335 100644 --- a/src/cdk/table/table.spec.ts +++ b/src/cdk/table/table.spec.ts @@ -14,7 +14,7 @@ import {BehaviorSubject, combineLatest, Observable, of as observableOf} from 'rx import {map} from 'rxjs/operators'; import {CdkColumnDef} from './cell'; import {CdkTableModule} from './index'; -import {CdkHeaderRowDef, CdkRowDef} from './row'; +import {CdkHeaderRowDef, CdkRowDef, CdkCellOutlet} from './row'; import {CdkTable} from './table'; import { getTableDuplicateColumnNameError, @@ -137,6 +137,17 @@ describe('CdkTable', () => { }); }); + it('should clear the `mostRecentCellOutlet` on destroy', () => { + // Note: we cast the assertions here to booleans, because they may + // contain circular objects which will throw Jasmine into an infinite + // when its tries to stringify them to show a test failure. + expect(!!CdkCellOutlet.mostRecentCellOutlet).toBe(true); + + fixture.destroy(); + + expect(!!CdkCellOutlet.mostRecentCellOutlet).toBe(false); + }); + describe('should correctly use the differ to add/remove/move rows', () => { function addInitialIndexAttribute() { // Each row receives an attribute 'initialIndex' the element's original place diff --git a/src/cdk/table/table.ts b/src/cdk/table/table.ts index 303bfb397b47..ecbce805c268 100644 --- a/src/cdk/table/table.ts +++ b/src/cdk/table/table.ts @@ -31,7 +31,9 @@ import { ViewChild, ViewContainerRef, ViewEncapsulation, + Inject, } from '@angular/core'; +import {DOCUMENT} from '@angular/common'; import {BehaviorSubject, Observable, of as observableOf, Subject, Subscription} from 'rxjs'; import {takeUntil} from 'rxjs/operators'; import {CdkColumnDef} from './cell'; @@ -55,6 +57,7 @@ import { import {coerceBooleanProperty} from '@angular/cdk/coercion'; import {StickyStyler} from './sticky-styler'; import {Direction, Directionality} from '@angular/cdk/bidi'; +import {Platform} from '@angular/cdk/platform'; /** Interface used to provide an outlet for rows to be inserted into. */ export interface RowOutlet { @@ -67,7 +70,8 @@ export interface RowOutlet { */ @Directive({selector: '[rowOutlet]'}) export class DataRowOutlet implements RowOutlet { - constructor(public viewContainer: ViewContainerRef, public elementRef: ElementRef) { } + constructor(public viewContainer: ViewContainerRef, + public elementRef: ElementRef) { } } /** @@ -76,7 +80,8 @@ export class DataRowOutlet implements RowOutlet { */ @Directive({selector: '[headerRowOutlet]'}) export class HeaderRowOutlet implements RowOutlet { - constructor(public viewContainer: ViewContainerRef, public elementRef: ElementRef) { } + constructor(public viewContainer: ViewContainerRef, + public elementRef: ElementRef) { } } /** @@ -85,7 +90,8 @@ export class HeaderRowOutlet implements RowOutlet { */ @Directive({selector: '[footerRowOutlet]'}) export class FooterRowOutlet implements RowOutlet { - constructor(public viewContainer: ViewContainerRef, public elementRef: ElementRef) { } + constructor(public viewContainer: ViewContainerRef, + public elementRef: ElementRef) { } } /** @@ -148,6 +154,8 @@ export interface RenderRow { changeDetection: ChangeDetectionStrategy.OnPush, }) export class CdkTable implements AfterContentChecked, CollectionViewer, OnDestroy, OnInit { + private _document: Document; + /** Latest data provided by the data source. */ protected _data: T[]; @@ -359,11 +367,19 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes protected readonly _changeDetectorRef: ChangeDetectorRef, protected readonly _elementRef: ElementRef, @Attribute('role') role: string, - @Optional() protected readonly _dir: Directionality) { + @Optional() protected readonly _dir: Directionality, + /** + * @deprecated + * @breaking-change 8.0.0 `_document` and `_platform` to + * be made into a required parameters. + */ + @Inject(DOCUMENT) _document?: any, + private _platform?: Platform) { if (!role) { this._elementRef.nativeElement.setAttribute('role', 'grid'); } + this._document = _document; this._isNativeHtmlTable = this._elementRef.nativeElement.nodeName === 'TABLE'; } @@ -478,7 +494,7 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes * table's content is checked. * @docs-private * @deprecated Use `addHeaderRowDef` and `removeHeaderRowDef` instead - * @deletion-target 8.0.0 + * @breaking-change 8.0.0 */ setHeaderRowDef(headerRowDef: CdkHeaderRowDef) { this._customHeaderRowDefs = new Set([headerRowDef]); @@ -491,7 +507,7 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes * table's content is checked. * @docs-private * @deprecated Use `addFooterRowDef` and `removeFooterRowDef` instead - * @deletion-target 8.0.0 + * @breaking-change 8.0.0 */ setFooterRowDef(footerRowDef: CdkFooterRowDef) { this._customFooterRowDefs = new Set([footerRowDef]); @@ -947,7 +963,9 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes ]; for (const section of sections) { - const element = document.createElement(section.tag); + // @breaking-change 8.0.0 remove the `|| document` once the `_document` is a required param. + const documentRef = this._document || document; + const element = documentRef.createElement(section.tag); element.appendChild(section.outlet.elementRef.nativeElement); this._elementRef.nativeElement.appendChild(element); } @@ -999,7 +1017,9 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes */ private _setupStickyStyler() { const direction: Direction = this._dir ? this._dir.value : 'ltr'; - this._stickyStyler = new StickyStyler(this._isNativeHtmlTable, this.stickyCssClass, direction); + this._stickyStyler = new StickyStyler(this._isNativeHtmlTable, + // @breaking-change 8.0.0 remove the null check for `this._platform`. + this.stickyCssClass, direction, this._platform ? this._platform.isBrowser : true); (this._dir ? this._dir.change : observableOf()) .pipe(takeUntil(this._onDestroy)) .subscribe(value => { @@ -1010,6 +1030,6 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes } /** Utility function that gets a merged list of the entries in a QueryList and values of a Set. */ -function mergeQueryListAndSet(queryList: QueryList, set: Set): T[] { +function mergeQueryListAndSet(queryList: QueryList, set: Set): T[] { return queryList.toArray().concat(Array.from(set)); } diff --git a/src/cdk/testing/event-objects.ts b/src/cdk/testing/event-objects.ts index bc2358786208..040794e20142 100644 --- a/src/cdk/testing/event-objects.ts +++ b/src/cdk/testing/event-objects.ts @@ -26,6 +26,10 @@ export function createMouseEvent(type: string, x = 0, y = 0) { 0, /* button */ null /* relatedTarget */); + // `initMouseEvent` doesn't allow us to pass the `buttons` and + // defaults it to 0 which looks like a fake event. + Object.defineProperty(event, 'buttons', {get: () => 1}); + return event; } diff --git a/src/cdk/text-field/_text-field.scss b/src/cdk/text-field/_text-field.scss index 82ecffcf4800..46a79b6d3180 100644 --- a/src/cdk/text-field/_text-field.scss +++ b/src/cdk/text-field/_text-field.scss @@ -1,10 +1,11 @@ // Core styles that enable monitoring autofill state of text fields. @mixin cdk-text-field { // Keyframes that apply no styles, but allow us to monitor when an text field becomes autofilled - // by watching for the animation events that are fired when they start. + // by watching for the animation events that are fired when they start. Note: the /*!*/ comment is + // needed to prevent LibSass from stripping the keyframes out. // Based on: https://medium.com/@brunn/detecting-autofilled-fields-in-javascript-aed598d25da7 - @keyframes cdk-text-field-autofill-start {} - @keyframes cdk-text-field-autofill-end {} + @keyframes cdk-text-field-autofill-start {/*!*/} + @keyframes cdk-text-field-autofill-end {/*!*/} .cdk-text-field-autofill-monitored:-webkit-autofill { animation-name: cdk-text-field-autofill-start; diff --git a/src/cdk/text-field/autofill.spec.ts b/src/cdk/text-field/autofill.spec.ts index 97bd1bbc02de..5f686f4705f4 100644 --- a/src/cdk/text-field/autofill.spec.ts +++ b/src/cdk/text-field/autofill.spec.ts @@ -155,7 +155,7 @@ describe('AutofillMonitor', () => { let animationStartCallback: Function = () => {}; inputEl.addEventListener.and.callFake((_, cb) => animationStartCallback = cb); const autofillStream = autofillMonitor.monitor(inputEl); - const spy = jasmine.createSpy('zone spy'); + const spy = jasmine.createSpy('autofill spy'); autofillStream.subscribe(() => spy(NgZone.isInAngularZone())); expect(spy).not.toHaveBeenCalled(); @@ -163,6 +163,17 @@ describe('AutofillMonitor', () => { animationStartCallback({animationName: 'cdk-text-field-autofill-start', target: inputEl}); expect(spy).toHaveBeenCalledWith(true); }); + + it('should not emit on init if input is unfilled', () => { + const inputEl = testComponent.input1.nativeElement; + let animationStartCallback: Function = () => {}; + inputEl.addEventListener.and.callFake((_, cb) => animationStartCallback = cb); + const autofillStream = autofillMonitor.monitor(inputEl); + const spy = jasmine.createSpy('autofill spy'); + autofillStream.subscribe(() => spy()); + animationStartCallback({animationName: 'cdk-text-field-autofill-end', target: inputEl}); + expect(spy).not.toHaveBeenCalled(); + }); }); describe('cdkAutofill', () => { @@ -187,13 +198,13 @@ describe('cdkAutofill', () => { })); it('should monitor host element on init', () => { - expect(autofillMonitor.monitor).toHaveBeenCalledWith(testComponent.input.nativeElement); + expect(autofillMonitor.monitor).toHaveBeenCalledWith(testComponent.input); }); it('should stop monitoring host element on destroy', () => { expect(autofillMonitor.stopMonitoring).not.toHaveBeenCalled(); fixture.destroy(); - expect(autofillMonitor.stopMonitoring).toHaveBeenCalledWith(testComponent.input.nativeElement); + expect(autofillMonitor.stopMonitoring).toHaveBeenCalledWith(testComponent.input); }); }); @@ -205,14 +216,16 @@ describe('cdkAutofill', () => { ` }) class Inputs { - @ViewChild('input1') input1: ElementRef; - @ViewChild('input2') input2: ElementRef; - @ViewChild('input3') input3: ElementRef; + // Cast to `any` so we can stub out some methods in the tests. + @ViewChild('input1') input1: ElementRef; + @ViewChild('input2') input2: ElementRef; + @ViewChild('input3') input3: ElementRef; } @Component({ template: `` }) class InputWithCdkAutofilled { - @ViewChild('input') input: ElementRef; + // Cast to `any` so we can stub out some methods in the tests. + @ViewChild('input') input: ElementRef; } diff --git a/src/cdk/text-field/autofill.ts b/src/cdk/text-field/autofill.ts index a73827183eb3..ffdf7ade8464 100644 --- a/src/cdk/text-field/autofill.ts +++ b/src/cdk/text-field/autofill.ts @@ -56,11 +56,21 @@ export class AutofillMonitor implements OnDestroy { * @param element The element to monitor. * @return A stream of autofill state changes. */ - monitor(element: Element): Observable { + monitor(element: Element): Observable; + + /** + * Monitor for changes in the autofill state of the given input element. + * @param element The element to monitor. + * @return A stream of autofill state changes. + */ + monitor(element: ElementRef): Observable; + + monitor(elementOrRef: Element | ElementRef): Observable { if (!this._platform.isBrowser) { return EMPTY; } + const element = elementOrRef instanceof ElementRef ? elementOrRef.nativeElement : elementOrRef; const info = this._monitoredElements.get(element); if (info) { @@ -68,12 +78,18 @@ export class AutofillMonitor implements OnDestroy { } const result = new Subject(); + const cssClass = 'cdk-text-field-autofilled'; const listener = (event: AnimationEvent) => { - if (event.animationName === 'cdk-text-field-autofill-start') { - element.classList.add('cdk-text-field-autofilled'); + // Animation events fire on initial element render, we check for the presence of the autofill + // CSS class to make sure this is a real change in state, not just the initial render before + // we fire off events. + if (event.animationName === 'cdk-text-field-autofill-start' && + !element.classList.contains(cssClass)) { + element.classList.add(cssClass); this._ngZone.run(() => result.next({target: event.target as Element, isAutofilled: true})); - } else if (event.animationName === 'cdk-text-field-autofill-end') { - element.classList.remove('cdk-text-field-autofilled'); + } else if (event.animationName === 'cdk-text-field-autofill-end' && + element.classList.contains(cssClass)) { + element.classList.remove(cssClass); this._ngZone.run(() => result.next({target: event.target as Element, isAutofilled: false})); } }; @@ -97,7 +113,16 @@ export class AutofillMonitor implements OnDestroy { * Stop monitoring the autofill state of the given input element. * @param element The element to stop monitoring. */ - stopMonitoring(element: Element) { + stopMonitoring(element: Element); + + /** + * Stop monitoring the autofill state of the given input element. + * @param element The element to stop monitoring. + */ + stopMonitoring(element: ElementRef); + + stopMonitoring(elementOrRef: Element | ElementRef) { + const element = elementOrRef instanceof ElementRef ? elementOrRef.nativeElement : elementOrRef; const info = this._monitoredElements.get(element); if (info) { @@ -123,15 +148,16 @@ export class CdkAutofill implements OnDestroy, OnInit { /** Emits when the autofill state of the element changes. */ @Output() cdkAutofill: EventEmitter = new EventEmitter(); - constructor(private _elementRef: ElementRef, private _autofillMonitor: AutofillMonitor) {} + constructor(private _elementRef: ElementRef, + private _autofillMonitor: AutofillMonitor) {} ngOnInit() { this._autofillMonitor - .monitor(this._elementRef.nativeElement) + .monitor(this._elementRef) .subscribe(event => this.cdkAutofill.emit(event)); } ngOnDestroy() { - this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement); + this._autofillMonitor.stopMonitoring(this._elementRef); } } diff --git a/src/cdk/text-field/autosize.ts b/src/cdk/text-field/autosize.ts index 5b132b06c625..2df4384b9e13 100644 --- a/src/cdk/text-field/autosize.ts +++ b/src/cdk/text-field/autosize.ts @@ -78,7 +78,7 @@ export class CdkTextareaAutosize implements AfterViewInit, DoCheck, OnDestroy { private _cachedLineHeight: number; constructor( - private _elementRef: ElementRef, + private _elementRef: ElementRef, private _platform: Platform, private _ngZone: NgZone) { this._textareaElement = this._elementRef.nativeElement as HTMLTextAreaElement; diff --git a/src/cdk/tree/nested-node.ts b/src/cdk/tree/nested-node.ts index 4795d10de1ca..393f0741eb1e 100644 --- a/src/cdk/tree/nested-node.ts +++ b/src/cdk/tree/nested-node.ts @@ -63,7 +63,7 @@ export class CdkNestedTreeNode extends CdkTreeNode implements AfterContent /** The children node placeholder. */ @ContentChildren(CdkTreeNodeOutlet) nodeOutlet: QueryList; - constructor(protected _elementRef: ElementRef, + constructor(protected _elementRef: ElementRef, protected _tree: CdkTree, protected _differs: IterableDiffers) { super(_elementRef, _tree); diff --git a/src/cdk/tree/padding.ts b/src/cdk/tree/padding.ts index 1cee182752f1..4d38c545c3c7 100644 --- a/src/cdk/tree/padding.ts +++ b/src/cdk/tree/padding.ts @@ -46,7 +46,7 @@ export class CdkTreeNodePadding implements OnDestroy { constructor(private _treeNode: CdkTreeNode, private _tree: CdkTree, private _renderer: Renderer2, - private _element: ElementRef, + private _element: ElementRef, @Optional() private _dir: Directionality) { this._setPadding(); if (this._dir) { diff --git a/src/cdk/tree/tree.spec.ts b/src/cdk/tree/tree.spec.ts index e7ffa605c7aa..a91038c61aa1 100644 --- a/src/cdk/tree/tree.spec.ts +++ b/src/cdk/tree/tree.spec.ts @@ -17,7 +17,7 @@ import {TreeControl} from './control/tree-control'; import {FlatTreeControl} from './control/flat-tree-control'; import {NestedTreeControl} from './control/nested-tree-control'; import {CdkTreeModule} from './index'; -import {CdkTree} from './tree'; +import {CdkTree, CdkTreeNode} from './tree'; import {getTreeControlFunctionsMissingError} from './tree-errors'; @@ -35,6 +35,20 @@ describe('CdkTree', () => { }).compileComponents(); } + it('should clear out the `mostRecentTreeNode` on destroy', () => { + configureCdkTreeTestingModule([SimpleCdkTreeApp]); + const fixture = TestBed.createComponent(SimpleCdkTreeApp); + fixture.detectChanges(); + + // Cast the assertions to a boolean to avoid Jasmine going into an + // infinite loop when stringifying the object, if the test starts failing. + expect(!!CdkTreeNode.mostRecentTreeNode).toBe(true); + + fixture.destroy(); + + expect(!!CdkTreeNode.mostRecentTreeNode).toBe(false); + }); + describe('flat tree', () => { describe('should initialize', () => { let fixture: ComponentFixture; diff --git a/src/cdk/tree/tree.ts b/src/cdk/tree/tree.ts index 11e4052ed8ac..674937013013 100644 --- a/src/cdk/tree/tree.ts +++ b/src/cdk/tree/tree.ts @@ -76,7 +76,7 @@ export class CdkTree /** * Provides a stream containing the latest data array to render. Influenced by the tree's * stream of view window (what dataNodes are currently on screen). - * Data source can be an observable of data array, or a dara array to render. + * Data source can be an observable of data array, or a data array to render. */ @Input() get dataSource(): DataSource | Observable | T[] { return this._dataSource; } @@ -290,7 +290,7 @@ export class CdkTree 'class': 'cdk-tree-node', }, }) -export class CdkTreeNode implements FocusableOption, OnDestroy { +export class CdkTreeNode implements FocusableOption, OnDestroy { /** * The most recently created `CdkTreeNode`. We save it in static variable so we can retrieve it * in `CdkTree` and set the data to it. @@ -322,12 +322,18 @@ export class CdkTreeNode implements FocusableOption, OnDestroy { */ @Input() role: 'treeitem' | 'group' = 'treeitem'; - constructor(protected _elementRef: ElementRef, + constructor(protected _elementRef: ElementRef, protected _tree: CdkTree) { CdkTreeNode.mostRecentTreeNode = this as CdkTreeNode; } ngOnDestroy() { + // If this is the last tree node being destroyed, + // clear out the reference to avoid leaking memory. + if (CdkTreeNode.mostRecentTreeNode === this) { + CdkTreeNode.mostRecentTreeNode = null; + } + this._destroyed.next(); this._destroyed.complete(); } diff --git a/src/demo-app/a11y/a11y.ts b/src/demo-app/a11y/a11y.ts index f3e7edc9ef4f..988634dc684b 100644 --- a/src/demo-app/a11y/a11y.ts +++ b/src/demo-app/a11y/a11y.ts @@ -31,8 +31,8 @@ export class AccessibilityDemo implements OnDestroy { private _routerSubscription = Subscription.EMPTY; - @ViewChild('maincontent') mainContent: ElementRef; - @ViewChild('header') sectionHeader: ElementRef; + @ViewChild('maincontent') mainContent: ElementRef; + @ViewChild('header') sectionHeader: ElementRef; navItems = [ {name: 'Home', route: '.'}, diff --git a/src/demo-app/card/card-demo.html b/src/demo-app/card/card-demo.html index bde2eee3829b..4c5c31e62053 100644 --- a/src/demo-app/card/card-demo.html +++ b/src/demo-app/card/card-demo.html @@ -3,20 +3,12 @@ Hello - - - Card with title - Subtitle - - - - Subtitle Card with title and footer

This is supporting text.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

{{longText}}

@@ -32,7 +24,7 @@ Card with title, footer, and inset-divider

This is supporting text.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

{{longText}}

@@ -75,4 +67,51 @@
+ +
+

Cards with media area

+ + + + Card + Small + + + + {{longText}} + + + + + + Card + Medium + + + + {{longText}} + + + + + + Card + Large + + + + {{longText}} + + + + + + Card + Extra large + + + + {{longText}} + +
diff --git a/src/demo-app/card/card-demo.ts b/src/demo-app/card/card-demo.ts index 7a2bcbbf1282..58a635617488 100644 --- a/src/demo-app/card/card-demo.ts +++ b/src/demo-app/card/card-demo.ts @@ -15,4 +15,11 @@ import {Component} from '@angular/core'; templateUrl: 'card-demo.html', styleUrls: ['card-demo.css'], }) -export class CardDemo {} +export class CardDemo { + longText = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor ' + + 'incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud ' + + 'exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor' + + ' in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur' + + ' sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id ' + + 'est laborum.'; +} diff --git a/src/demo-app/demo-app/demo-app.ts b/src/demo-app/demo-app/demo-app.ts index 72134f7e9344..2f406e41fcd2 100644 --- a/src/demo-app/demo-app/demo-app.ts +++ b/src/demo-app/demo-app/demo-app.ts @@ -96,11 +96,12 @@ export class DemoApp { ]; constructor( - private _element: ElementRef, + private _element: ElementRef, private _overlayContainer: OverlayContainer) {} toggleFullscreen() { - const elem = this._element.nativeElement.querySelector('.demo-content'); + // Cast to `any`, because the typings don't include the browser-prefixed methods. + const elem = this._element.nativeElement.querySelector('.demo-content') as any; if (elem.requestFullscreen) { elem.requestFullscreen(); } else if (elem.webkitRequestFullScreen) { diff --git a/src/demo-app/drag-drop/drag-drop-demo.html b/src/demo-app/drag-drop/drag-drop-demo.html index 1ebf05dbd83f..a82df8bd50be 100644 --- a/src/demo-app/drag-drop/drag-drop-demo.html +++ b/src/demo-app/drag-drop/drag-drop-demo.html @@ -4,6 +4,7 @@

To do

@@ -18,6 +19,7 @@

Done

@@ -34,6 +36,7 @@

Horizontal list

{{item}} @@ -43,6 +46,11 @@

Horizontal list

+
+

Free dragging

+
Drag me around
+
+

Data

{{todo.join(', ')}}
@@ -50,7 +58,14 @@

Data

{{horizontalData.join(', ')}}
-
-

Free dragging

-
Drag me around
+
+

Axis locking

+ + Lock position along axis + + None + X axis + Y axis + +
diff --git a/src/demo-app/drag-drop/drag-drop-demo.scss b/src/demo-app/drag-drop/drag-drop-demo.scss index b30f5796fb97..69e449a251a8 100644 --- a/src/demo-app/drag-drop/drag-drop-demo.scss +++ b/src/demo-app/drag-drop/drag-drop-demo.scss @@ -38,8 +38,8 @@ justify-content: space-between; box-sizing: border-box; - .cdk-drop-dragging & { - transition: transform 500ms ease; + .cdk-drop-dragging &:not(.cdk-drag-placeholder) { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } .horizontal & { @@ -65,11 +65,11 @@ } .cdk-drag-animating { - transition: transform 500ms ease; + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } .cdk-drag-placeholder { - opacity: 0.5; + opacity: 0; } .wrapper { diff --git a/src/demo-app/drag-drop/drag-drop-demo.ts b/src/demo-app/drag-drop/drag-drop-demo.ts index b72cedcf9304..0d08cf4aef82 100644 --- a/src/demo-app/drag-drop/drag-drop-demo.ts +++ b/src/demo-app/drag-drop/drag-drop-demo.ts @@ -19,6 +19,7 @@ import {CdkDragDrop, moveItemInArray, transferArrayItem} from '@angular/cdk-expe encapsulation: ViewEncapsulation.None, }) export class DragAndDropDemo { + axisLock: 'x' | 'y'; todo = [ 'Come up with catchy start-up name', 'Add "blockchain" to name', diff --git a/src/demo-app/expansion/expansion-demo.html b/src/demo-app/expansion/expansion-demo.html index 29c4cecc9953..4128b240abde 100644 --- a/src/demo-app/expansion/expansion-demo.html +++ b/src/demo-app/expansion/expansion-demo.html @@ -55,17 +55,17 @@

matAccordion


- - + + Section 1

This is the content text that makes sense here.

- + Section 2

This is the content text that makes sense here.

- + Section 3 Reveal Buttons Below diff --git a/src/demo-app/screen-type/screen-type-demo.scss b/src/demo-app/screen-type/screen-type-demo.scss index cf80ca7910a9..e206b7d99fff 100644 --- a/src/demo-app/screen-type/screen-type-demo.scss +++ b/src/demo-app/screen-type/screen-type-demo.scss @@ -10,7 +10,7 @@ .mat-figure { flex-direction: column; } - + &.active { background: rgba(0, 0, 0, 0.12); } diff --git a/src/demo-app/table/table-demo.ts b/src/demo-app/table/table-demo.ts index 12efcf8577dc..2f3f0dcdc6b5 100644 --- a/src/demo-app/table/table-demo.ts +++ b/src/demo-app/table/table-demo.ts @@ -7,6 +7,7 @@ */ import {Component} from '@angular/core'; +import {EXAMPLE_COMPONENTS} from '@angular/material-examples'; @Component({ @@ -14,25 +15,6 @@ import {Component} from '@angular/core'; templateUrl: 'table-demo.html', }) export class TableDemo { - examples = [ - 'table-basic', - 'table-basic-flex', - 'cdk-table-basic', - 'cdk-table-basic-flex', - 'table-dynamic-columns', - 'table-filtering', - 'table-footer-row', - 'table-http', - 'table-overview', - 'table-pagination', - 'table-row-context', - 'table-selection', - 'table-sorting', - 'table-expandable-rows', - 'table-sticky-header', - 'table-sticky-columns', - 'table-sticky-footer', - 'table-sticky-complex', - 'table-sticky-complex-flex', - ]; + examples = Object.keys(EXAMPLE_COMPONENTS) + .filter(example => example.startsWith('table-') || example.startsWith('cdk-table-')); } diff --git a/src/demo-app/tabs/tabs-demo.ts b/src/demo-app/tabs/tabs-demo.ts index 5ac8d1a6b0b8..a12e3abf9f5e 100644 --- a/src/demo-app/tabs/tabs-demo.ts +++ b/src/demo-app/tabs/tabs-demo.ts @@ -7,6 +7,7 @@ */ import {Component} from '@angular/core'; +import {EXAMPLE_COMPONENTS} from '@angular/material-examples'; @Component({ moduleId: module.id, @@ -14,16 +15,5 @@ import {Component} from '@angular/core'; templateUrl: 'tabs-demo.html', }) export class TabsDemo { - examples = [ - 'tab-group-basic', - 'tab-group-dynamic-height', - 'tab-group-stretched', - 'tab-group-async', - 'tab-group-custom-label', - 'tab-group-header-below', - 'tab-group-theme', - 'tab-group-lazy-loaded', - 'tab-group-dynamic', - 'tab-nav-bar-basic', - ]; + examples = Object.keys(EXAMPLE_COMPONENTS).filter(example => example.startsWith('tab-')); } diff --git a/src/demo-app/tooltip/tooltip-demo.ts b/src/demo-app/tooltip/tooltip-demo.ts index 0c1378ee9772..47a63ff2db8f 100644 --- a/src/demo-app/tooltip/tooltip-demo.ts +++ b/src/demo-app/tooltip/tooltip-demo.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ import {Component} from '@angular/core'; +import {EXAMPLE_COMPONENTS} from '@angular/material-examples'; @Component({ moduleId: module.id, @@ -13,15 +14,5 @@ import {Component} from '@angular/core'; templateUrl: 'tooltip-demo.html', }) export class TooltipDemo { - examples = [ - 'tooltip-overview', - 'tooltip-position', - 'tooltip-disabled', - 'tooltip-message', - 'tooltip-delay', - 'tooltip-manual', - 'tooltip-modified-defaults', - 'tooltip-auto-hide', - 'tooltip-custom-class', - ]; + examples = Object.keys(EXAMPLE_COMPONENTS).filter(example => example.startsWith('tooltip-')); } diff --git a/src/demo-app/virtual-scroll/virtual-scroll-demo.html b/src/demo-app/virtual-scroll/virtual-scroll-demo.html index 7c8b754eee04..0ce50761f34e 100644 --- a/src/demo-app/virtual-scroll/virtual-scroll-demo.html +++ b/src/demo-app/virtual-scroll/virtual-scroll-demo.html @@ -34,7 +34,34 @@

Random size

Fixed size

- + + Behavior + + Auto + Instant + Smooth + + + + Offset + + + + + Index + + + +

+ Currently scrolled to item: {{scrolledIndex}} +

+ +
Item #{{i}} - ({{size}}px) @@ -94,3 +121,45 @@

trackBy state name

{{state.capital}}
+ +

Use with <ol>

+ + +
    +
  1. + {{state.name}} - {{state.capital}} +
  2. +
+
+ +

Use with <ul>

+ + +
    +
  • + {{state.name}} - {{state.capital}} +
  • +
+
+ +

Use with <dl>

+ + +
+ +
{{state.name}}
+
{{state.capital}}
+
+
+
+ +

Use with <table>

+ + + + + + + +
{{state.name}}{{state.capital}}
+
diff --git a/src/demo-app/virtual-scroll/virtual-scroll-demo.scss b/src/demo-app/virtual-scroll/virtual-scroll-demo.scss index 58e9e1741b3c..0aa6a2a48e6f 100644 --- a/src/demo-app/virtual-scroll/virtual-scroll-demo.scss +++ b/src/demo-app/virtual-scroll/virtual-scroll-demo.scss @@ -37,3 +37,21 @@ .demo-capital { font-size: 14px; } + +.demo-dt { + height: 30px; + font-weight: bold; +} + +.demo-dd { + height: 30px; +} + +.demo-li, +.demo-td { + height: 50px; +} + +.demo-td { + border: 1px solid gray; +} diff --git a/src/demo-app/virtual-scroll/virtual-scroll-demo.ts b/src/demo-app/virtual-scroll/virtual-scroll-demo.ts index 8aff47670d97..7199a6e60202 100644 --- a/src/demo-app/virtual-scroll/virtual-scroll-demo.ts +++ b/src/demo-app/virtual-scroll/virtual-scroll-demo.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, ViewEncapsulation} from '@angular/core'; +import {ChangeDetectionStrategy, Component, ViewEncapsulation} from '@angular/core'; import {BehaviorSubject} from 'rxjs'; @@ -22,8 +22,13 @@ type State = { templateUrl: 'virtual-scroll-demo.html', styleUrls: ['virtual-scroll-demo.css'], encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, }) export class VirtualScrollDemo { + scrollToOffset = 0; + scrollToIndex = 0; + scrollToBehavior: ScrollBehavior = 'auto'; + scrolledIndex = 0; fixedSizeData = Array(10000).fill(50); increasingSizeData = Array(10000).fill(0).map((_, i) => (1 + Math.floor(i / 1000)) * 20); decreasingSizeData = Array(10000).fill(0) @@ -106,4 +111,8 @@ export class VirtualScrollDemo { return 0; })); } + + scrolled(index: number) { + this.scrolledIndex = index; + } } diff --git a/src/e2e-app/fullscreen/fullscreen-e2e.ts b/src/e2e-app/fullscreen/fullscreen-e2e.ts index a74d5fdc385f..900460e410e4 100644 --- a/src/e2e-app/fullscreen/fullscreen-e2e.ts +++ b/src/e2e-app/fullscreen/fullscreen-e2e.ts @@ -10,7 +10,7 @@ export class FullscreenE2E { dialogRef: MatDialogRef | null; - constructor (private _element: ElementRef, private _dialog: MatDialog) { } + constructor (private _element: ElementRef, private _dialog: MatDialog) { } openDialog() { this.dialogRef = this._dialog.open(TestDialogFullScreen); @@ -21,16 +21,16 @@ export class FullscreenE2E { } openFullscreen() { - let element = this._element.nativeElement.querySelector('#fullscreen-pane'); + let element = this._element.nativeElement.querySelector('#fullscreen-pane') as any; if (element.requestFullscreen) { element.requestFullscreen(); } else if (element.webkitRequestFullScreen) { element.webkitRequestFullScreen(); - } else if ((element as any).mozRequestFullScreen) { - (element as any).mozRequestFullScreen(); - } else if ((element as any).msRequestFullScreen) { - (element as any).msRequestFullScreen(); + } else if (element.mozRequestFullScreen) { + element.mozRequestFullScreen(); + } else if (element.msRequestFullScreen) { + element.msRequestFullScreen(); } } diff --git a/src/lib/autocomplete/autocomplete-trigger.ts b/src/lib/autocomplete/autocomplete-trigger.ts index f60c5ec8bb03..8092e96baa6a 100644 --- a/src/lib/autocomplete/autocomplete-trigger.ts +++ b/src/lib/autocomplete/autocomplete-trigger.ts @@ -103,7 +103,7 @@ export function getMatAutocompleteMissingPanelError(): Error { '[attr.aria-autocomplete]': 'autocompleteDisabled ? null : "list"', '[attr.aria-activedescendant]': 'activeOption?.id', '[attr.aria-expanded]': 'autocompleteDisabled ? null : panelOpen.toString()', - '[attr.aria-owns]': 'autocompleteDisabled ? null : autocomplete?.id', + '[attr.aria-owns]': '(autocompleteDisabled || !panelOpen) ? null : autocomplete?.id', // Note: we use `focusin`, as opposed to `focus`, in order to open the panel // a little earlier. This avoids issues where IE delays the focusing of the input. '(focusin)': '_handleFocus()', @@ -135,9 +135,28 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { /** Subscription to viewport size changes. */ private _viewportSubscription = Subscription.EMPTY; + /** + * Whether the autocomplete can open the next time it is focused. Used to prevent a focused, + * closed autocomplete from being reopened if the user switches to another browser tab and then + * comes back. + */ + private _canOpenOnNextFocus = true; + /** Stream of keyboard events that can close the panel. */ private readonly _closeKeyEventStream = new Subject(); + /** + * Event handler for when the window is blurred. Needs to be an + * arrow function in order to preserve the context. + */ + private _windowBlurHandler = () => { + // If the user blurred the window while the autocomplete is focused, it means that it'll be + // refocused when they come back. In this case we want to skip the first focus event, if the + // pane was closed, in order to avoid reopening it unintentionally. + this._canOpenOnNextFocus = + document.activeElement !== this._element.nativeElement || this.panelOpen; + } + /** `View -> model callback called when value changes` */ _onChange: (value: any) => void = () => {}; @@ -169,7 +188,7 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { this._autocompleteDisabled = coerceBooleanProperty(value); } - constructor(private _element: ElementRef, private _overlay: Overlay, + constructor(private _element: ElementRef, private _overlay: Overlay, private _viewContainerRef: ViewContainerRef, private _zone: NgZone, private _changeDetectorRef: ChangeDetectorRef, @@ -177,10 +196,21 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { @Optional() private _dir: Directionality, @Optional() @Host() private _formField: MatFormField, @Optional() @Inject(DOCUMENT) private _document: any, - // @deletion-target 7.0.0 Make `_viewportRuler` required. - private _viewportRuler?: ViewportRuler) {} + // @breaking-change 7.0.0 Make `_viewportRuler` required. + private _viewportRuler?: ViewportRuler) { + + if (typeof window !== 'undefined') { + _zone.runOutsideAngular(() => { + window.addEventListener('blur', this._windowBlurHandler); + }); + } + } ngOnDestroy() { + if (typeof window !== 'undefined') { + window.removeEventListener('blur', this._windowBlurHandler); + } + this._viewportSubscription.unsubscribe(); this._componentDestroyed = true; this._destroyPanel(); @@ -375,7 +405,9 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { } _handleFocus(): void { - if (this._canOpen()) { + if (!this._canOpenOnNextFocus) { + this._canOpenOnNextFocus = true; + } else if (this._canOpen()) { this._previousValue = this._element.nativeElement.value; this._attachOverlay(); this._floatLabel(true); @@ -609,8 +641,7 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy { /** Determines whether the panel can be opened. */ private _canOpen(): boolean { - const element: HTMLInputElement = this._element.nativeElement; + const element = this._element.nativeElement; return !element.readOnly && !element.disabled && !this._autocompleteDisabled; } - } diff --git a/src/lib/autocomplete/autocomplete.spec.ts b/src/lib/autocomplete/autocomplete.spec.ts index adca356ce05c..395d29712e0d 100644 --- a/src/lib/autocomplete/autocomplete.spec.ts +++ b/src/lib/autocomplete/autocomplete.spec.ts @@ -1329,7 +1329,16 @@ describe('MatAutocomplete', () => { const panel = fixture.debugElement.query(By.css('.mat-autocomplete-panel')).nativeElement; expect(input.getAttribute('aria-owns')) - .toEqual(panel.getAttribute('id'), 'Expected aria-owns to match attached autocomplete.'); + .toBe(panel.getAttribute('id'), 'Expected aria-owns to match attached autocomplete.'); + }); + + it('should not set aria-owns while the autocomplete is closed', () => { + expect(input.getAttribute('aria-owns')).toBeFalsy(); + + fixture.componentInstance.trigger.openPanel(); + fixture.detectChanges(); + + expect(input.getAttribute('aria-owns')).toBeTruthy(); }); it('should restore focus to the input when clicking to select a value', fakeAsync(() => { @@ -1952,6 +1961,36 @@ describe('MatAutocomplete', () => { expect(Math.ceil(parseFloat(overlayPane.style.width as string))).toBe(500); }); + it('should not reopen a closed autocomplete when returning to a blurred tab', () => { + const fixture = createComponent(SimpleAutocomplete); + fixture.detectChanges(); + + const trigger = fixture.componentInstance.trigger; + const input = fixture.debugElement.query(By.css('input')).nativeElement; + + input.focus(); + fixture.detectChanges(); + + expect(trigger.panelOpen).toBe(true, 'Expected panel to be open.'); + + trigger.closePanel(); + fixture.detectChanges(); + + expect(trigger.panelOpen).toBe(false, 'Expected panel to be closed.'); + + // Simulate the user going to a different tab. + dispatchFakeEvent(window, 'blur'); + input.blur(); + fixture.detectChanges(); + + // Simulate the user coming back. + dispatchFakeEvent(window, 'focus'); + input.focus(); + fixture.detectChanges(); + + expect(trigger.panelOpen).toBe(false, 'Expected panel to remain closed.'); + }); + it('should update the panel width if the window is resized', fakeAsync(() => { const widthFixture = createComponent(SimpleAutocomplete); diff --git a/src/lib/autocomplete/autocomplete.ts b/src/lib/autocomplete/autocomplete.ts index fb79a51face1..33344115a7c9 100644 --- a/src/lib/autocomplete/autocomplete.ts +++ b/src/lib/autocomplete/autocomplete.ts @@ -160,7 +160,7 @@ export class MatAutocomplete extends _MatAutocompleteMixinBase implements AfterC constructor( private _changeDetectorRef: ChangeDetectorRef, - private _elementRef: ElementRef, + private _elementRef: ElementRef, @Inject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS) defaults: MatAutocompleteDefaultOptions) { super(); diff --git a/src/lib/badge/badge.spec.ts b/src/lib/badge/badge.spec.ts index e1f7e70f20b1..ff1ea263ab71 100644 --- a/src/lib/badge/badge.spec.ts +++ b/src/lib/badge/badge.spec.ts @@ -1,5 +1,5 @@ import {ComponentFixture, TestBed, fakeAsync} from '@angular/core/testing'; -import {Component, DebugElement} from '@angular/core'; +import {Component, DebugElement, ViewEncapsulation} from '@angular/core'; import {By} from '@angular/platform-browser'; import {MatBadge, MatBadgeModule} from './index'; import {ThemePalette} from '@angular/material/core'; @@ -114,10 +114,53 @@ describe('MatBadge', () => { expect(badgeContent.getAttribute('aria-describedby')).toBeFalsy(); }); + it('should toggle visibility based on whether the badge has content', () => { + const classList = badgeNativeElement.classList; + + expect(classList.contains('mat-badge-hidden')).toBe(false); + + testComponent.badgeContent = ''; + fixture.detectChanges(); + + expect(classList.contains('mat-badge-hidden')).toBe(true); + + testComponent.badgeContent = 'hello'; + fixture.detectChanges(); + + expect(classList.contains('mat-badge-hidden')).toBe(false); + + testComponent.badgeContent = ' '; + fixture.detectChanges(); + + expect(classList.contains('mat-badge-hidden')).toBe(true); + + testComponent.badgeContent = 0; + fixture.detectChanges(); + + expect(classList.contains('mat-badge-hidden')).toBe(false); + }); + + it('should apply view encapsulation on create badge content', () => { + const badge = badgeNativeElement.querySelector('.mat-badge-content')!; + let encapsulationAttr: Attr | undefined; + + for (let i = 0; i < badge.attributes.length; i++) { + if (badge.attributes[i].name.startsWith('_ngcontent-')) { + encapsulationAttr = badge.attributes[i]; + break; + } + } + + expect(encapsulationAttr).toBeTruthy(); + }); + }); /** Test component that contains a MatBadge. */ @Component({ + // Explicitly set the view encapsulation since we have a test that checks for it. + encapsulation: ViewEncapsulation.Emulated, + styles: ['span { color: hotpink; }'], template: ` { }) class BadgeTestApp { badgeColor: ThemePalette; - badgeContent = '1'; + badgeContent: string | number = '1'; badgeDirection = 'above after'; badgeHidden = false; badgeSize = 'medium'; diff --git a/src/lib/badge/badge.ts b/src/lib/badge/badge.ts index 25f42d5c4dfc..3d761e27b19d 100644 --- a/src/lib/badge/badge.ts +++ b/src/lib/badge/badge.ts @@ -9,7 +9,16 @@ import {AriaDescriber} from '@angular/cdk/a11y'; import {coerceBooleanProperty} from '@angular/cdk/coercion'; import {DOCUMENT} from '@angular/common'; -import {Directive, ElementRef, Inject, Input, NgZone, OnDestroy, Optional} from '@angular/core'; +import { + Directive, + ElementRef, + Inject, + Input, + NgZone, + OnDestroy, + Optional, + Renderer2, +} from '@angular/core'; import {ThemePalette} from '@angular/material/core'; @@ -31,10 +40,12 @@ export type MatBadgeSize = 'small' | 'medium' | 'large'; '[class.mat-badge-small]': 'size === "small"', '[class.mat-badge-medium]': 'size === "medium"', '[class.mat-badge-large]': 'size === "large"', - '[class.mat-badge-hidden]': 'hidden', + '[class.mat-badge-hidden]': 'hidden || !_hasContent', }, }) export class MatBadge implements OnDestroy { + /** Whether the badge has any content. */ + _hasContent = false; /** The color of the badge. Can be `primary`, `accent`, or `warn`. */ @Input('matBadgeColor') @@ -62,8 +73,9 @@ export class MatBadge implements OnDestroy { /** The content for the badge */ @Input('matBadge') get content(): string { return this._content; } - set content(val: string) { - this._content = val; + set content(value: string) { + this._content = value; + this._hasContent = value != null && `${value}`.trim().length > 0; this._updateTextContent(); } private _content: string; @@ -98,8 +110,10 @@ export class MatBadge implements OnDestroy { constructor( @Optional() @Inject(DOCUMENT) private _document: any, private _ngZone: NgZone, - private _elementRef: ElementRef, - private _ariaDescriber: AriaDescriber) {} + private _elementRef: ElementRef, + private _ariaDescriber: AriaDescriber, + /** @breaking-change 8.0.0 Make _renderer a required param and remove _document. */ + private _renderer?: Renderer2) {} /** Whether the badge is above the host or not */ isAbove(): boolean { @@ -129,7 +143,9 @@ export class MatBadge implements OnDestroy { /** Creates the badge element */ private _createBadgeElement(): HTMLElement { - const badgeElement = this._document.createElement('span'); + // @breaking-change 8.0.0 Remove null check for _renderer + const rootNode = this._renderer || this._document; + const badgeElement = rootNode.createElement('span'); const activeClass = 'mat-badge-active'; badgeElement.setAttribute('id', `mat-badge-content-${this._id}`); diff --git a/src/lib/bottom-sheet/bottom-sheet-container.ts b/src/lib/bottom-sheet/bottom-sheet-container.ts index 0a2c41ffb890..e878b07f8569 100644 --- a/src/lib/bottom-sheet/bottom-sheet-container.ts +++ b/src/lib/bottom-sheet/bottom-sheet-container.ts @@ -84,7 +84,7 @@ export class MatBottomSheetContainer extends BasePortalOutlet implements OnDestr private _destroyed: boolean; constructor( - private _elementRef: ElementRef, + private _elementRef: ElementRef, private _changeDetectorRef: ChangeDetectorRef, private _focusTrapFactory: FocusTrapFactory, breakpointObserver: BreakpointObserver, diff --git a/src/lib/button-toggle/button-toggle.html b/src/lib/button-toggle/button-toggle.html index b0ddfb90e4c2..400550c5bbdc 100644 --- a/src/lib/button-toggle/button-toggle.html +++ b/src/lib/button-toggle/button-toggle.html @@ -1,6 +1,7 @@