From f80638c2cbc079b796132945b6edcee3a2898195 Mon Sep 17 00:00:00 2001 From: John Leider Date: Mon, 12 Feb 2018 21:44:23 -0500 Subject: [PATCH] v1.0 (#3263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test(v-select): fixed v-select comparator test * revert(layout): partial revert of app logic the **fixed** prop can now be overwritten if **absolute** is used * fix(v-list-tile-action): fixed alignment of selection-controls fixes #2684 * fixed v-select test * fix(detachable): fixed pug bug when pug declares a boolean prop that is not bound, it is inferred to be **prop="prop"** * fix(toolbar): fixed scroll threshold * fix(v-list): remove ability to select icons in list tiles * fix: fixed bug where drawer would close on any touch event * fix(v-toolbar): allow dynamic changing of **scroll-off-screen** * feat(routable): allow object for **ripple** prop * [release] 1.0.0-alpha.2 * Update BACKERS.md * enh: add possibility to define previous/next date icons in pickers (#2709) * enh: add possibility to define previous/next date icons in pickers fixes #2123 * changed prop names * fix(Vicon): merge custom inline styles Fixes #2764 * chore: convert release script to js, add PR template * chore: add repository link to package.json * chore: tidy up release script * fix(v-progress-linear): fixed active/inactive animation * fix(v-alert): close icon now inherits color when using the **outline** prop, the dismiss icon was not being properly styled fixes #2762 * fix(menuable): removed margin, added functionality to parse margin fixes #2760 * fix(v-jumbotron): added width 100% to image when `v-carousel-item` was updated to use the new `v-jumbotron` component, it was not taken into account that the previous functionality used a background image that covered fixes #2751 * fix(v-list): fixed spacing in mini drawer when using a `v-list` inside of a `v-navigation-drawer` with the **mini-variant** prop, the `v-list-group`'s icon was not being properly aligned fixes #2746 * fix(maskable): will now mask a value on mount if a value is provided and the **return-masked-value** prop is used, should emit the masked value if it differs from the provided one fixes #2722 * fix(v-list): fixed list display issue caused by a45089a6c646811a7fd08a6df66eb2f2e6d01a83 * fix(selection-controls): removed pointer events when disabled fixes #2670 * ci(travis): fixed build process error yarn 1.0 does not add itself to PATH, switching to npm global install for codecov * fix: application not updating top on screen resize (#2782) fixes #2781 * [release] 1.0.0-alpha.3 * refactor(helper classes): added missing !important declaration to helper classes * fix(v-toolbar): fixed a bug where scrolling to top would bring back a manual-scrolled toolbar * refactor(layout): changed how ssr bootable works (#2799) * refactor(layout): changed how ssr bootable works moved all logic to mixin, apply dataset value for boot status, hide until booted to avoid entry animation or pre-emptive popin * Use existing theme stylesheet if it exists * reverted back to transition based booting, changed beforeMount to created in * fixed lint * added back ssr timeout, updated snapshots * Pagination separation (#2790) * Move v-data-table pagination outside of overflow so it's always visible * Border fixes * Make pagination controls wrap nicely on mobile * fix(text-field): fixed bad styles causing issues text-field was setting a different transition time for its prepend-icon, also fixed a 1px offset of placeholder and input text * feat(select/text-field): added new functionality, **solo-inverted** produces a lower opacity background and inverts color on focus, similar to Google Keep/Contacts * fix(v-select): fixed event call on empty value when blurring * chore: bumped dependencies * fix(v-bottom-nav): fixed `v-btn` not being highlighted wrong method was being called in the **active** watcher causing an error. set default **height** value to 56 to match spec, fixed styling issue on IE11 when positioning and hover issue on all browsers fixes #2801 * fix(tests): all tests were failing after latest dependency bump (#2817) seems like using tilde as an alias prefix is broken. switched it out to @ instead * test(v-form): increased coverage * test(v-icon): increased coverage * fix(directives): fixed a memory leak the created object to hold the callback information was not being removed during unbind fixes #2779 * refactor(resize/scroll): updated directive interface can now declare `v-resize:1000="callback"` or `v-resize:200.quiet="callback"` for resize. can now declare `v-scroll="{ value: callback, options: { passive: false }}` * fix(text-field/select): set **input** to 100% width on small devices, there are situations where the input would force an overflow because inputs have some unchangable default width * support font awesome 5 icons * test: increased test coverage for mask/maskable/VTextField (#2851) * fix(date-picker): incorrect button styles active and current dates (and months) in date-picker had incorrect styles fixes #2812 * fix(date-picker): allow external switching between date and month view switching between date and month view using type prop was not working closes #2809 * improve code (#2842) * Applies a dark tint to the content. get primary text color theme dark (#2854) * fix(v-toolbar): corrected directive arguments * No style size on VIcon by default (#2846) * tests for no style size by default * fix(VIcon): Don't set default size in style attribute fixes #2845 * Refactor, per johnleider's comments on the pull request * Use spread operator in case data.style is not defined * Remove semicolon * Update test verbiage * fix(v-chip): updated for spec icon was improperly sized and not working properly in different themes" * fix(v-pagination): removed overflow-x hide overflow was added a long time ago but is no longer needed * Update PULL_REQUEST_TEMPLATE.md * Update BACKERS.md * fix(v-select): fixed menu positioning when filtering when filtering items, dimensions were updated by the pageYOffset was not, this caused repositioning issues when the `v-select` menu was scrolled into overflow and then filtered * chore: fixed postcss warnings on build * chore: added name to mixins * chore: fixed postcss warnings on dev as well * fix: added Colorable mixin to VAvatar this was done so that vuetify-helper-json will know that VAvatar uses Colorable even though it's a functional component * fix: removed unnecessary prop `color` prop is defined in COlorable mixin * fix(v-stepper-content): height not being set to auto `v-stepper-content` should change its height to 'auto' after it is expanded. this was not happening for the intial render fixes #2870 * introduce new variable -text-transform and use it in tab (#2858) * chore: enable performance reporting for development * fix(VNavigationDrawer): only close on route change when mobile/temporary fixes #2894 * fix: add missing boolean operator * refactor(v-tabs): refactored `v-tabs` functionality (#2838) * refactor(v-tabs): refactored `v-tabs` functionality * tweaks for various breakpoints and usages, removed need for registering tabs-bar, fixed test * fixed overflow issues with dynamic tabs v-tabs-slider will now re-evaluate when the tab items change, moved evaluation in tabClick to items as they will always be present * updated logic on mount for v-tabs * cleaned up swipe method * improved test coverage * tweaks to resolve #2756 * refactor(v-tabs): simplified logic, added tests adjusted the logic to make `v-tabs` only care about the active index. this allows us to update the model when using `router-link` and drastically simplifies reasoning about the code. added more tests * added tabs-bar test * fix for #1900 * enhancement for #1516 * added back tabs prop, sets extension height to match default tabs height * added conditional to prevent default * started abstracting funtionality * refactored the refactor * started test rewrite due to refactor (again) * added more tests * added more tests * finished unit tests for tabs mixins * style tweaks, removed margin from css selectors, switched to padding on container * added tabs-items generation if none present and has v-tab-item's, added tests * finished coverage for * expanded coverage on * updated tests * fix(perf): directly set scroll offset instead of through the render fn This prevents the component from having to re-render on every touch event - also set will-change on touch start * fix: missing position relative on .tabs__container * Only apply theme to the tabs container * fix: removed duplicated styles * feat: right aligned tabs * fix: callSlider on fixedTabs/centered/right props change * fix: look for active tab in current component instead of all document * fix: use activeClass instead of 'tabs__item--active' * fix: use px width instead of % for slider * fix: ignore pointer events for disabled prepend/append icon * fix: call slider on mount * Add another wrapper element for arrow backgrounds - Breaks scrolling and arrow states -_- * fix: use bar for overflow calculation * fix: use bar width to determine append icon visibility * fix: callSlider on alignWithTitle change * fix: proper scroll offset when scrolling tabs to the left * fix: proper scroll offset when scrolling tabs to the left (2) * rounded out tests, added arrows display on desktop if overflowing * improved rendering performance * refactor: css tweaks flattens css structure globally unsets pointer events for disabled icons * lint * Use contain instead of will-change * Move transform back into the watcher * fix: moved container styles from js to .styl * fix: missing position:relative for tabs bar * fix: arrows didn't work properly after resizing window * fix(perf): move /(ap|pre)pendIconVisible/ from computed to a watcher * fixed **align-with-title** prop * move selected item into view * fixed a bug where could not be an object * fix: allow omitting href/to/id props * fixed tests * fix(v-tabs): enforce model as string * fix(v-tabs-items): fixed model sharing * fix(VTabs): use new value as an index if tab action isn't found * fix(v-tabs): fixed-tabs needed the container to grow **fixed-tabs** should be centered on desktop, but the container was not growing * fix(v-tabs): added flex-grow to centered tabs * feat(v-tabs/v-tabs-items): allow **value** to accept Number's * fix: do not apply ripple on disabled routable (#2899) * [release] 1.0.0-beta.1 * fix: fixed right aligned tabs * fix: flex-grow for tabs_container * fix: move stylus with side-effects from tools to generic tools are imported in every component file, causing duplicated css * fix: remove old tooltip import from app.styl doesn't need to imported if we aren't using tooltips * fix(v-jumbotron): fixed improperly styled images change introduced in 77dbf9f44c0745167c5e37d80ebc3d1903c7bcf9 to fix #2751 didn't take into account that images might overflow, and that's okay. changing to **min-width** * chore: update lockfiles This was omitted in 130bcb3d * fix: ripple prop as an object is passed as a bool to ripple directive broken by ec9fcae39d982eddb0b51f866684eb85682c8ba8 * fix(v-tabs): fixed error when using routes and tabs Due to how `router-links` treat the **to** prop as an object, the component will be re-rendered with the resolved route path from the designated name. this causes weird issues with our current setup, the easiest solution was to add a conditional (that should of probably been there anyways) fixes #2921 * fix(v-lists): fixed improper hover style corrected the value of a hovered list link fixes #2914 * fix(routable): added default to **exact** prop in prior versions of vue, Boolean declared properties had a default value of undefined. This changed, so the logic needs to as well. the only reason the tests did not break is because it was defining undefined, which was overriding the new default value used by vue, _false_. fixes #2485 * fix(v-toolbar): toolbar was applying incorrect application top manual-scroll overrides everything, should update application top to 0 * chore: Remove HTML comments from jest snapshots * fix(ssr): use requestAnimationFrame for bootable instead of setTimeout - also swapped .content and .content--wrap to prevent the animation * fix(display-helpers): added !important to property declaration all helper classes are considered **trumps** in terms of ITCSS, which means they should always overwrite * enh: unified console messages (#2920) * enh: console warn when data-iterator item missed the key attr * enh: unified console warn/error messages * typo * missing file * tests * refactor: removes unused pointerSupport util (#2917) * refactor: removes unused pointerSupport util * removed from type definition * fix(v-speed-dial): renamed hover prop to open-on-hover (#2903) * fix(v-speed-dial): renamed hover prop to open-on-hover done to match similar prop in v-menu * test: forgot to push test change * fix(menu): clean up from the multiple renames in #2716 The absolute prop already existed, and some of its functionality was inadvertently broken fixes #1989 * fix(v-select): removed top and bottom padding for **chips** prop padding caused input size to jump once a selection was made. this is an unintended side effect and will now better match what is visible within the spec * [release] 1.0.0-beta.2 * fix(v-tab): moved text specific styling to parent the wrapping _.tab__item_ wrapper was inheriting applied classes, making it difficult to change text styling fixes #2909 * fix(v-icon): fixed render statement length for lint refactored render logic to reduce the number of statements. decided to also reorganize method so that it is a bit more clear what is going on. re-ordered classes in a more logic fashion, `fa icon fa-lock` becomes `icon fa fa-lock` for example. * fix(v-progress-circular): removed unused prop fill * refactor(data-iterable): improved filter default fn * refactor: replace prop dupes with mixins (#2902) * feat(v-badge): refactored to use existing mixins * refactor: switched applicationable to use positionable mixin * refactor: switched speed-dial to use transitionable mixin * refactor: switched expansion-panel-content to use rippleable mixin * refactor: optimized filterObjectOnKeys * fixes #2791, VSelect input loses focus after chip is removed (#2944) * Enh/foreach optimizations (#2738) * refactor: v-for forEach optimization * refactor: v-grid forEach optimization * refactor: v-list forEach optimization * refactor: select-generators forEach optimization * refactor: ripple forEach optimization * refactor: validatable forEach optimization * refactor: v-carousel forEach optimization * refactor: v-expansion-panel forEach optimizations * refactor: data-iterable forEach optimization * refactor: v-radio-group forEach optimizations * refactor: Vuetify.install forEach optimizations * refactor: click-outside forEach optimization * refactor: breadcrumbs forEach optimization * refactor: v-tabs forEach optimizations * refactor: v-stepper forEach optimizations * refactor: button-group forEach optimization * refactor: touch forEach optimizations * refactor: v-select push optimization * refactor: reverse loops * beating codebeat * removed unnecessary code from button-group * refactor: change for..of to faster alternatives babel's for..of is extremaly slow addition to #2738 * cleanup(v-btn): contextual props are not used any more * test: increased VSwitch coverage * fix: replaced throw with consoleError * pickers refactoring (#2664) * v-picker * v-time-picker-clock * v-time-picker-title * v-date-picker-title * v-date-picker-header * v-date-picker-years * v-date-picker-date-table, v-date-picker-month-table * v-time-picker * v-date-picker * misc, cleanup * test: touch usage in pickers * added transition prop to v-picker * fixes, codebeat improvements * fixes, codebeat improvements * fixes, codebeat improvements * codebeat improvements * fixed picker title background in dark mode * code style update * ampm computed prop * even more refactoring (picker-button mixin) * fixed test * fix(date-picker): incorrect button styles active and current dates (and months) in date-picker had incorrect styles fixes #2812 (cherry picked from commit 2e9d6af4fabaee724c112837f8cc224bd53939ea) * fix(date-picker): allow external switching between date and month view switching between date and month view using type prop was not working closes #2809 (cherry picked from commit d6935aa52a35d0b02b247efb8214d9de0fcf4ed4) * fix: do not pad hours with 0 in am/pm mode * fix: time picker clock size * fix: time picker title colon size in landscape mode * fix: time picker active & disabled button text color * fix: do not emit input if hour/minute is not allowed * fix: restored firstAllowed * cleanup(v-icon): contextual props are not used any more * refactor: switched snackbar to use positionable mixin * feat(stylus colors): allow redefinition fixes #2155 * enh(VNavigationDrawer): re-initialise value when set to null * fix (v-time-picker): computing firstAllowed hour in am/pm mode * v-select with combobox option uses search value when blurring (#2879) * Rename findExistingItem to findExistingIndex Said function doesn't return an item, but rather the index of that item within the items array. The name findExistingIndex reflects better what the function actually does. * fix: v-select with combobox option uses searchValue when blurring When using v-select with the combobox option and items as objects (not just primitives), and you select an option and then blur the field, the itemValue becomes the text value of the selected item object. fixes #2878 * Split comment into two lines * Store the result of this.getValue(val) in a variable This prevents it from beiing re-evaluated for every find iteration. * Add darken/lighten variations to theme colors (#2872) * feat(theme): add darken/lighten variations to theme colors + auto text * Remove automatic text color It was too ambitious for the timeframe, can revisit at some future time * Allow the user to minify or cache the theme stylesheet * Update VApp snapshots * refactor: use consoleWarn instead of throwing a rangeError * style: remove semicolon * enh: allow any type of element in v-tabs * feat(v-date-picker): improved animations fixed text alignment to match spec in title, changed animation for changing date and date/month/year view. removed shadow for active month * enh(v-date-picker): **showCurrent** prop to hide current date selection * feature: date picker events (#2946) fixes #2672 * fix(v-date-picker): fixed prop definition issue with merge, fixing missing `current` definition on `v-date-picker-date-table` generation * feat(VSelect): allow the use of custom list tiles in items slot (#2710) * Added support of custom v-list-tile as select item * Added support of custom v-list-tile as select item * Fix: needTile -> needsTile * Update: change .test() to comparison operator * Test: add 3 test cases * Fix VSelect test snapshot * test: update snapshots * enhancement: changes the way of passing color to colorable mixin (#2953) Currently the colorable mixin takes the name of the prop/computed to get the color. This is not enough if the color is more dynamic, for example planned events in date picker could potentially use different colors for different event * enh (v-date-picker): setting different color for each event * chore: updated PR template * fix(v-date-picker): adjusted styles and markup (#2966) * fix(v-date-picker): adjusted styles and markup removed unused class string from button generation. adjusted content tag to match what is output by `v-btn` normally. added conditional for class generation type, **outline** uses **addTextColorClasses** normally within `v-btn`, fixed bug where on some browsers the text inside of the generated button would not be vertically center * style(v-date-picker-date-table): updated doc block * fix: updated current month styles * fix: update btn__content tag in month picker, updated snapshots * fix: line-height moved from picker to picker-title This change centers the text in the calendar buttons * refactor(v-date-picker): reverted back to fade-transition removed **out-in** prop and added proper absolute positioning on exit * fix: eventColor prop definition * fix(v-avatar): removed class overwrite class was being explicitly set in the render fn, updated logic to allow for bound class declaration * Update README.md * fix(v-expansion-panel): add max-width to resolve overflow issues (#2975) * fix: Avoid high CPU usage in Safari (#2958) * fix: Avoid high CPU usage in Safari A v-navigation-drawer with the app param causes Safari to repeatedly invalidate and recalculate the layout, permanently consuming a CPU core. This is a bug in Safari (fixed in current tech preview) which is triggered by the combination of using calc in the max-height, transition-property including max-height and the element being created using document.createElement (as vue does). fixes #2773 * style: Add comment explaining need for work around https://github.com/vuetifyjs/vuetify/pull/2958 * renamed variable in v-date-picker-date-table to match v-date-picker-month-table * fix (v-date-picker): invalid color of selected disabled date * lint * refactor (v-date-picker): extracted common code to mixin * fix: picker title transition for month picker * fix(v-tabs): moved css property text-decoration was being applied to the tabs item anchor * feature: readonly date picker (#2974) * feature: readonly date picker * fix: disabled date picker header * fixes disabled selected day color shows selected day/month as disabled in readonly picker renamed var * fix (v-date-picker): removed shadow from selected date * removed unused comuted props * Fix for pixel gap between and after menu and scrollbar (#2977) * Round to nearest pixel when measuring for menuables, prevents odd pixel gaps with subpixel values. * Test to ensure bounded client rect is rounded. * #2841 remove occurences of "all" property in data-iterable mixin (#2972) * #2841 remove occurences of "all" property in data-iterable mixin as it duplicates"everyItem" * #2841 add tests for usage of 'everyItem' * [release] 1.0.0-beta.3 * fix(directives): fixed memory leak (#2997) * fix(directives): fixed memory leak resize and click-outside were storing references to the vnode context that was being passed, this was not properly being GCed * fixed drawer test * removed comment * refactor(v-app): added resize debounce debounce removed from `v-resize` due to memory leak, replicating functionality in component * [release] 1.0.0-beta.4 * fix: typo in prop definition * (WIP) goTo() function to smooth scroll to the given location (#2913) * $vuetify.goTo(digit) smooth scrolls to that offset * add goTo to the $vuetify type definition * fix type definition * Add goTo('#anchor') support & error messages * Switch to vuetify console methods * Update index.d.ts * Update index.d.ts * Moved to /util * Style fixes * Duration is now an argument with a default value * Switch to querySelector(target) * Add goTo(Element) support This allows passing refs as target * Add Duration type check and error message * test(VMenu): improve rounded dimensions test see #2977 * fix: all color names are now lowercase * refactor pre-commit checks (#3003) * refactor pre-commit checks - removed package-lock.json and added a warning if yarn isn't used - removed .env from the repo, you should copy .env.example instead - removed prepush hook, there's no reason to run tests twice - lint commit messages to prevent common mistakes - remove -i from jest, I don't think that cache bug exists any more - freeze the lockfile in travis, so the build will fail if it isn't updated * update commit message linter * Bugfix - ReferenceError: isMaskDelimiter is not defined (#3006) Fixes ReferenceError: isMaskDelimiter is not defined. (#2998) * update dependencies * fix(theme): warn when invalid strings are used + add more formats - can now use 3-digit hex strings, with optional hash fixes #2995 * remove comment * fix(v-select): corrected search comparison when using an object for the **items** prop, it was possible to activate the menu by simply tabbing to the `v-select` component. wrong comparison value was being used, **getValue**, which always worked for primitives and masked the issue for objects fixes #2754 * fix(v-scroll): check if property exists before destructuring during development, hot reload would call the unbind hook when rebuilding elements using `v-scroll`. This was throwing an error if it had already been removed * fix(v-btn): fixed absent click event with using router * fix(v-jumbotron): added missing transition * chore(dev): run tests in-band on windows makes tests take 5x longer, but prevents cache conflicts * fix(v-navigation-drawer): adjusted logic for route watcher for SPA applications, the route resolves as the base before it changes to the current path * Add noResize prop to v-text-field (#2994) * refactor(v-data-table): changed the default alignment of headers right alignment is usually for numbers, the problem is, with right align default, tables end up looking bad if the user has no specified alignment * fix(v-data-table): adjustment for implicit alignment * fix(click-outside): adjusted logic for determining click-outside state (#3034) fixes #3021 * fix(color-utils): refactored **intToHex** function .padStart, while covered under babel-polyfill, is still not fully supported on very recent browser versions fixes #3042 * refactor(color-utils): changed approach of refactor for #3042 * fix: padStart polyfill implementation bug >>> results in a long loop when negative length is provided * feat(v-data-table): no-data and no-results slots can take custom tr/tds (#2952) using the same logic as in the items slot, no-data and no-results slots can now define their own tr and/or td tags. fixes #2504 * fix/2996 btn toggle props (#3004) * fix: bug when using color/class props on v-btn in v-btn-toggle switched from directly manipulating button classes to changing data fixes #2996 * test: added extra test * fix: selected date button is invisible with color prop applied * feat: min/max props for date/time picker (#3029) * feat (v-date-picker): **min** and **max** props fixes #2991 * feat (v-time-picker): **min** and **max** props * small fixes * refacotr (v-time-picker): allowed* accepts now only functions And removes the isAllowedValue util * refactor: extracted isDateAllowed function to util * feat: pickerDate.sync prop (#3019) fixes #3008 * feat: **width** and **full-width** props for pickers (#3001) * feat: **width** prop for pickers * cleanup and fixes * fix: update styles to match material specs * fix: time picker clock tweaks * feat (v-picker): **full-width** prop * fix (v-date-picker): current month was not outlined * fix (v-date-picker): month button size * fix: wrong landscape picker size in edge, cleanups * refactor: abstract picker save/cancel functionality (#2955) * refactor: remove save/cancel from date/time pickers * feat: returnable (temporary name...) mixin Save/cancel functionality abstracted from date/time pickers closes #2945 * refactor (v-edit-dialog): added returnable mixing * fix: hide slider when hideSlider is true (#3014) fixes #2949 * fix (v-date-picker): event dot position * fix (v-date-picker): showCurrent prop not working in month picker * Update README.md * Update BACKERS.md * fix: expansion-panel can't find nested content (#3040) expansion-panel only looked for expansion-panel-content in direct children. moved to use registrable mixin instead. fixes #2617 * beta.5 pickers tweaks * fix (v-date-picker): picker dimensions * fix (v-date-picker): update pickerDate on mount * use eslint-config-standard (#3018) * use eslint-config-standard * non-strict truth check on header.sortable * fix logic for "btn--depressed" * remove unused eslint plugins * refactor: simplify validation hint condition * fix(dialog): partial revert reverted line 176 back to original logic * refactor(pickers): fixed lint * refactor(goTo): moved back to prototype when you're wrong, you're wrong! this functionality feels awkward having to manually import * chore: updated webpack-dev-server * fix(babelrc): transform harmony exports (#3054) There is no export syntax in ES5, thus `export default` makes the artifact non-importable. CommonJS has become the defacto and this is the correct way to get imports working. * fix (v-date-picker): picker body doesnt't show in IE11 (#3064) * fix(v-chip): fixed focus styles in ie11 psuedo element was not properly positioned and overflowing in IE11 * fix (v-tabs): right aligned tabs were centered (#3067) fixes #3061 * fix: make input error full width (#3077) fixes a bug when using validation rules with persistent-hint * fix(VTextField): only use valid domProps (#3078) fixes #3072 * Fixed stylus path for es5/index.js (#3002) * [release] 1.0.0-beta.5 * fix icons in IE11 with Compatibility View enabled (#3025) * Fix snackbar animation and refactor (#2769) * Fix snackbar animation and refactor * Add snackbar queue support * Revert "Add snackbar queue support" This reverts commit 76ca77c1fcec0ae3907b08f1011ba0d9d830d756. * remove message and action props * refactor: DRY up transition styles * fix: increase button touch target size * feat: add options to $vuetify.goTo (#3073) * refactor($vuetify.goTo) * rename easeFunction -> easing * allow custom easing function, separate predefined patterns * update type definition * fix(types): make options optional * fix: stepper style bleed (#3096) stepper specific btn margins were bleeding into other components. limited it to direct children of stepper__content closes #3094 * fix: generate row in data-table no-data slot (#3106) * fix: generate row in data-table no-data slot make sure to generate tr/td for no-data slot when needed closes #3088 * refactor: cleaned up code, re-added text-xs-center * fix: stopped dialog activator event propagation (#3105) dialog activator should not propagate click event closes #2942 * fix (v-time-picker): allow null value (#3109) * fix (v-time-picker): allow null value fixes #2616 * fixed codebeat issue * fix: allow change of period when value is null * changed colors * removed inputHour and inputMinute watchers * cleanup * Fix ripple directive binding issues (#3130) * Fix ripple directive binding issues Unbind was incorrect, it did not remove the registered event handlers. Update did not update the value used by the event handler, so a checkbox that is initially disabled would have an event handler without the center: true option, and enabling the checkbox would cause the ripple to appear at the mouse pointer's location. Fixes #2677 * Refactor ripple directive Use global event handlers and store data on the element instead of using anonymous functions as event handlers. Don't add event handlers when ripple is disabled. Hide the ripple if it is disabled while it is shown; otherwise ripple would remain visible. Update tests and add test for #2677. Refs #2677 * fix table colspan with table-layout:fixed (#3129) * fix issue with colspan=100% when table has table-layout:fixed * fix test snapshot for VDataTable component * Revert "fix test snapshot for VDataTable component" This reverts commit a69256a741fe4149c7d6761032d3243be1edba2f. * fix test snapshot for VDataTable component * remove unused props & account for select-all column * fix: check if selectAll is false * Fix/#2802 footer auto height (#3104) * fix(v-footer): added support for auto height fixes #2802 * fix(v-footer): added support for 'auto' height fixes #2802 * updated logic for footer update * updated logic to allow for values like 100% and 50vh * removed validator * fix: append/prepend icon position for switch and checkbox (#2483) fixes #2418 * fix: allow to override the elevation’s Stylus variables (#3098) (cherry picked from commit 48a2a1abeb5c52b6d78d21a5010795957734d793) * revert(.babelrc): partial revert of #3054 was causing too many unsolvable issues in different environments, partially reverting until more info from #3112 * Fix/2791 v select focus (#3075) * fixes #2791, VSelect input loses focus after chip is removed * fixes 2791 - after keeping focus select drops user input * remove semicolon * fix test and remove unecessary line * fix space-before-blocks linting error * adding tests * fixing deletable chip test * fix(v-btn): fixed fab styles in ie11 (#3127) * fix(v-btn): fixed fab styles in ie11 fixed a bug where the fab styles were not proper on i11. also fixed a bug where btns would shift when clicked in ie11 fixes #3068 * remove redundant height declaration and fixed ie11 bug * fixed size variants in ie11 * adjusted logic to only set width when necessary * fixed bug with content highlight v-toolbar-items * final tweak for ie11 * fix(v-select): fixed select keyboard functionality (#3134) when selecting with left and right, should always hide and remove input from updating the searchValue fixes #3069 * fix(v-tab): changed how active link is derived (#3126) the current logic was very hacky and caused issues when building static sites, such as with nuxt fixes #3010 * fix(bootable): added check for active status (#3132) if lazy and active at boot, should show content fixes #3084 * test (v-date-picker-date-table): additional events test * feat(v-select): removed debounce prop (#3138) this was added early on in the framework. Just as Vue removed this from the framework, this should be handled by the developer resolves #2978 * feat(v-bottom-sheet): added **hide-overlay** prop resolves #2668 * prev/next-icon & expand-icon props (#3152) * fix: carousel icons * fix: date picker icons * fix: tabs icons * feat: data-iterable prev/next icons * feat: v-expansion-panel-content expand-icon prop * feat (v-date-picker): reactive prop (#3115) * feat (v-date-picker): lazy prop * test (v-date-picker): lazy prop tests * renamed lazy prop to reactive * fix(v-date-picker-title): fixed improper comparison for transition (#3160) * fix(v-date-picker-title): fixed improper comparison for transition was comparing the formatted string value of `date` when determining the transition direction. updated to use the iso value * removed unnecessary year watcher * removed setReversing method * fix: update $vuetify.application when created instead of mounted (#3156) * fix (pickers): workaround for chrome 64 rendering issue (#3162) * paramaterize sort icon (#3148) * paramaterize sort icon * added new line * removed trailing spaces * Fix snackbar width on sm, add auto-height prop (#3155) * fix: use margins instead of transform to center snackbars * fix: allow snackbar to shrink to contents * feat: add autoHeight prop * allow the use of multiple action buttons vertical snackbars with multiple actions must use auto-height * fix button width on all snackbar styles * resolved ie11 bugs * fix (v-date-picker): tableDate not set properly when pickerDate is nulled (#3147) * fix: setting null pickerDate doesn't change the tableDate * test (v-date-picker): test for pickerDate * Update README.md (#3168) * fixes #3165 - menu keeps selected item in frame when keydown scrolls (#3166) * enh(goTo): fixed potential error when passing undefined/null (#3172) and added support for passing VueComponent as target * refactor(theme): simplify theme generation with SSR * fix (v-picker): reverted default width to 290px (#3170) * fix (v-picker): reverted default width to 290px * reversed date button sizes and event dots positions * [release] 1.0.0-beta.6 * Fix v-snackbar color prop (#3201) * feat: **persistent** prop for v-edit-dialog (#3196) fixes #3195 * init commit (#3213) * fix(v-tooltip): fixed tooltip height (#3222) fixes #3205 * Fix/#3022 list group icons (#3214) * fix(v-list-group): added ability to remove icons fixes #3022 * fix(v-list-group): removed icon generation if not needed fixes #3022 * removed deprecated code * test: DRY up VSelect tests * fix(v-tabs): updated booting process (#3234) updateTabs was not being called, also fixed initial render of slider being off by a few px fixes #3174 * fix(v-tab): added back removed nextTick (#3232) was evaluating before the route change was actually resolved fixes #3203 * fix(v-select): removed useless operation (#3231) fixes #3151 * fix(detachable): allow any object in the attach prop (#3241) * fix(VSelect): add tags with tab when the menu is open (#3240) * fix: correct type definition for $vuetidy.goTo closes #3200 * fix(stackable): return a z-index of 0 in SSR) ideally none of this would even be running ssr, but that's a bit too much of a rewrite for now fixes #3242 * remove missed console.log --- .babelrc | 6 +- .env => .env.example | 0 .eslintrc.js | 25 +- .github/PULL_REQUEST_TEMPLATE.md | 33 +- .gitignore | 3 + .travis.yml | 2 +- BACKERS.md | 24 +- README.md | 16 +- build/babel-transform-stylus-paths.js | 6 +- build/run-tests.js | 12 + build/webpack.base.config.js | 8 +- build/webpack.dev.config.js | 6 +- build/webpack.prod.config.js | 6 +- dev/index.html | 1 + dev/index.js | 2 + dev/lint-commit-message.js | 38 + dev/warn-npm-install.js | 15 + index.d.ts | 150 +- package-lock.json | 10845 ---------------- package.json | 158 +- src/components/VAlert/VAlert.js | 8 +- src/components/VAlert/VAlert.spec.js | 24 +- .../VAlert/__snapshots__/VAlert.spec.js.snap | 4 +- src/components/VApp/VApp.js | 8 +- src/components/VApp/VApp.spec.js | 27 +- .../VApp/__snapshots__/VApp.spec.js.snap | 970 ++ src/components/VApp/mixins/app-breakpoint.js | 15 +- .../VApp/mixins/app-breakpoint.spec.js | 4 +- src/components/VApp/mixins/app-theme.js | 82 +- src/components/VAvatar/VAvatar.js | 20 +- src/components/VAvatar/VAvatar.spec.js | 32 +- src/components/VBadge/VBadge.js | 12 +- src/components/VBadge/VBadge.spec.js | 8 +- src/components/VBottomNav/VBottomNav.js | 39 +- src/components/VBottomNav/VBottomNav.spec.js | 56 +- .../__snapshots__/VBottomNav.spec.js.snap | 24 +- src/components/VBottomSheet/VBottomSheet.js | 3 +- src/components/VBreadcrumbs/VBreadcrumbs.js | 11 +- .../VBreadcrumbs/VBreadcrumbs.spec.js | 8 +- .../VBreadcrumbs/VBreadcrumbsItem.spec.js | 4 +- .../__snapshots__/VBreadcrumbs.spec.js.snap | 24 +- src/components/VBtn/VBtn.js | 46 +- src/components/VBtn/VBtn.spec.js | 91 +- .../VBtn/__snapshots__/VBtn.spec.js.snap | 81 +- src/components/VBtnToggle/VBtnToggle.js | 12 +- src/components/VBtnToggle/VBtnToggle.spec.js | 143 +- .../__snapshots__/VBtnToggle.spec.js.snap | 164 +- src/components/VCard/VCard.js | 9 +- src/components/VCard/VCard.spec.js | 12 +- src/components/VCard/VCardMedia.spec.js | 7 +- src/components/VCard/VCardTitle.spec.js | 4 +- .../VCard/__snapshots__/VCard.spec.js.snap | 7 - .../__snapshots__/VCardMedia.spec.js.snap | 2 + src/components/VCarousel/VCarousel.js | 36 +- src/components/VCarousel/VCarousel.spec.js | 54 +- src/components/VCarousel/VCarouselItem.js | 39 +- .../VCarousel/VCarouselItem.spec.js | 6 +- .../__snapshots__/VCarousel.spec.js.snap | 222 +- .../__snapshots__/VCarouselItem.spec.js.snap | 20 +- src/components/VCheckbox/VCheckbox.js | 6 +- src/components/VCheckbox/VCheckbox.spec.js | 39 +- src/components/VChip/VChip.js | 4 +- src/components/VChip/VChip.spec.js | 17 +- .../VChip/__snapshots__/VChip.spec.js.snap | 4 +- src/components/VDataIterator/VDataIterator.js | 99 + .../VDataIterator/VDataIterator.spec.js | 149 + .../__snapshots__/VDataIterator.spec.js.snap | 524 + src/components/VDataIterator/index.js | 7 + src/components/VDataTable/VDataTable.js | 271 +- src/components/VDataTable/VDataTable.spec.js | 174 +- src/components/VDataTable/VEditDialog.js | 29 +- .../__snapshots__/VDataTable.spec.js.snap | 874 +- src/components/VDataTable/mixins/body.js | 76 +- src/components/VDataTable/mixins/foot.js | 131 +- src/components/VDataTable/mixins/head.js | 30 +- src/components/VDataTable/mixins/progress.js | 2 +- .../VDatePicker/VDatePicker.date.spec.js | 498 + src/components/VDatePicker/VDatePicker.js | 500 +- .../VDatePicker/VDatePicker.month.spec.js | 208 + .../VDatePicker/VDatePicker.spec.js | 183 - .../VDatePicker/VDatePickerDateTable.js | 127 + .../VDatePicker/VDatePickerDateTable.spec.js | 212 + .../VDatePicker/VDatePickerHeader.js | 138 + .../VDatePicker/VDatePickerHeader.spec.js | 153 + .../VDatePicker/VDatePickerMonthTable.js | 55 + .../VDatePicker/VDatePickerMonthTable.spec.js | 143 + .../VDatePicker/VDatePickerTitle.js | 91 + .../VDatePicker/VDatePickerTitle.spec.js | 88 + .../VDatePicker/VDatePickerYears.js | 78 + .../VDatePicker/VDatePickerYears.spec.js | 64 + .../VDatePicker.date.spec.js.snap | 3448 +++++ .../VDatePicker.month.spec.js.snap | 789 ++ .../__snapshots__/VDatePicker.spec.js.snap | 4306 ------ .../VDatePickerDateTable.spec.js.snap | 1975 +++ .../VDatePickerHeader.spec.js.snap | 71 + .../VDatePickerMonthTable.spec.js.snap | 128 + .../VDatePickerTitle.spec.js.snap | 44 + .../VDatePickerYears.spec.js.snap | 611 + src/components/VDatePicker/index.js | 19 + .../VDatePicker/mixins/date-header.js | 64 - .../VDatePicker/mixins/date-picker-table.js | 126 + .../VDatePicker/mixins/date-table.js | 95 - .../VDatePicker/mixins/date-title.js | 68 - .../VDatePicker/mixins/date-years.js | 43 - .../VDatePicker/mixins/month-table.js | 78 - .../util/createNativeLocaleFormatter.js | 15 + .../util/createNativeLocaleFormatter.spec.js | 24 + src/components/VDatePicker/util/index.js | 9 + .../VDatePicker/util/isDateAllowed.js | 5 + .../VDatePicker/util/monthChange.js | 17 + .../VDatePicker/util/monthChange.spec.js | 11 + src/components/VDatePicker/util/pad.js | 16 + src/components/VDatePicker/util/pad.spec.js | 19 + src/components/VDialog/VDialog.js | 29 +- src/components/VDialog/VDialog.spec.js | 113 +- src/components/VDivider/VDivider.js | 2 +- src/components/VDivider/VDivider.spec.js | 33 +- .../__snapshots__/VDivider.spec.js.snap | 6 - .../VExpansionPanel/VExpansionPanel.js | 39 +- .../VExpansionPanel/VExpansionPanel.spec.js | 61 +- .../VExpansionPanel/VExpansionPanelContent.js | 25 +- .../VExpansionPanelContent.spec.js | 85 +- .../VExpansionPanel.spec.js.snap | 113 + .../VExpansionPanelContent.spec.js.snap | 96 + src/components/VFooter/VFooter.js | 82 +- src/components/VFooter/VFooter.spec.js | 61 +- .../__snapshots__/VFooter.spec.js.snap | 28 + src/components/VForm/VForm.js | 21 +- src/components/VForm/VForm.spec.js | 124 +- src/components/VGrid/VContainer.js | 2 +- src/components/VGrid/VContent.js | 30 +- src/components/VGrid/VFlex.js | 2 +- src/components/VGrid/VGrid.spec.js | 22 +- src/components/VGrid/VLayout.js | 2 +- src/components/VGrid/grid.js | 8 +- src/components/VIcon/VIcon.js | 87 +- src/components/VIcon/VIcon.spec.js | 90 +- .../VIcon/__snapshots__/VIcon.spec.js.snap | 41 + src/components/VJumbotron/VJumbotron.js | 93 + src/components/VJumbotron/index.js | 8 + src/components/VList/VList.js | 66 +- src/components/VList/VList.spec.js | 4 +- src/components/VList/VListGroup.js | 168 +- src/components/VList/VListGroup.spec.js | 169 +- src/components/VList/VListTile.js | 18 +- src/components/VList/VListTile.spec.js | 4 +- src/components/VList/VListTileAction.js | 2 +- src/components/VList/VListTileAction.spec.js | 25 +- src/components/VList/VListTileAvatar.js | 29 + src/components/VList/VListTileAvatar.spec.js | 10 + .../VList/__snapshots__/VList.spec.js.snap | 20 +- .../__snapshots__/VListGroup.spec.js.snap | 68 +- .../__snapshots__/VListTile.spec.js.snap | 5 +- .../VListTileAction.spec.js.snap | 18 + .../VListTileAvatar.spec.js.snap | 12 + src/components/VList/index.js | 4 +- src/components/VMenu/VMenu.js | 23 +- src/components/VMenu/VMenu.spec.js | 106 +- .../VMenu/__snapshots__/VMenu.spec.js.snap | 30 +- .../VMenu/mixins/menu-generators.js | 16 +- src/components/VMenu/mixins/menu-keyable.js | 7 +- src/components/VMenu/mixins/menu-position.js | 12 +- .../VNavigationDrawer/VNavigationDrawer.js | 188 +- .../VNavigationDrawer.spec.js | 26 +- src/components/VPagination/VPagination.js | 8 +- .../VPagination/VPagination.spec.js | 41 +- .../__snapshots__/VPagination.spec.js.snap | 20 +- src/components/VParallax/VParallax.js | 12 +- src/components/VParallax/VParallax.spec.js | 4 +- src/components/VPicker/VPicker.js | 93 + src/components/VPicker/VPicker.spec.js | 54 + .../__snapshots__/VPicker.spec.js.snap | 59 + src/components/VPicker/index.js | 8 + .../VProgressCircular/VProgressCircular.js | 7 +- .../VProgressCircular.spec.js | 18 +- .../VProgressLinear/VProgressLinear.js | 13 +- .../VProgressLinear/VProgressLinear.spec.js | 21 +- .../VProgressLinear.spec.js.snap | 69 +- src/components/VRadioGroup/VRadio.js | 5 +- src/components/VRadioGroup/VRadio.spec.js | 27 +- src/components/VRadioGroup/VRadioGroup.js | 24 +- .../VRadioGroup/VRadioGroup.spec.js | 4 +- .../__snapshots__/VRadio.spec.js.snap | 24 +- .../__snapshots__/VRadioGroup.spec.js.snap | 22 +- .../VSelect/VSelect-autocomplete.spec.js | 111 +- .../VSelect/VSelect-combobox.spec.js | 110 +- src/components/VSelect/VSelect-tags.spec.js | 255 +- src/components/VSelect/VSelect.js | 70 +- src/components/VSelect/VSelect.spec.js | 193 +- src/components/VSelect/VSelect2.spec.js | 31 +- .../__snapshots__/VSelect.spec.js.snap | 211 +- .../__snapshots__/VSelect2.spec.js.snap | 54 +- .../VSelect/mixins/select-autocomplete.js | 23 +- .../VSelect/mixins/select-computed.js | 23 +- .../VSelect/mixins/select-events.js | 6 +- .../VSelect/mixins/select-generators.js | 74 +- .../VSelect/mixins/select-helpers.js | 14 - src/components/VSelect/mixins/select-props.js | 17 +- .../VSelect/mixins/select-watchers.js | 19 +- src/components/VSlider/VSlider.js | 24 +- src/components/VSlider/VSlider.spec.js | 66 +- .../__snapshots__/VSlider.spec.js.snap | 84 +- src/components/VSnackbar/VSnackbar.js | 56 +- src/components/VSnackbar/VSnackbar.spec.js | 19 +- src/components/VSpeedDial/VSpeedDial.js | 16 +- src/components/VSpeedDial/VSpeedDial.spec.js | 40 +- .../__snapshots__/VSpeedDial.spec.js.snap | 12 + src/components/VStepper/VStepper.js | 25 +- src/components/VStepper/VStepperContent.js | 33 +- .../VStepper/VStepperContent.spec.js | 19 + src/components/VSubheader/VSubheader.js | 2 +- src/components/VSwitch/VSwitch.js | 6 +- src/components/VSwitch/VSwitch.spec.js | 56 +- .../__snapshots__/VSwitch.spec.js.snap | 22 + src/components/VSystemBar/VSystemBar.js | 46 +- src/components/VSystemBar/VSystemBar.spec.js | 37 +- src/components/VTabs/VTab.js | 113 + src/components/VTabs/VTab.spec.js | 199 + .../VTabs/{VTabsContent.js => VTabItem.js} | 29 +- src/components/VTabs/VTabItem.spec.js | 72 + src/components/VTabs/VTabs.js | 355 +- src/components/VTabs/VTabs.spec.js | 382 +- src/components/VTabs/VTabsBar.js | 212 - src/components/VTabs/VTabsItem.js | 99 - src/components/VTabs/VTabsItems.js | 117 +- src/components/VTabs/VTabsItems.spec.js | 84 + src/components/VTabs/VTabsSlider.js | 2 +- src/components/VTabs/VTabsSlider.spec.js | 7 +- .../VTabs/__snapshots__/VTabs.spec.js.snap | 18 + src/components/VTabs/index.js | 12 +- src/components/VTabs/mixins/tabs-computed.js | 55 + .../VTabs/mixins/tabs-generators.js | 96 + src/components/VTabs/mixins/tabs-props.js | 40 + src/components/VTabs/mixins/tabs-touch.js | 40 + src/components/VTabs/mixins/tabs-watchers.js | 41 + src/components/VTextField/VTextField.js | 78 +- src/components/VTextField/VTextField.spec.js | 218 +- .../__snapshots__/VTextField.spec.js.snap | 78 +- src/components/VTimePicker/VTimePicker.js | 383 +- .../VTimePicker/VTimePicker.spec.js | 257 +- .../VTimePicker/VTimePickerClock.js | 218 + .../VTimePicker/VTimePickerClock.spec.js | 167 + .../VTimePicker/VTimePickerTitle.js | 61 + .../VTimePicker/VTimePickerTitle.spec.js | 92 + .../__snapshots__/VTimePicker.spec.js.snap | 948 +- .../VTimePickerClock.spec.js.snap | 143 + .../VTimePickerTitle.spec.js.snap | 63 + src/components/VTimePicker/index.js | 10 + .../VTimePicker/mixins/time-body.js | 213 - .../VTimePicker/mixins/time-title.js | 49 - src/components/VToolbar/VToolbar.js | 215 +- src/components/VToolbar/VToolbar.spec.js | 185 +- .../VToolbar/VToolbarSideIcon.spec.js | 6 +- .../__snapshots__/VToolbar.spec.js.snap | 35 + .../VToolbarSideIcon.spec.js.snap | 6 +- src/components/VTooltip/VTooltip.js | 2 +- src/components/VTooltip/VTooltip.spec.js | 16 +- .../Vuetify/Vuetify.install.spec.js | 50 + src/components/Vuetify/index.js | 22 +- src/components/Vuetify/mixins/application.js | 5 +- src/components/Vuetify/mixins/options.js | 9 + src/components/Vuetify/mixins/theme.js | 19 +- src/components/Vuetify/util/goTo.js | 69 + src/components/Vuetify/util/goTo.spec.js | 25 + src/components/index.js | 3 + src/directives/click-outside.js | 32 +- src/directives/resize.js | 28 +- src/directives/ripple.js | 99 +- src/directives/ripple.spec.js | 19 +- src/directives/scroll.js | 10 +- src/directives/touch.js | 23 +- src/directives/touch.spec.js | 83 + src/index.js | 5 +- src/mixins/applicationable.js | 61 +- src/mixins/applicationable.spec.js | 104 + src/mixins/bootable.js | 4 +- src/mixins/bootable.spec.js | 65 + src/mixins/button-group.js | 79 +- src/mixins/colorable.js | 22 +- src/mixins/contextualable.js | 10 - src/mixins/data-iterable.js | 464 + src/mixins/delayable.js | 8 +- src/mixins/dependent.js | 15 +- src/mixins/detachable.js | 49 +- src/mixins/filterable.js | 2 + src/mixins/input.js | 23 +- src/mixins/loadable.js | 2 + src/mixins/maskable.js | 43 +- src/mixins/menuable.js | 131 +- src/mixins/menuable.spec.js | 34 + src/mixins/overlayable.js | 14 +- src/mixins/picker-button.js | 17 + src/mixins/picker.js | 68 +- src/mixins/positionable.js | 13 +- src/mixins/registrable.js | 18 +- src/mixins/returnable.js | 29 + src/mixins/rippleable.js | 2 + src/mixins/routable.js | 17 +- src/mixins/routable.spec.js | 18 + src/mixins/selectable.js | 2 + src/mixins/soloable.js | 25 + src/mixins/ssr-bootable.js | 25 + src/mixins/stackable.js | 24 +- src/mixins/tab-focusable.js | 2 + src/mixins/themeable.js | 2 + src/mixins/toggleable.js | 2 + src/mixins/transitionable.js | 2 + src/mixins/translatable.js | 2 + src/mixins/validatable.js | 17 +- src/stylus/app.styl | 1 - src/stylus/bootstrap.styl | 1 + src/stylus/components/_alerts.styl | 4 +- src/stylus/components/_app.styl | 15 +- src/stylus/components/_avatars.styl | 5 +- src/stylus/components/_bottom-navs.styl | 23 +- src/stylus/components/_button-toggle.styl | 4 +- src/stylus/components/_buttons.styl | 98 +- src/stylus/components/_cards.styl | 4 +- src/stylus/components/_carousel.styl | 17 +- src/stylus/components/_chips.styl | 14 +- src/stylus/components/_content.styl | 12 +- src/stylus/components/_data-iterator.styl | 54 + src/stylus/components/_data-table.styl | 14 +- .../components/_date-picker-header.styl | 41 + src/stylus/components/_date-picker-table.styl | 74 + src/stylus/components/_date-picker-title.styl | 25 + src/stylus/components/_date-picker-years.styl | 27 + src/stylus/components/_date-picker.styl | 131 - src/stylus/components/_expansion-panel.styl | 5 +- src/stylus/components/_footer.styl | 20 +- src/stylus/components/_grid.styl | 16 +- src/stylus/components/_icons.styl | 3 +- src/stylus/components/_input-groups.styl | 28 +- src/stylus/components/_jumbotrons.styl | 44 + src/stylus/components/_lists.styl | 184 +- src/stylus/components/_menus.styl | 7 +- src/stylus/components/_navigation-drawer.styl | 44 +- src/stylus/components/_pagination.styl | 1 - src/stylus/components/_pickers.styl | 97 +- src/stylus/components/_progress-linear.styl | 5 +- src/stylus/components/_select.styl | 13 +- .../components/_selection-controls.styl | 37 +- src/stylus/components/_snackbars.styl | 163 +- src/stylus/components/_steppers.styl | 18 +- src/stylus/components/_switch.styl | 14 +- src/stylus/components/_tables.styl | 12 +- src/stylus/components/_tabs.styl | 259 +- src/stylus/components/_text-fields.styl | 13 +- src/stylus/components/_time-picker-clock.styl | 113 + src/stylus/components/_time-picker-title.styl | 48 + src/stylus/components/_time-picker.styl | 175 - src/stylus/components/_toolbar.styl | 48 +- src/stylus/components/_tooltips.styl | 4 + src/stylus/elements/_global.styl | 2 +- .../{tools => generic}/_animations.styl | 0 .../{tools => generic}/_elevations.styl | 0 src/stylus/generic/_transitions.styl | 51 +- src/stylus/settings/_colors.styl | 4 +- src/stylus/settings/_elevations.styl | 12 +- src/stylus/settings/_theme.styl | 12 + src/stylus/settings/_variables.styl | 24 +- src/stylus/tools/_bootable.styl | 5 + src/stylus/trumps/_spacing.styl | 6 +- src/util/color/transformCIELAB.js | 34 + src/util/color/transformSRGB.js | 67 + src/util/colorUtils.js | 46 + src/util/colorUtils.spec.js | 112 + src/util/colors.js | 86 +- src/util/console.js | 12 + src/util/console.spec.js | 20 + src/util/easing-patterns.js | 26 + src/util/helpers.js | 21 + src/util/mask.js | 36 +- src/util/mask.spec.js | 26 +- src/util/pointerSupport.js | 25 - src/util/testing.js | 31 +- src/util/theme.js | 102 + yarn.lock | 2423 +++- 378 files changed, 25738 insertions(+), 22001 deletions(-) rename .env => .env.example (100%) create mode 100644 build/run-tests.js create mode 100644 dev/lint-commit-message.js create mode 100644 dev/warn-npm-install.js delete mode 100644 package-lock.json create mode 100644 src/components/VDataIterator/VDataIterator.js create mode 100644 src/components/VDataIterator/VDataIterator.spec.js create mode 100644 src/components/VDataIterator/__snapshots__/VDataIterator.spec.js.snap create mode 100644 src/components/VDataIterator/index.js create mode 100644 src/components/VDatePicker/VDatePicker.date.spec.js create mode 100755 src/components/VDatePicker/VDatePicker.month.spec.js delete mode 100644 src/components/VDatePicker/VDatePicker.spec.js create mode 100644 src/components/VDatePicker/VDatePickerDateTable.js create mode 100644 src/components/VDatePicker/VDatePickerDateTable.spec.js create mode 100644 src/components/VDatePicker/VDatePickerHeader.js create mode 100644 src/components/VDatePicker/VDatePickerHeader.spec.js create mode 100644 src/components/VDatePicker/VDatePickerMonthTable.js create mode 100644 src/components/VDatePicker/VDatePickerMonthTable.spec.js create mode 100644 src/components/VDatePicker/VDatePickerTitle.js create mode 100644 src/components/VDatePicker/VDatePickerTitle.spec.js create mode 100644 src/components/VDatePicker/VDatePickerYears.js create mode 100644 src/components/VDatePicker/VDatePickerYears.spec.js create mode 100755 src/components/VDatePicker/__snapshots__/VDatePicker.date.spec.js.snap create mode 100755 src/components/VDatePicker/__snapshots__/VDatePicker.month.spec.js.snap delete mode 100644 src/components/VDatePicker/__snapshots__/VDatePicker.spec.js.snap create mode 100644 src/components/VDatePicker/__snapshots__/VDatePickerDateTable.spec.js.snap create mode 100644 src/components/VDatePicker/__snapshots__/VDatePickerHeader.spec.js.snap create mode 100644 src/components/VDatePicker/__snapshots__/VDatePickerMonthTable.spec.js.snap create mode 100644 src/components/VDatePicker/__snapshots__/VDatePickerTitle.spec.js.snap create mode 100644 src/components/VDatePicker/__snapshots__/VDatePickerYears.spec.js.snap delete mode 100644 src/components/VDatePicker/mixins/date-header.js create mode 100644 src/components/VDatePicker/mixins/date-picker-table.js delete mode 100644 src/components/VDatePicker/mixins/date-table.js delete mode 100644 src/components/VDatePicker/mixins/date-title.js delete mode 100644 src/components/VDatePicker/mixins/date-years.js delete mode 100644 src/components/VDatePicker/mixins/month-table.js create mode 100644 src/components/VDatePicker/util/createNativeLocaleFormatter.js create mode 100644 src/components/VDatePicker/util/createNativeLocaleFormatter.spec.js create mode 100644 src/components/VDatePicker/util/index.js create mode 100644 src/components/VDatePicker/util/isDateAllowed.js create mode 100644 src/components/VDatePicker/util/monthChange.js create mode 100644 src/components/VDatePicker/util/monthChange.spec.js create mode 100644 src/components/VDatePicker/util/pad.js create mode 100644 src/components/VDatePicker/util/pad.spec.js create mode 100755 src/components/VExpansionPanel/__snapshots__/VExpansionPanel.spec.js.snap create mode 100755 src/components/VExpansionPanel/__snapshots__/VExpansionPanelContent.spec.js.snap create mode 100755 src/components/VFooter/__snapshots__/VFooter.spec.js.snap create mode 100644 src/components/VIcon/__snapshots__/VIcon.spec.js.snap create mode 100644 src/components/VJumbotron/VJumbotron.js create mode 100644 src/components/VJumbotron/index.js create mode 100644 src/components/VList/VListTileAvatar.js create mode 100755 src/components/VList/VListTileAvatar.spec.js create mode 100755 src/components/VList/__snapshots__/VListTileAvatar.spec.js.snap create mode 100644 src/components/VPicker/VPicker.js create mode 100644 src/components/VPicker/VPicker.spec.js create mode 100644 src/components/VPicker/__snapshots__/VPicker.spec.js.snap create mode 100644 src/components/VPicker/index.js create mode 100644 src/components/VStepper/VStepperContent.spec.js create mode 100644 src/components/VSwitch/__snapshots__/VSwitch.spec.js.snap create mode 100644 src/components/VTabs/VTab.js create mode 100644 src/components/VTabs/VTab.spec.js rename src/components/VTabs/{VTabsContent.js => VTabItem.js} (75%) create mode 100644 src/components/VTabs/VTabItem.spec.js delete mode 100644 src/components/VTabs/VTabsBar.js delete mode 100644 src/components/VTabs/VTabsItem.js create mode 100644 src/components/VTabs/VTabsItems.spec.js create mode 100644 src/components/VTabs/__snapshots__/VTabs.spec.js.snap create mode 100644 src/components/VTabs/mixins/tabs-computed.js create mode 100644 src/components/VTabs/mixins/tabs-generators.js create mode 100644 src/components/VTabs/mixins/tabs-props.js create mode 100644 src/components/VTabs/mixins/tabs-touch.js create mode 100644 src/components/VTabs/mixins/tabs-watchers.js create mode 100644 src/components/VTimePicker/VTimePickerClock.js create mode 100644 src/components/VTimePicker/VTimePickerClock.spec.js create mode 100644 src/components/VTimePicker/VTimePickerTitle.js create mode 100644 src/components/VTimePicker/VTimePickerTitle.spec.js create mode 100644 src/components/VTimePicker/__snapshots__/VTimePickerClock.spec.js.snap create mode 100644 src/components/VTimePicker/__snapshots__/VTimePickerTitle.spec.js.snap delete mode 100644 src/components/VTimePicker/mixins/time-body.js delete mode 100644 src/components/VTimePicker/mixins/time-title.js create mode 100755 src/components/VToolbar/__snapshots__/VToolbar.spec.js.snap create mode 100755 src/components/Vuetify/Vuetify.install.spec.js create mode 100644 src/components/Vuetify/mixins/options.js create mode 100644 src/components/Vuetify/util/goTo.js create mode 100644 src/components/Vuetify/util/goTo.spec.js create mode 100644 src/directives/touch.spec.js create mode 100755 src/mixins/applicationable.spec.js create mode 100755 src/mixins/bootable.spec.js delete mode 100644 src/mixins/contextualable.js create mode 100644 src/mixins/data-iterable.js create mode 100644 src/mixins/menuable.spec.js create mode 100644 src/mixins/picker-button.js create mode 100644 src/mixins/returnable.js create mode 100755 src/mixins/routable.spec.js create mode 100644 src/mixins/soloable.js create mode 100644 src/mixins/ssr-bootable.js create mode 100644 src/stylus/components/_data-iterator.styl create mode 100644 src/stylus/components/_date-picker-header.styl create mode 100644 src/stylus/components/_date-picker-table.styl create mode 100644 src/stylus/components/_date-picker-title.styl create mode 100644 src/stylus/components/_date-picker-years.styl delete mode 100755 src/stylus/components/_date-picker.styl create mode 100644 src/stylus/components/_jumbotrons.styl create mode 100644 src/stylus/components/_time-picker-clock.styl create mode 100644 src/stylus/components/_time-picker-title.styl delete mode 100755 src/stylus/components/_time-picker.styl rename src/stylus/{tools => generic}/_animations.styl (100%) rename src/stylus/{tools => generic}/_elevations.styl (100%) mode change 100755 => 100644 create mode 100644 src/stylus/tools/_bootable.styl create mode 100644 src/util/color/transformCIELAB.js create mode 100644 src/util/color/transformSRGB.js create mode 100644 src/util/colorUtils.js create mode 100644 src/util/colorUtils.spec.js create mode 100644 src/util/console.js create mode 100644 src/util/console.spec.js create mode 100644 src/util/easing-patterns.js delete mode 100644 src/util/pointerSupport.js create mode 100644 src/util/theme.js diff --git a/.babelrc b/.babelrc index 1c90516cf59b..db52c7bc8590 100644 --- a/.babelrc +++ b/.babelrc @@ -21,21 +21,21 @@ }, "es5": { "presets": [ - ["es2015", {"modules": false}], + ["es2015"], ["stage-2"] ], "plugins": ["./build/babel-transform-stylus-paths.js"] }, "development": { "presets": [ - ["es2015", {"modules": false}], + ["es2015", { "modules": false }], ["stage-2"] ], "plugins": ["add-filehash"] }, "production": { "presets": [ - ["es2015", {"modules": false}], + ["es2015", { "modules": false }], ["stage-2"] ] } diff --git a/.env b/.env.example similarity index 100% rename from .env rename to .env.example diff --git a/.eslintrc.js b/.eslintrc.js index 15b53e270f1d..3d46d38c6f82 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,16 +1,12 @@ module.exports = { root: true, - parser: 'babel-eslint', parserOptions: { + parser: 'babel-eslint', + ecmaVersion: 2017, sourceType: 'module' }, - // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style - extends: 'vue', - // required to lint *.vue files - plugins: [ - 'vue', - 'pug', - 'html' + extends: [ + 'standard' ], env: { browser: true @@ -21,22 +17,15 @@ module.exports = { 'it': true, 'jest': true }, - // add your custom rules here 'rules': { // allow paren-less arrow functions - 'arrow-parens': 0, - // allow async-await - 'generator-star-spacing': 0, + 'arrow-parens': [2, 'as-needed'], // set maximum line characters 'max-len': [2, 140, 4, {'ignoreUrls': true, 'ignoreTemplateLiterals': true, 'ignoreStrings': true}], // allow debugger during development 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, 'no-return-assign': 0, - // disallow indentation using both tabs and spaces - 'no-mixed-spaces-and-tabs': 2, - // ensure consistent 2 space indentation and indent cases under switch - 'indent': [2, 2, {'SwitchCase': 1}], - 'object-curly-spacing': [2, 'always'], - 'max-statements': [2, 24] + 'max-statements': [2, 24], + 'prefer-promise-reject-errors': 0 } } diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 9286804c1687..5709303a4432 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,36 @@ + + +## Description + + +## Motivation and Context + + + +## How Has This Been Tested? + + + +## Markup: + + +## Types of changes + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Improvement/refactoring (non-breaking change that doesn't add any feature but make things better) + +## Checklist: + + +- [ ] The PR title is no longer than 64 characters. +- [ ] The PR is submitted to the correct branch (`master` for bug fixes, `dev` for new features and breaking changes). +- [ ] My code follows the code style of this project. +- [ ] My change requires a change to the documentation. +- [ ] I have created a PR in the [documentation](https://github.com/vuetifyjs/vuetifyjs.com) with the necessary changes. diff --git a/.gitignore b/.gitignore index 2000a3026bb8..951263ccd5be 100755 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ dev/*css !dev/index.js !dev/router.js !dev/prepare-commit-message.js +!dev/lint-commit-message.js +!dev/warn-npm-install.js /es5 /dist /release +.env diff --git a/.travis.yml b/.travis.yml index 27b5e02ea7b5..9db50c4c215f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ before_script: - npm i codecov -g script: - - yarn + - yarn --frozen-lockfile --non-interactive - yarn run lint - yarn run test:coverage && codecov - yarn run build diff --git a/BACKERS.md b/BACKERS.md index c567d050355b..60434fd69c59 100755 --- a/BACKERS.md +++ b/BACKERS.md @@ -21,15 +21,15 @@ You can join them in supporting Vuetify.js by [pledging on Patreon](https://www. - [LiveCasino](https://livecasino.com/) - [Nate Controls](http://www.natecontrols.com/) - [Trek10](https://www.trek10.com/) +- [Zweidenker](http://zweidenker.de) ### $20+ - Tibor Nagy - [Jaime Olmo](https://www.jaimeolmo.com) - Michael Marti -- [Aeroden](www.aeroden.com) +- [Aeroden](https://www.aeroden.com) - Sam Mitchell - David Hess -- Roger Vilaseca - Jay Blanchard - Christo Crampton - Team Of Monkeys @@ -47,12 +47,11 @@ You can join them in supporting Vuetify.js by [pledging on Patreon](https://www. - Chava Sobreyra - Costa Huang - Paul -- Asif Mehedi - Jussi Pesonen - Jordan Wood - Alexey Toroshchin - Phillippe Genois -- Jim O`Quinn +- Jim O\`Quinn - Sam Bosell - Cliff Hess - Antonio Luis Gil Rodríguez @@ -67,9 +66,20 @@ You can join them in supporting Vuetify.js by [pledging on Patreon](https://www. - Matthew O'Leary - Mike Margerum - Reto Aebersold -- Max Matteo Staack - Mark Freedman - Fernando Rosentalski Neto -- eric -- Jon K +- Eric Nguyen - Alvin Wang +- Jadranko Dragoje +- Charles McKeever +- Caleb Blankemeyer +- Nicholas Coates +- Stanislovas Janonis +- Nico Rogers +- Jamie Sartell +- Brandon Deo +- Chanlito Hem +- Idea Junction Ltd. +- Michael Hipp +- Keyur Desai +- Phillipp Naderer-Puiu diff --git a/README.md b/README.md index 4c939f6fc385..722a592ead12 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@

Build amazing applications with the power of Vue and Material Design and a massive library of beautifully crafted components. Created according to Google's Material Design Spec, Vuetify components feature an easy-to-remember semantic design that shifts remembering complex classes and markup, to type-as-you speak properties that have simple and clear names.

-

Harness the power of the Vuetify community and get help 24/7 from talented developers across the world, the dev team and the creator, John Leider. Become a patreon backer and get access to special Patreon only channels.

+

Harness the power of the Vuetify community and get help 24/7 from talented developers across the world, the dev team and the creator, John Leider. Become a backer and get access to dedicated support from the team.

Vuetify supports all modern browsers, including IE11 and Safari 9+. From mobile to laptop to desktop, you can rest assured that your application will work as expected. Interested in the bleeding edge? Try the vue-cli Webpack SSR (Server side rendered) template and build websites optimized for SEO.

@@ -88,6 +88,7 @@

One minute Quick-start

+[Codepen link](https://codepen.io/johnjleider/pen/jYZwVZ) ```html @@ -99,9 +100,9 @@
-
+ Hello world -
+
@@ -146,10 +147,10 @@ Or you can import it to your webpack entry point ```javascript require('/path/to/node_modules/vuetify/dist/vuetify.min.css') ``` -Keep in mind, you will need to ensure your webpack config contains a css-loader. +Keep in mind, you will need to ensure your webpack config contains a css loader. -

Frequently asked questions and Gotchas

-Frequently asked questions +## Frequently asked questions and Gotchas +[FAQ Guide](https://vuetifyjs.com/vuetify/frequently-asked-questions)

Community Support

Ask your support questions on the vuetifyjs discord. @@ -157,6 +158,3 @@ Ask your support questions on the vuetifyjs Additional Resources - [Codepen starter template](https://template.vuetifyjs.com) -- [Storybook for Vue boilerplate project with Vuetify](https://github.com/white-rabbit-japan/vuetify-storyboard-boilerplate) - - diff --git a/build/babel-transform-stylus-paths.js b/build/babel-transform-stylus-paths.js index 259f1a0a090e..ea7a071bde6e 100644 --- a/build/babel-transform-stylus-paths.js +++ b/build/babel-transform-stylus-paths.js @@ -5,11 +5,11 @@ var wrapListener = require('babel-plugin-detective/wrap-listener'); module.exports = wrapListener(listener, 'transform-stylus-paths'); function listener(path, file, opts) { - const regex = /((?:\.\.\/)+)/gi + const regex = /((?:\.\.?\/)+)/gi if (path.isLiteral() && path.node.value.endsWith('.styl')) { const matches = regex.exec(path.node.value) if (!matches) return - - path.node.value = path.node.value.replace(matches[0], `${matches[0]}../src/`) + const m = matches[0].startsWith('./') ? matches[0].substr(2) : matches[0] + path.node.value = path.node.value.replace(matches[0], `${m}../src/`) } } diff --git a/build/run-tests.js b/build/run-tests.js new file mode 100644 index 000000000000..296d928c113d --- /dev/null +++ b/build/run-tests.js @@ -0,0 +1,12 @@ +"use strict" +const spawn = require("child_process").spawn + +const args = process.argv.slice(2) + +if (process.platform === 'win32') { + // yarn test -i + spawn('yarn.cmd', ['test:win32', ...args], { stdio: 'inherit' }) +} else { + // yarn test + spawn('yarn', ['test:unix', ...args], { stdio: 'inherit' }) +} diff --git a/build/webpack.base.config.js b/build/webpack.base.config.js index 129b29aeb57c..aa278ea8658d 100644 --- a/build/webpack.base.config.js +++ b/build/webpack.base.config.js @@ -7,10 +7,10 @@ module.exports = { resolve: { extensions: ['*', '.js', '.json', '.vue'], alias: { - '~components': resolve('../src/components'), - '~directives': resolve('../src/directives'), - '~mixins': resolve('../src/mixins'), - '~util': resolve('../src/util'), + '@components': resolve('../src/components'), + '@directives': resolve('../src/directives'), + '@mixins': resolve('../src/mixins'), + '@util': resolve('../src/util'), 'stylus': resolve('../src/stylus') } }, diff --git a/build/webpack.dev.config.js b/build/webpack.dev.config.js index 970c54a3a5b2..35572300a22f 100644 --- a/build/webpack.dev.config.js +++ b/build/webpack.dev.config.js @@ -12,7 +12,11 @@ const webpack = require('webpack') const resolve = file => require('path').resolve(__dirname, file) const extractPlugin = ExtractTextPlugin.extract({ - use: ['css-loader', 'postcss-loader', 'stylus-loader'] + use: [ + { loader: 'css-loader', options: { sourceMap: true } }, + { loader: 'postcss-loader', options: { sourceMap: true } }, + { loader: 'stylus-loader', options: { sourceMap: true } } + ] }) module.exports = { diff --git a/build/webpack.prod.config.js b/build/webpack.prod.config.js index 07ed623a72f4..af82653e9d7f 100644 --- a/build/webpack.prod.config.js +++ b/build/webpack.prod.config.js @@ -3,7 +3,11 @@ const baseWebpackConfig = require('./webpack.base.config') const ExtractTextPlugin = require('extract-text-webpack-plugin') var extractPlugin = ExtractTextPlugin.extract({ - use: ['css-loader', 'postcss-loader', 'stylus-loader'] + use: [ + { loader: 'css-loader', options: { sourceMap: true } }, + { loader: 'postcss-loader', options: { sourceMap: true } }, + { loader: 'stylus-loader', options: { sourceMap: true } } + ] }) // Helpers diff --git a/dev/index.html b/dev/index.html index 9d727bdd8241..ab0ca176599a 100644 --- a/dev/index.html +++ b/dev/index.html @@ -7,6 +7,7 @@ +
diff --git a/dev/index.js b/dev/index.js index 960a6bc2a60b..8327590f8bbb 100644 --- a/dev/index.js +++ b/dev/index.js @@ -5,6 +5,8 @@ import Vuetify from 'vuetify' import VueRouter from 'vue-router' import router from './router' +Vue.config.performance = true + Vue.use(Vuetify) Vue.use(VueRouter) diff --git a/dev/lint-commit-message.js b/dev/lint-commit-message.js new file mode 100644 index 000000000000..b679ff0cf6e4 --- /dev/null +++ b/dev/lint-commit-message.js @@ -0,0 +1,38 @@ +const fs = require('fs') + +const reset = '\x1b[0m' +const red = '\x1b[31m' + +const [messageFile] = process.env.GIT_PARAMS.split(' ') +const currentMessage = fs.readFileSync(messageFile, 'utf8').replace(/^# ------------------------ >8 ------------------------[\s\S]*$|^#.*\n/gm, '') + +const errors = [] + +function check (message, cb) { + if (cb(currentMessage)) { + errors.push(message) + } +} + +check('Whitespace at beginning of message', m => /^\s/.test(m)) +check('Title is too long. limit to 72 chars', m => m.trim().split(/\r?\n/, 1)[0].length > 72) +check('Title and body must be separated by a blank line', m => { + const s = m.trim().split(/\r?\n/, 3) + return s[1] != null && !!s[1].length +}) + +if (errors.length) { + const s = errors.length > 1 ? 's' : '' + console.log() + console.log(red + `Error${s} in commit message:` + reset) + errors.forEach(err => { + console.log(' - ' + err) + }) + console.log() + console.log('-'.repeat(72)) + console.log('Original message:') + console.log('='.repeat(72)) + console.log(currentMessage.trimRight()) + console.log('='.repeat(72)) + process.exit(1) +} diff --git a/dev/warn-npm-install.js b/dev/warn-npm-install.js new file mode 100644 index 000000000000..0bda2490db33 --- /dev/null +++ b/dev/warn-npm-install.js @@ -0,0 +1,15 @@ +const fs = require('fs') + +const reset = '\x1b[0m' +const red = '\x1b[31m' +const bright = '\x1b[1m' + +if (fs.existsSync('package-lock.json')) { + console.log() + console.log(`${red}WARNING:${reset}`) + console.log(`This project uses ${bright}Yarn${reset}. Installing its dependencies with ${bright}npm${reset} may result in errors`) + console.log(`Please remove ${bright}package-lock.json${reset} and try again, with yarn this time`) + console.log(`See ${bright}https://yarnpkg.com/${reset}`) + console.log() + process.exit(1) +} diff --git a/index.d.ts b/index.d.ts index 23532eaf6dbe..7c37e2c69d16 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,62 +1,100 @@ -import "vuetify/src/util/helpers"; -import {PluginFunction} from "vue"; +import 'vuetify/src/util/helpers' +import Vue, { PluginFunction } from 'vue' declare class Vuetify { - static install: PluginFunction; -} - -declare class VuetifyApplication { - bar: number; - bottom: number; - left: number; - right: number; - top: number; -} - -declare class VuetifyBreakpoint { - height: number; - lg: boolean; - lgAndDown: boolean; - lgAndUp: boolean; - lgOnly: boolean; - md: boolean; - mdAndDown: boolean; - mdAndUp: boolean; - mdOnly: boolean; - name: string; - sm: boolean; - smAndDown: boolean; - smAndUp: boolean; - smOnly: boolean; - width: number; - xl: boolean; - xlOnly: boolean; - xs: boolean; - xsOnly: boolean; -} - -declare class VuetifyTheme { - primary: string; - accent: string; - secondary: string; - info: string; - warning: string; - error: string; - success: string; -} - -declare class VuetifyObject { - application: VuetifyApplication; - breakpoint: VuetifyBreakpoint; - dark: boolean; - theme: VuetifyTheme; - touchSupport: boolean; -} - -declare module "vue/types/vue" { + static install: PluginFunction +} + +declare interface VuetifyApplication { + bar: number + bottom: number + left: number + right: number + top: number +} + +declare interface VuetifyBreakpoint { + height: number + lg: boolean + lgAndDown: boolean + lgAndUp: boolean + lgOnly: boolean + md: boolean + mdAndDown: boolean + mdAndUp: boolean + mdOnly: boolean + name: string + sm: boolean + smAndDown: boolean + smAndUp: boolean + smOnly: boolean + width: number + xl: boolean + xlOnly: boolean + xs: boolean + xsOnly: boolean +} + +declare interface VuetifyTheme { + primary: VuetifyThemeItem + accent: VuetifyThemeItem + secondary: VuetifyThemeItem + info: VuetifyThemeItem + warning: VuetifyThemeItem + error: VuetifyThemeItem + success: VuetifyThemeItem + + [name: string]: VuetifyThemeItem +} + +declare type VuetifyThemeItem = string | number + +declare interface VuetifyThemeCache { + get: (parsedTheme: VuetifyTheme) => string | null + set: (parsedTheme: VuetifyTheme, css: string) => void +} + +declare interface VuetifyOptions { + themeVariations?: string[] + minifyTheme?: (css: string) => string + themeCache?: VuetifyThemeCache +} + +declare type VuetifyGoToEasing = + ((t: number) => number) | + 'linear' | + 'easeInQuad' | + 'easeOutQuad' | + 'easeInOutQuad' | + 'easeInCubic' | + 'easeOutCubic' | + 'easeInOutCubic' | + 'easeInQuart' | + 'easeOutQuart' | + 'easeInOutQuart' | + 'easeInQuint' | + 'easeOutQuint' | + 'easeInOutQuint' + +declare interface VuetifyGoToOptions { + duration?: number + offset?: number + easing?: VuetifyGoToEasing +} + +declare interface VuetifyObject { + application: VuetifyApplication + breakpoint: VuetifyBreakpoint + dark: boolean + theme: VuetifyTheme + options: VuetifyOptions + goTo: (target: string | number | HTMLElement | Vue, options?: VuetifyGoToOptions) => void +} + +declare module 'vue/types/vue' { interface Vue { - $vuetify: VuetifyObject; + $vuetify: VuetifyObject } } -export default Vuetify; \ No newline at end of file +export default Vuetify diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 8439cdff6e37..000000000000 --- a/package-lock.json +++ /dev/null @@ -1,10845 +0,0 @@ -{ - "name": "vuetify", - "version": "0.17.7", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abab": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", - "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=", - "dev": true - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "dev": true, - "requires": { - "mime-types": "2.1.16", - "negotiator": "0.6.1" - }, - "dependencies": { - "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", - "dev": true - }, - "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "dev": true, - "requires": { - "mime-db": "1.29.0" - } - } - } - }, - "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11" - } - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "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.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.8.2" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "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 - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "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 - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "autoprefixer": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.4.tgz", - "integrity": "sha512-MB1XybOJqu1uAwpfSilAa1wSURNc4W310CFKvMj1fNaJBFxr1PGgz72vZaPr9ryKGqs2vYZ6jDyJ0aiGELjsoA==", - "dev": true, - "requires": { - "browserslist": "2.4.0", - "caniuse-lite": "1.0.30000730", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.11", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "browserslist": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.4.0.tgz", - "integrity": "sha512-aM2Gt4x9bVlCUteADBS6JP0F+2tMWKM1jQzUulVROtdFWFIcIVvY76AJbr7GDqy0eDhn+PcnpzzivGxY4qiaKQ==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000730", - "electron-to-chromium": "1.3.21" - } - }, - "caniuse-lite": { - "version": "1.0.30000730", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000730.tgz", - "integrity": "sha1-JqFP8bO/wfHLTadcLHNFGz8a3ho=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.21", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz", - "integrity": "sha1-qWfr3P6O0Ag/wkTRiUAiqOgRPqI=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.4.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 - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "avoriaz": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/avoriaz/-/avoriaz-4.1.0.tgz", - "integrity": "sha512-bru44Zr9PzEV/62uLB75hYqfr8/lMCoRpDrI8DWU64vaKZd3RZ1sUC5t6Q0qHx/yXtw8LBDgm7LS3v4zDiK5Rg==", - "dev": true, - "requires": { - "lodash": "4.17.4", - "vue-add-globals": "2.0.1" - } - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.11.0", - "convert-source-map": "1.5.0", - "fs-readdir-recursive": "1.0.0", - "glob": "7.1.2", - "lodash": "4.17.4", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.6", - "v8flags": "2.1.1" - }, - "dependencies": { - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - } - } - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - }, - "dependencies": { - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.0.tgz", - "integrity": "sha512-tN1B3adZ3tw8pr9oGsZ18iKCbdKBSvsn9ab6cGdbED+61LpGLhIVcf76eh59XejbdRLTBe+OYezxmYIaTgPiYA==", - "dev": true, - "requires": { - "babel-code-frame": "7.0.0-beta.0", - "babel-traverse": "7.0.0-beta.0", - "babel-types": "7.0.0-beta.0", - "babylon": "7.0.0-beta.22" - }, - "dependencies": { - "babel-code-frame": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", - "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-helper-function-name": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.0.tgz", - "integrity": "sha512-DaQccFBBWBEzMdqbKmNXamY0m1yLHJGOdbbEsNoGdJrrU7wAF3wwowtDDPzF0ZT3SqJXPgZW/P2kgBX9moMuAA==", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "7.0.0-beta.0", - "babel-template": "7.0.0-beta.0", - "babel-traverse": "7.0.0-beta.0", - "babel-types": "7.0.0-beta.0" - } - }, - "babel-helper-get-function-arity": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.0.tgz", - "integrity": "sha512-csqAic15/2Vm1951nJxkkL9K8E6ojyNF/eAOjk7pqJlO8kvgrccGNFCV9eDwcGHDPe5AjvJGwVSAcQ5fit9wuA==", - "dev": true, - "requires": { - "babel-types": "7.0.0-beta.0" - } - }, - "babel-messages": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-7.0.0-beta.0.tgz", - "integrity": "sha512-eXdShsm9ZTh9AQhlIaAn6HR3xWpxCnK9ZwIDA9QyjnwTgMctGxHHflw4b4RJ3/ZjTL0Vrmvm0tQXPkp49mTAUw==", - "dev": true - }, - "babel-template": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.0.tgz", - "integrity": "sha512-tmdH+MmmU0F6Ur8humpevSmFzYKbrN3Oru0g5Qyg4R6+sxjnzZmnvzUbsP0aKMr7tB0Ua6xhEb9arKTOsEMkyA==", - "dev": true, - "requires": { - "babel-traverse": "7.0.0-beta.0", - "babel-types": "7.0.0-beta.0", - "babylon": "7.0.0-beta.22", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", - "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", - "dev": true, - "requires": { - "babel-code-frame": "7.0.0-beta.0", - "babel-helper-function-name": "7.0.0-beta.0", - "babel-messages": "7.0.0-beta.0", - "babel-types": "7.0.0-beta.0", - "babylon": "7.0.0-beta.22", - "debug": "3.0.1", - "globals": "10.1.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", - "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "2.0.0" - } - }, - "babylon": { - "version": "7.0.0-beta.22", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.22.tgz", - "integrity": "sha512-Yl7iT8QGrS8OfR7p6R12AJexQm+brKwrryai4VWZ7NHUbPoZ5al3+klhvl/14shXZiLa7uK//OIFuZ1/RKHgoA==", - "dev": true - }, - "debug": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", - "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-10.1.0.tgz", - "integrity": "sha1-RCWhiBvg0za0qCOoKnvnJdXdmHw=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-define-map": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-jest": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.0.2.tgz", - "integrity": "sha512-7nF+URWcIVX3A9DiLRcuwq86a+Phl+wXN/fwlSO4boTP/GmLLVyIQTui3th7tbA8F3L5xkYEO0e3NSf7oB/BJQ==", - "dev": true, - "requires": { - "babel-plugin-istanbul": "4.1.4", - "babel-preset-jest": "21.0.2" - }, - "dependencies": { - "babel-plugin-jest-hoist": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.0.2.tgz", - "integrity": "sha512-iQeYbiM0lr5TCW42qvGkBBoy0rTx6SPppRFT7NwvdnSwNOGMI8+1Oc27SF5wJbCvAY7x5KScP3f0TKtunl+NRw==", - "dev": true - }, - "babel-preset-jest": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.0.2.tgz", - "integrity": "sha512-WyzCFIoU+ga307hPnobHL9eRrZlpZYHQf7M3yOtimAwrLAgNFoSfin7ZVw903+zz81ZLuowZMKWCd0w3PNpAhg==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "21.0.2" - } - } - } - }, - "babel-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", - "dev": true, - "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-add-filehash": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-add-filehash/-/babel-plugin-add-filehash-6.9.4.tgz", - "integrity": "sha1-jK1uboBWuU7/88xMAOTcfyENAgE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-detective": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-detective/-/babel-plugin-detective-2.0.0.tgz", - "integrity": "sha1-bmQug8IqM1J5dU6+LXVNJjX0nxM=", - "dev": true - }, - "babel-plugin-istanbul": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", - "integrity": "sha1-GN3oS/POMp/d8/QQP66SFFbY5Yc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "istanbul-lib-instrument": "1.7.4", - "test-exclude": "4.1.1" - } - }, - "babel-plugin-module-resolver": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-2.7.1.tgz", - "integrity": "sha1-GL48Qt31n3pFbJ4FEs2ROU9uS+E=", - "dev": true, - "requires": { - "find-babel-config": "1.1.0", - "glob": "7.1.2", - "resolve": "1.3.3" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.24.1", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.23.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", - "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", - "dev": true, - "requires": { - "regenerator-transform": "0.9.11" - } - }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - } - } - }, - "core-js": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", - "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=", - "dev": true - } - } - }, - "babel-preset-env": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", - "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1", - "browserslist": "2.1.5", - "invariant": "2.2.2", - "semver": "5.4.1" - }, - "dependencies": { - "browserslist": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.5.tgz", - "integrity": "sha1-6IJVDfPRzW1IHBo+ADjyuvE6RxE=", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000701", - "electron-to-chromium": "1.3.15" - } - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.23.0" - } - }, - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "dev": true, - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "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": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", - "dev": true - }, - "binary-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", - "dev": true - }, - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", - "dev": true - }, - "bn.js": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==", - "dev": true - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.1.1", - "multicast-dns-service-types": "1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "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.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "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", - "concat-map": "0.0.1" - } - }, - "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.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "1.0.6", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.0" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "randombytes": "2.0.5" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "0.2.9" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000701", - "electron-to-chromium": "1.3.15" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "dev": true, - "requires": { - "node-int64": "0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000701", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - } - }, - "caniuse-db": { - "version": "1.0.30000701", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000701.tgz", - "integrity": "sha1-LjKwaZO/Pb2QtD2T8E4m0Rr93Lo=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000701", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000701.tgz", - "integrity": "sha1-nWc89rdNyz1cIdITF2sBGsakW6o=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "dev": true, - "requires": { - "is-regex": "1.0.4" - } - }, - "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.1", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "ci-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", - "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "circular-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", - "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", - "dev": true - }, - "clap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", - "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=", - "dev": true, - "requires": { - "chalk": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "clean-css": { - "version": "3.4.28", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", - "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", - "dev": true, - "requires": { - "commander": "2.8.1", - "source-map": "0.4.4" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "requires": { - "q": "1.5.0" - } - }, - "coalescy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", - "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true, - "requires": { - "clone": "1.0.2", - "color-convert": "1.9.0", - "color-string": "0.3.0" - } - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.1" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compressible": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", - "dev": true, - "requires": { - "mime-db": "1.29.0" - }, - "dependencies": { - "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", - "dev": true - } - } - }, - "compression": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", - "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", - "dev": true, - "requires": { - "accepts": "1.3.4", - "bytes": "2.5.0", - "compressible": "2.0.11", - "debug": "2.6.8", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.1" - }, - "dependencies": { - "bytes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", - "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", - "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "consolidate": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", - "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", - "dev": true, - "requires": { - "bluebird": "3.5.0" - } - }, - "constantinople": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz", - "integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=", - "dev": true, - "requires": { - "acorn": "3.3.0", - "is-expression": "2.1.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - }, - "is-expression": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz", - "integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=", - "dev": true, - "requires": { - "acorn": "3.3.0", - "object-assign": "4.1.1" - } - } - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", - "dev": true - }, - "content-type-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", - "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.1.3.tgz", - "integrity": "sha1-lSdx6w3dwcs/ovb75RpSLpOz7go=", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "cross-env": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.0.5.tgz", - "integrity": "sha1-Q4PTZNlmCHPdGFs5ivO/717//vM=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "is-windows": "1.0.1" - } - }, - "cross-spawn": { - "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": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.2.14" - } - }, - "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.10.1" - } - }, - "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.12", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" - }, - "dependencies": { - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - } - } - }, - "css-mqpacker": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/css-mqpacker/-/css-mqpacker-6.0.1.tgz", - "integrity": "sha512-pQ40tp4ooLopvkYA8YfQdDAAnoPToP5a3tdOWn6A4VwaJ6tGJLvyC3UEfmfsw9DbX2Ofgk4WBIVW3EZmNYvLYQ==", - "dev": true, - "requires": { - "minimist": "1.2.0", - "postcss": "6.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "3.1.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "2.0.1", - "source-map": "0.5.6", - "supports-color": "4.2.0" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" - }, - "dependencies": { - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000701", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - } - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "1.2.0", - "source-map": "0.5.6" - } - }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.2" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.24" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-gateway": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.0.2.tgz", - "integrity": "sha512-lvDPOoSVibdJqnZNS9OF7SzDrvr5PYVgynPNNqt89lcJWDRnLP3bpzkgFc/5t759YcuNjz9VEpFe5I6NLLrSiQ==", - "dev": true, - "requires": { - "execa": "0.7.0", - "ip-regex": "2.1.0" - } - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "2.0.0" - } - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", - "dev": true - }, - "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", - "dev": true - }, - "diffable-html": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/diffable-html/-/diffable-html-2.1.0.tgz", - "integrity": "sha1-DUwt4RWsWPkEqrG3LmZJzvyl8CU=", - "dev": true, - "requires": { - "htmlparser2": "3.9.2" - } - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "miller-rabin": "4.0.0", - "randombytes": "2.0.5" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", - "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", - "dev": true, - "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - } - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "1.1.1" - } - }, - "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", - "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, - "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz", - "integrity": "sha1-CDl5NIkcvPrrvRi4KpW1pIETg2k=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true, - "requires": { - "prr": "0.0.0" - } - }, - "error-ex": { - "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" - } - }, - "error-stack-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.1.tgz", - "integrity": "sha1-oyArj7AxFKqbQKDjZp5IsrZaAQo=", - "dev": true, - "requires": { - "stackframe": "1.0.3" - } - }, - "es-abstract": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.2.tgz", - "integrity": "sha512-dvhwFL3yjQxNNsOWx6exMlaDrRHCRGMQlnx5lsXDCZ/J7G/frgIIl94zhZSp/galVAYp7VzPi1OrAHta89/yGQ==", - "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.24", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", - "dev": true, - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" - }, - "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.6.1.tgz", - "integrity": "sha1-3cf8f9cL+TIFsLNEm7FqHp59SVA=", - "dev": true, - "requires": { - "ajv": "5.2.2", - "babel-code-frame": "6.22.0", - "chalk": "2.1.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "2.6.8", - "doctrine": "2.0.0", - "eslint-scope": "3.7.1", - "espree": "3.5.0", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "3.2.3", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "4.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.1", - "text-table": "0.2.0" - }, - "dependencies": { - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "espree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", - "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "inquirer": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.3.tgz", - "integrity": "sha512-Bc3KbimpDTOeQdDj18Ir/rlsGuhBSSNqdOnxaAuKhpkdnMMuKsEGbZD2v5KFF9oso2OU+BPh7+/u5obmFDRmWw==", - "dev": true, - "requires": { - "ansi-escapes": "2.0.0", - "chalk": "2.1.0", - "cli-cursor": "2.1.0", - "cli-width": "2.1.0", - "external-editor": "2.0.4", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "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 - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "pluralize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", - "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", - "dev": true - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", - "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - } - } - }, - "eslint-config-standard": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", - "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", - "dev": true - }, - "eslint-config-vue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-vue/-/eslint-config-vue-2.0.2.tgz", - "integrity": "sha1-o6sQBImeSTJ6lMY+JNR6OWsvSEg=", - "dev": true - }, - "eslint-friendly-formatter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz", - "integrity": "sha1-J4h0Q1psRuwdlPoLH/SU4w7wQpA=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "coalescy": "1.0.0", - "extend": "3.0.1", - "minimist": "1.2.0", - "text-table": "0.2.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", - "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", - "dev": true, - "requires": { - "debug": "2.6.8", - "resolve": "1.3.3" - } - }, - "eslint-loader": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", - "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", - "dev": true, - "requires": { - "loader-fs-cache": "1.0.1", - "loader-utils": "1.1.0", - "object-assign": "4.1.1", - "object-hash": "1.1.8", - "rimraf": "2.6.2" - } - }, - "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", - "dev": true, - "requires": { - "debug": "2.6.8", - "pkg-dir": "1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - } - } - }, - "eslint-plugin-html": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-3.2.1.tgz", - "integrity": "sha512-zxcArJx7QTqE0Stm5BMpk1cuYwOxLecqKMqEYabRcvqImDrjcRdQVdXT5RtqFHdH1aVD2akzHe+/Q5Wou6Jvaw==", - "dev": true, - "requires": { - "htmlparser2": "3.9.2", - "semver": "5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz", - "integrity": "sha512-HGYmpU9f/zJaQiKNQOVfHUh2oLWW3STBrCgH0sHTX1xtsxYlH1zjLh8FlQGEIdZSdTbUMaV36WaZ6ImXkenGxQ==", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.1", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.1.1.tgz", - "integrity": "sha512-3xdoEbPyyQNyGhhqttjgSO3cU/non8QDBJF8ttGaHM2h8CaY5zFIngtqW6ZbLEIvhpoFPDVwiQg61b8zanx5zQ==", - "dev": true, - "requires": { - "ignore": "3.3.3", - "minimatch": "3.0.4", - "resolve": "1.3.3", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", - "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", - "dev": true - }, - "eslint-plugin-pug": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-pug/-/eslint-plugin-pug-1.1.0.tgz", - "integrity": "sha1-Zx2T8/pU+gg+mlaQIQtywOCxLH4=", - "dev": true, - "requires": { - "pug-lexer": "3.1.0", - "pug-parser": "2.0.2", - "pug-walk-extract-text": "1.1.0" - } - }, - "eslint-plugin-react": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", - "integrity": "sha1-J3cKzzn1/UnNCvQIPOWBBOs5DUw=", - "dev": true, - "requires": { - "doctrine": "2.0.0", - "has": "1.0.1", - "jsx-ast-utils": "1.4.1" - } - }, - "eslint-plugin-standard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", - "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", - "dev": true - }, - "eslint-plugin-vue": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-2.1.0.tgz", - "integrity": "sha1-UO0LfpojidkOaJdDo8wmtQJEG2k=", - "dev": true, - "requires": { - "eslint-plugin-html": "3.1.0", - "eslint-plugin-react": "7.1.0" - }, - "dependencies": { - "eslint-plugin-html": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-3.1.0.tgz", - "integrity": "sha1-LrmZtIhAtxhO3xyVOXanMwcVHkQ=", - "dev": true, - "requires": { - "htmlparser2": "3.9.2" - } - } - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "estree-walker": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz", - "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24" - } - }, - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, - "requires": { - "original": "1.0.0" - } - }, - "eventsource-polyfill": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", - "integrity": "sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "dev": true, - "requires": { - "create-hash": "1.1.3" - } - }, - "exec-sh": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", - "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=", - "dev": true, - "requires": { - "merge": "1.2.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.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.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "expect": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-21.1.0.tgz", - "integrity": "sha512-gBmUVy+A4+brj/MnuiwLe+MIMfSffWUmZMNjKHrMkB0cpkAjnFdwHAxs6MvYeh4+14ocp+SfKp4ebNEhkbV3YQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "jest-diff": "21.1.0", - "jest-get-type": "21.0.2", - "jest-matcher-utils": "21.1.0", - "jest-message-util": "21.1.0", - "jest-regex-util": "21.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "jest-diff": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.1.0.tgz", - "integrity": "sha512-mGJinKrAB6hj1cpO1FOuDCfgILozGvYi4Zpk8GrxmNgdd9/9llIA2Xzu5879Fa4ayh7lb9ej2NdvuNLMCjbrMg==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "diff": "3.3.0", - "jest-get-type": "21.0.2", - "pretty-format": "21.1.0" - } - }, - "jest-matcher-utils": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.1.0.tgz", - "integrity": "sha512-V/Xindf+VY5UM+oz9Nhsv0Ql93lRcKS7tHtVoXtlXkZXoXpydHwuezkLLCpZkH/Uew5y2OyDZpnlxPvEalJZng==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "jest-get-type": "21.0.2", - "pretty-format": "21.1.0" - } - }, - "jest-message-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.1.0.tgz", - "integrity": "sha512-BwKrjR4HvGoodYw3PFh95IU4qDk3nVOf3LqOKRaaR6486bJM8IZIlxWR8yfxhAN7nDGBDco/TR+U50WcPgzvgA==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "micromatch": "2.3.11", - "slash": "1.0.0" - } - }, - "jest-regex-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.1.0.tgz", - "integrity": "sha512-1QiJa6nvdzVgDhY1FTG3fl+2eYrCQGQoIeGaVPjt9+VmxsQ/BwZD6aglH0z6ZK/uEXZPAaj1XaemKM9tC6VVlQ==", - "dev": true - }, - "pretty-format": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.1.0.tgz", - "integrity": "sha512-041BVxr2pp7uGG8slfw43ysRXSaBIVqo5Li03BwI3K1/9oENlhkEEYWPkHpDzj7NlJ3GZte+Tv/DId5g2PLduA==", - "dev": true, - "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.0" - } - } - } - }, - "express": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", - "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", - "dev": true, - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "content-disposition": "0.5.2", - "content-type": "1.0.2", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.8", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.0", - "finalhandler": "1.0.4", - "fresh": "0.5.0", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.1", - "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.5", - "qs": "6.5.0", - "range-parser": "1.2.0", - "send": "0.15.4", - "serve-static": "1.12.4", - "setprototypeof": "1.0.3", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.0", - "vary": "1.1.1" - }, - "dependencies": { - "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "external-editor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", - "dev": true, - "requires": { - "iconv-lite": "0.4.19", - "jschardet": "1.5.1", - "tmp": "0.0.31" - }, - "dependencies": { - "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 - } - } - }, - "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" - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz", - "integrity": "sha1-kMqnkHvESfM1AF46x1MrQbAN5hI=", - "dev": true, - "requires": { - "async": "2.5.0", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.0.1" - } - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": "0.6.5" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "dev": true, - "requires": { - "bser": "2.0.0" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.2.2", - "object-assign": "4.1.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" - } - }, - "filesize": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.10.tgz", - "integrity": "sha1-/I+iPdtO+eXgq24eZPZ5okpWdh8=", - "dev": true - }, - "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.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.4.tgz", - "integrity": "sha512-16l/r8RgzlXKmFOhZpHBztvye+lAhC5SU7hXavnerC9UfZqZxxXl3BzL8MhffPT3kF61lj9Oav2LKEzh0ei7tg==", - "dev": true, - "requires": { - "debug": "2.6.8", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.1", - "statuses": "1.3.1", - "unpipe": "1.0.0" - } - }, - "find-babel-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", - "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", - "dev": true, - "requires": { - "json5": "0.5.1", - "path-exists": "3.0.0" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.0.0", - "pkg-dir": "2.0.0" - } - }, - "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" - } - }, - "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", - "dev": true, - "requires": { - "circular-json": "0.3.1", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "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.15" - } - }, - "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=", - "dev": true - }, - "fresh": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", - "dev": true - }, - "friendly-errors-webpack-plugin": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.6.1.tgz", - "integrity": "sha1-4yeBxHIvVGoGqbXXp8+ihSA3XXA=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "error-stack-parser": "2.0.1", - "string-length": "1.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "fs-readdir-recursive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", - "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "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.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "dev": true, - "requires": { - "duplexer": "0.1.1" - } - }, - "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true - }, - "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "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 - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.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.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "wbuf": "1.7.2" - } - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", - "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", - "dev": true, - "requires": { - "whatwg-encoding": "1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.6.2", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - } - }, - "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", - "dev": true, - "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dev": true, - "requires": { - "http-proxy": "1.16.2", - "is-glob": "3.1.0", - "lodash": "4.17.4", - "micromatch": "2.3.11" - }, - "dependencies": { - "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": "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.1" - } - } - } - }, - "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.4.0", - "sshpk": "1.13.1" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "humanize": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", - "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ=", - "dev": true - }, - "husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", - "dev": true, - "requires": { - "is-ci": "1.0.10", - "normalize-path": "1.0.0", - "strip-indent": "2.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "6.0.11" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.4.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 - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.8.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-ci": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", - "dev": true, - "requires": { - "ci-info": "1.0.0" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", - "dev": true, - "requires": { - "acorn": "4.0.13", - "object-assign": "4.1.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "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-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "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.1" - } - }, - "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" - } - }, - "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.2.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.1" - } - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true, - "requires": { - "html-comment-regex": "1.1.1" - } - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "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" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-api": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.11.tgz", - "integrity": "sha1-/MC0YeKzvaceMFFVE4I4doJX2d4=", - "dev": true, - "requires": { - "async": "2.5.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.7.4", - "istanbul-lib-report": "1.1.1", - "istanbul-lib-source-maps": "1.2.1", - "istanbul-reports": "1.1.1", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", - "dev": true, - "requires": { - "babel-generator": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" - } - }, - "istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", - "dev": true, - "requires": { - "debug": "2.6.8", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.6" - } - }, - "istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-P8G873A0kW24XRlxHVGhMJBhQ8gWAec+dae7ZxOBzxT4w+a9ATSPvRVK3LB1RAJ9S8bg2tOyWHAGW40Zd2dKfw==", - "dev": true, - "requires": { - "handlebars": "4.0.10" - } - }, - "jest": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-21.1.0.tgz", - "integrity": "sha512-yPxhkAyxCymLkpZakAGm8VGNQB04HgD5bhYCQHBcIGCbH5oYHZDekkt/FBtFC2vPcyWG+dsKCqvmys/1kQYjKA==", - "dev": true, - "requires": { - "jest-cli": "21.1.0" - } - }, - "jest-cli": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.1.0.tgz", - "integrity": "sha512-ISnDjHv9m0nCrSKFC+Cnr9SotaWHYRP+TK81vMtPwkV+/70JbfYJT6ZnuqgqyAnTYE4f/aCe6uyMPKHAVT1RpA==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.1.0", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "is-ci": "1.0.10", - "istanbul-api": "1.1.11", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-instrument": "1.7.4", - "istanbul-lib-source-maps": "1.2.1", - "jest-changed-files": "21.1.0", - "jest-config": "21.1.0", - "jest-environment-jsdom": "21.1.0", - "jest-haste-map": "21.1.0", - "jest-message-util": "21.1.0", - "jest-regex-util": "21.1.0", - "jest-resolve-dependencies": "21.1.0", - "jest-runner": "21.1.0", - "jest-runtime": "21.1.0", - "jest-snapshot": "21.1.0", - "jest-util": "21.1.0", - "micromatch": "2.3.11", - "node-notifier": "5.1.2", - "pify": "3.0.0", - "slash": "1.0.0", - "string-length": "2.0.0", - "strip-ansi": "4.0.0", - "which": "1.2.14", - "worker-farm": "1.4.1", - "yargs": "9.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "jest-changed-files": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.1.0.tgz", - "integrity": "sha512-OnjMoORBVG9Jko6Bc3UGJPx9G1PNsETiqpQXZ6wPU3fk1gtxhKYE4Mgdk28ER/CWeg7bzGUcaragLf1lf1tzbQ==", - "dev": true, - "requires": { - "throat": "4.1.0" - } - }, - "jest-config": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.1.0.tgz", - "integrity": "sha512-RQnWwHRSIRvtyJQeZTpXUmsNYVVr/qu3XWfV3FTFkDsxHQi6Sj5sfUK5FHCNUCXIuFTs+r3qbYoMz2q8rdm/EA==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "glob": "7.1.2", - "jest-environment-jsdom": "21.1.0", - "jest-environment-node": "21.1.0", - "jest-get-type": "21.0.2", - "jest-jasmine2": "21.1.0", - "jest-regex-util": "21.1.0", - "jest-resolve": "21.1.0", - "jest-util": "21.1.0", - "jest-validate": "21.1.0", - "pretty-format": "21.1.0" - } - }, - "jest-diff": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.1.0.tgz", - "integrity": "sha512-mGJinKrAB6hj1cpO1FOuDCfgILozGvYi4Zpk8GrxmNgdd9/9llIA2Xzu5879Fa4ayh7lb9ej2NdvuNLMCjbrMg==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "diff": "3.3.0", - "jest-get-type": "21.0.2", - "pretty-format": "21.1.0" - } - }, - "jest-docblock": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.1.0.tgz", - "integrity": "sha512-ai3olFJ/3cSd60klaRIcC/Cb44/RsJ69qS8uXxfWXEbnbDqjcbl5K8Z5ekfY15hgVZGSAiLz7pOwfjIBE/yJVw==", - "dev": true - }, - "jest-environment-jsdom": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.1.0.tgz", - "integrity": "sha512-sMcGlN11SnnuJKzR5oJ5LsDRzHEBLUeMRImDbvxyusNW9l17wAEsoLuAWbv0W8crZTTwjRO6/mitpNF3PmVsMg==", - "dev": true, - "requires": { - "jest-mock": "21.1.0", - "jest-util": "21.1.0", - "jsdom": "9.12.0" - } - }, - "jest-environment-node": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.1.0.tgz", - "integrity": "sha512-Lv/pcK2zq2DZKL/q7+u8mrlSeXmaMGgmJOx0+Ew+FxYKdSzO0jpEUTEfzQOnMvpSWMqjKUYLDYkCPCBFcOX93w==", - "dev": true, - "requires": { - "jest-mock": "21.1.0", - "jest-util": "21.1.0" - } - }, - "jest-haste-map": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.1.0.tgz", - "integrity": "sha512-a7chVtmpzRgRkYDL4eZgRuXZUlos1JOC7Dam3WryXGiD/1GNj+QONt6jcsAzDZohzs9XYg2EkjyGxIAXcNipBg==", - "dev": true, - "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "21.1.0", - "micromatch": "2.3.11", - "sane": "2.0.0", - "worker-farm": "1.4.1" - } - }, - "jest-jasmine2": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.1.0.tgz", - "integrity": "sha512-YjbAaXN6K5f8rtwPVxkMRIYNZGB5GiJcApcj/5ER7uGJrqJMqyCklMAPZR5Gq8XPzzuDVfoB2h7kxyOGVqaxrw==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "expect": "21.1.0", - "graceful-fs": "4.1.11", - "jest-diff": "21.1.0", - "jest-matcher-utils": "21.1.0", - "jest-message-util": "21.1.0", - "jest-snapshot": "21.1.0", - "p-cancelable": "0.3.0" - } - }, - "jest-matcher-utils": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.1.0.tgz", - "integrity": "sha512-V/Xindf+VY5UM+oz9Nhsv0Ql93lRcKS7tHtVoXtlXkZXoXpydHwuezkLLCpZkH/Uew5y2OyDZpnlxPvEalJZng==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "jest-get-type": "21.0.2", - "pretty-format": "21.1.0" - } - }, - "jest-message-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.1.0.tgz", - "integrity": "sha512-BwKrjR4HvGoodYw3PFh95IU4qDk3nVOf3LqOKRaaR6486bJM8IZIlxWR8yfxhAN7nDGBDco/TR+U50WcPgzvgA==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "micromatch": "2.3.11", - "slash": "1.0.0" - } - }, - "jest-mock": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.1.0.tgz", - "integrity": "sha512-iwING4rMP1rhepAj/MVPHVxGltwwR+Lfmiy9ARevQ7XDZ/zF7h+KPFeOFMSMGvV5/dS05PHhwRjFzrjvkybNLw==", - "dev": true - }, - "jest-regex-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.1.0.tgz", - "integrity": "sha512-1QiJa6nvdzVgDhY1FTG3fl+2eYrCQGQoIeGaVPjt9+VmxsQ/BwZD6aglH0z6ZK/uEXZPAaj1XaemKM9tC6VVlQ==", - "dev": true - }, - "jest-resolve": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.1.0.tgz", - "integrity": "sha512-HKh0pnf2SwR3hDaToONjHrR9ds282QFkxCA9xMet3JpsdLL24oRYMLSQ7jtepZfA6EP+XycRE6RfcMBD8emetg==", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.1.0", - "is-builtin-module": "1.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.1.0.tgz", - "integrity": "sha512-Xj0mzS+Gh6ERgf9ofr5/vuqtyvTh4pAp4aVe6OkiZ4cLxUl6zQ6wByXMX0CLq0hwojFYmwwt+v3+fOAV7PqHPg==", - "dev": true, - "requires": { - "jest-regex-util": "21.1.0" - } - }, - "jest-runtime": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.1.0.tgz", - "integrity": "sha512-BNc1v8Cs6bjnti1JBCSGIJdSI/6MIGMMCiY+MpoyWXhoZGNLkUKGw7073lZtOo0PC/RZcXMDy1DcZXHH7YHKQw==", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-jest": "21.0.2", - "babel-plugin-istanbul": "4.1.4", - "chalk": "2.1.0", - "convert-source-map": "1.5.0", - "graceful-fs": "4.1.11", - "jest-config": "21.1.0", - "jest-haste-map": "21.1.0", - "jest-regex-util": "21.1.0", - "jest-resolve": "21.1.0", - "jest-util": "21.1.0", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "slash": "1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "9.0.0" - } - }, - "jest-snapshot": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.1.0.tgz", - "integrity": "sha512-oYASKqxO/Ghbdd96z/3KSQ1y4YUtqrQVzSKbnz3yjGsi1nu3AXMPmjRCM/CZXL+H+DAIgMirj5Uq0dZOxo6Bnw==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "jest-diff": "21.1.0", - "jest-matcher-utils": "21.1.0", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "21.1.0" - } - }, - "jest-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.1.0.tgz", - "integrity": "sha512-PJxaShBieLpB55NV4+loIZHiOlfZHjAGzVRp9BDzrr2m70UxQViDJenNdz4edJMWXJLjp817t1QrWi+LjcRaKw==", - "dev": true, - "requires": { - "callsites": "2.0.0", - "chalk": "2.1.0", - "graceful-fs": "4.1.11", - "jest-message-util": "21.1.0", - "jest-mock": "21.1.0", - "jest-validate": "21.1.0", - "mkdirp": "0.5.1" - } - }, - "jest-validate": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.1.0.tgz", - "integrity": "sha512-xS0cyErNWpsLFlGkn/b87pk/Mv7J+mCTs8hQ4KmtOIIoM1sHYobXII8AtkoN8FC7E3+Ptxjo+/3xWk6LK1dKcw==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "jest-get-type": "21.0.2", - "leven": "2.1.0", - "pretty-format": "21.1.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pretty-format": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.1.0.tgz", - "integrity": "sha512-041BVxr2pp7uGG8slfw43ysRXSaBIVqo5Li03BwI3K1/9oENlhkEEYWPkHpDzj7NlJ3GZte+Tv/DId5g2PLduA==", - "dev": true, - "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "sane": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.0.0.tgz", - "integrity": "sha1-mct58h9KU6adTQzZV8LbBAJLjrI=", - "dev": true, - "requires": { - "anymatch": "1.3.0", - "exec-sh": "0.2.0", - "fb-watchman": "2.0.0", - "minimatch": "3.0.4", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.10.0" - } - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "1.0.0", - "strip-ansi": "4.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.0.tgz", - "integrity": "sha1-7+WxrT+UvcIEI0EbkGKO7sCyXzw=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "jest-css-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-css-modules/-/jest-css-modules-1.1.0.tgz", - "integrity": "sha1-GTMs92dhjmBS8JAN4l5riFnmW5U=", - "dev": true, - "requires": { - "babel-jest": "16.0.0" - }, - "dependencies": { - "babel-jest": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-16.0.0.tgz", - "integrity": "sha1-NIcprqbWJKR3S4qTTQekDdLP1kA=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-plugin-istanbul": "2.0.3", - "babel-preset-jest": "16.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-2.0.3.tgz", - "integrity": "sha1-JmswS5EJYH1gdIR0OUZ2mC9mDfQ=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "istanbul-lib-instrument": "1.7.4", - "object-assign": "4.1.1", - "test-exclude": "2.1.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-16.0.0.tgz", - "integrity": "sha1-tYyj93CYKn58JbVhSy5X6dr8bnY=", - "dev": true - }, - "babel-preset-jest": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-16.0.0.tgz", - "integrity": "sha1-QXqrwtfZMXD0PCDvHqAUXo9/LbU=", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "16.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "test-exclude": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-2.1.3.tgz", - "integrity": "sha1-qNiWjh2oMmb5hk8oUsVeIg8GQ0o=", - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - } - } - } - }, - "jest-get-type": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.0.2.tgz", - "integrity": "sha512-4KvNzzXMXeapGaMWd+SL5e47zcMn8KTWjom6Fl3avxVXnbKS7abD1p4xWe4ToAZfgNoYNsQ9Av/mnWMnZK/Z4A==", - "dev": true - }, - "jest-runner": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.1.0.tgz", - "integrity": "sha512-EXFqEQRHSo6ksBrT+vRNoBRfIVVepQF56JfTczzXLs+dIKcq3DDKaiMkkehBc2LdHzm/e63qbhz2aeQn64qqlA==", - "dev": true, - "requires": { - "jest-config": "21.1.0", - "jest-docblock": "21.1.0", - "jest-haste-map": "21.1.0", - "jest-jasmine2": "21.1.0", - "jest-message-util": "21.1.0", - "jest-runtime": "21.1.0", - "jest-util": "21.1.0", - "pify": "3.0.0", - "throat": "4.1.0", - "worker-farm": "1.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "jest-config": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.1.0.tgz", - "integrity": "sha512-RQnWwHRSIRvtyJQeZTpXUmsNYVVr/qu3XWfV3FTFkDsxHQi6Sj5sfUK5FHCNUCXIuFTs+r3qbYoMz2q8rdm/EA==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "glob": "7.1.2", - "jest-environment-jsdom": "21.1.0", - "jest-environment-node": "21.1.0", - "jest-get-type": "21.0.2", - "jest-jasmine2": "21.1.0", - "jest-regex-util": "21.1.0", - "jest-resolve": "21.1.0", - "jest-util": "21.1.0", - "jest-validate": "21.1.0", - "pretty-format": "21.1.0" - } - }, - "jest-diff": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.1.0.tgz", - "integrity": "sha512-mGJinKrAB6hj1cpO1FOuDCfgILozGvYi4Zpk8GrxmNgdd9/9llIA2Xzu5879Fa4ayh7lb9ej2NdvuNLMCjbrMg==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "diff": "3.3.0", - "jest-get-type": "21.0.2", - "pretty-format": "21.1.0" - } - }, - "jest-docblock": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.1.0.tgz", - "integrity": "sha512-ai3olFJ/3cSd60klaRIcC/Cb44/RsJ69qS8uXxfWXEbnbDqjcbl5K8Z5ekfY15hgVZGSAiLz7pOwfjIBE/yJVw==", - "dev": true - }, - "jest-environment-jsdom": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.1.0.tgz", - "integrity": "sha512-sMcGlN11SnnuJKzR5oJ5LsDRzHEBLUeMRImDbvxyusNW9l17wAEsoLuAWbv0W8crZTTwjRO6/mitpNF3PmVsMg==", - "dev": true, - "requires": { - "jest-mock": "21.1.0", - "jest-util": "21.1.0", - "jsdom": "9.12.0" - } - }, - "jest-environment-node": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.1.0.tgz", - "integrity": "sha512-Lv/pcK2zq2DZKL/q7+u8mrlSeXmaMGgmJOx0+Ew+FxYKdSzO0jpEUTEfzQOnMvpSWMqjKUYLDYkCPCBFcOX93w==", - "dev": true, - "requires": { - "jest-mock": "21.1.0", - "jest-util": "21.1.0" - } - }, - "jest-haste-map": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.1.0.tgz", - "integrity": "sha512-a7chVtmpzRgRkYDL4eZgRuXZUlos1JOC7Dam3WryXGiD/1GNj+QONt6jcsAzDZohzs9XYg2EkjyGxIAXcNipBg==", - "dev": true, - "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "21.1.0", - "micromatch": "2.3.11", - "sane": "2.0.0", - "worker-farm": "1.4.1" - } - }, - "jest-jasmine2": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.1.0.tgz", - "integrity": "sha512-YjbAaXN6K5f8rtwPVxkMRIYNZGB5GiJcApcj/5ER7uGJrqJMqyCklMAPZR5Gq8XPzzuDVfoB2h7kxyOGVqaxrw==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "expect": "21.1.0", - "graceful-fs": "4.1.11", - "jest-diff": "21.1.0", - "jest-matcher-utils": "21.1.0", - "jest-message-util": "21.1.0", - "jest-snapshot": "21.1.0", - "p-cancelable": "0.3.0" - } - }, - "jest-matcher-utils": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.1.0.tgz", - "integrity": "sha512-V/Xindf+VY5UM+oz9Nhsv0Ql93lRcKS7tHtVoXtlXkZXoXpydHwuezkLLCpZkH/Uew5y2OyDZpnlxPvEalJZng==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "jest-get-type": "21.0.2", - "pretty-format": "21.1.0" - } - }, - "jest-message-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.1.0.tgz", - "integrity": "sha512-BwKrjR4HvGoodYw3PFh95IU4qDk3nVOf3LqOKRaaR6486bJM8IZIlxWR8yfxhAN7nDGBDco/TR+U50WcPgzvgA==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "micromatch": "2.3.11", - "slash": "1.0.0" - } - }, - "jest-mock": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.1.0.tgz", - "integrity": "sha512-iwING4rMP1rhepAj/MVPHVxGltwwR+Lfmiy9ARevQ7XDZ/zF7h+KPFeOFMSMGvV5/dS05PHhwRjFzrjvkybNLw==", - "dev": true - }, - "jest-regex-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.1.0.tgz", - "integrity": "sha512-1QiJa6nvdzVgDhY1FTG3fl+2eYrCQGQoIeGaVPjt9+VmxsQ/BwZD6aglH0z6ZK/uEXZPAaj1XaemKM9tC6VVlQ==", - "dev": true - }, - "jest-resolve": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.1.0.tgz", - "integrity": "sha512-HKh0pnf2SwR3hDaToONjHrR9ds282QFkxCA9xMet3JpsdLL24oRYMLSQ7jtepZfA6EP+XycRE6RfcMBD8emetg==", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.1.0", - "is-builtin-module": "1.0.0" - } - }, - "jest-runtime": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.1.0.tgz", - "integrity": "sha512-BNc1v8Cs6bjnti1JBCSGIJdSI/6MIGMMCiY+MpoyWXhoZGNLkUKGw7073lZtOo0PC/RZcXMDy1DcZXHH7YHKQw==", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-jest": "21.0.2", - "babel-plugin-istanbul": "4.1.4", - "chalk": "2.1.0", - "convert-source-map": "1.5.0", - "graceful-fs": "4.1.11", - "jest-config": "21.1.0", - "jest-haste-map": "21.1.0", - "jest-regex-util": "21.1.0", - "jest-resolve": "21.1.0", - "jest-util": "21.1.0", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "slash": "1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "9.0.0" - } - }, - "jest-snapshot": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.1.0.tgz", - "integrity": "sha512-oYASKqxO/Ghbdd96z/3KSQ1y4YUtqrQVzSKbnz3yjGsi1nu3AXMPmjRCM/CZXL+H+DAIgMirj5Uq0dZOxo6Bnw==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "jest-diff": "21.1.0", - "jest-matcher-utils": "21.1.0", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "21.1.0" - } - }, - "jest-util": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.1.0.tgz", - "integrity": "sha512-PJxaShBieLpB55NV4+loIZHiOlfZHjAGzVRp9BDzrr2m70UxQViDJenNdz4edJMWXJLjp817t1QrWi+LjcRaKw==", - "dev": true, - "requires": { - "callsites": "2.0.0", - "chalk": "2.1.0", - "graceful-fs": "4.1.11", - "jest-message-util": "21.1.0", - "jest-mock": "21.1.0", - "jest-validate": "21.1.0", - "mkdirp": "0.5.1" - } - }, - "jest-validate": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.1.0.tgz", - "integrity": "sha512-xS0cyErNWpsLFlGkn/b87pk/Mv7J+mCTs8hQ4KmtOIIoM1sHYobXII8AtkoN8FC7E3+Ptxjo+/3xWk6LK1dKcw==", - "dev": true, - "requires": { - "chalk": "2.1.0", - "jest-get-type": "21.0.2", - "leven": "2.1.0", - "pretty-format": "21.1.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pretty-format": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.1.0.tgz", - "integrity": "sha512-041BVxr2pp7uGG8slfw43ysRXSaBIVqo5Li03BwI3K1/9oENlhkEEYWPkHpDzj7NlJ3GZte+Tv/DId5g2PLduA==", - "dev": true, - "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "sane": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.0.0.tgz", - "integrity": "sha1-mct58h9KU6adTQzZV8LbBAJLjrI=", - "dev": true, - "requires": { - "anymatch": "1.3.0", - "exec-sh": "0.2.0", - "fb-watchman": "2.0.0", - "minimatch": "3.0.4", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.10.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "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 - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.0.tgz", - "integrity": "sha1-7+WxrT+UvcIEI0EbkGKO7sCyXzw=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "jest-serializer-html": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jest-serializer-html/-/jest-serializer-html-4.0.0.tgz", - "integrity": "sha1-vvxA0rNmkA9KeHfgZEE+hgaaHhY=", - "dev": true, - "requires": { - "diffable-html": "2.1.0" - } - }, - "jest-vue-preprocessor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-vue-preprocessor/-/jest-vue-preprocessor-1.1.0.tgz", - "integrity": "sha512-4GXOJONm+UyqxJAMmYzoXVsTyW+Z7Hln/O5wf19kdaIPrW8zMdzEqwXP+41yHYjBQrrPLacJFxeJyA98987aBg==", - "dev": true, - "requires": { - "babel-plugin-transform-runtime": "6.23.0", - "find-babel-config": "1.1.0", - "typescript": "2.4.2", - "vue-property-decorator": "5.1.1" - } - }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", - "dev": true - }, - "js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jschardet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", - "dev": true - }, - "jsdom": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", - "dev": true, - "requires": { - "abab": "1.0.3", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.1", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "escodegen": "1.8.1", - "html-encoding-sniffer": "1.0.1", - "nwmatcher": "1.4.1", - "parse5": "1.5.1", - "request": "2.81.0", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.2", - "webidl-conversions": "4.0.1", - "whatwg-encoding": "1.0.1", - "whatwg-url": "4.8.0", - "xml-name-validator": "2.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-loader": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", - "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "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", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "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", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "dev": true, - "requires": { - "is-promise": "2.1.0", - "promise": "7.3.1" - } - }, - "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", - "dev": true - }, - "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" - } - }, - "last-call-webpack-plugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz", - "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", - "dev": true, - "requires": { - "lodash": "4.17.4", - "webpack-sources": "1.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "loader-fs-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", - "dev": true, - "requires": { - "find-cache-dir": "0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "loglevel": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.4.1.tgz", - "integrity": "sha1-lbOD+Ro8J1b9SrCTZn5DCRYfK80=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", - "dev": true - }, - "magic-string": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz", - "integrity": "sha1-lw67DacZMwEoX7GqZQ85vdgetFo=", - "dev": true, - "requires": { - "vlq": "0.2.2" - } - }, - "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.4" - } - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" - } - }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "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.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.3" - } - }, - "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", - "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", - "dev": true, - "requires": { - "dns-packet": "1.2.2", - "thunky": "0.1.0" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "node-forge": { - "version": "0.6.33", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", - "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.2", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "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 - } - } - }, - "node-notifier": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", - "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", - "dev": true, - "requires": { - "growly": "1.3.0", - "semver": "5.4.1", - "shellwords": "0.1.0", - "which": "1.2.14" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwmatcher": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.1.tgz", - "integrity": "sha1-eumwew6oBNt+JfBctf5Al9TklJ8=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "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", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-hash": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", - "integrity": "sha1-KKZZz5h9lqTavnhgKJ87UybEoDw=", - "dev": true - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object.assign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", - "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "object-keys": "1.0.11" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "obuf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "opener": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", - "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", - "dev": true - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "dev": true, - "requires": { - "is-wsl": "1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.2" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-Fjn7wyyadPAriuH2DHamDQw5B8GohEWbroBkKoPeP+vSF2PIAPI7WDihi8WieMRb/At4q7Ea7zTKaMDuSoIAAg==", - "dev": true, - "requires": { - "cssnano": "3.10.0", - "last-call-webpack-plugin": "2.1.2" - } - }, - "optimize-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optimize-js/-/optimize-js-1.0.3.tgz", - "integrity": "sha1-QyavhlfEpf8y2vcmYxdU9yq3/bw=", - "dev": true, - "requires": { - "acorn": "3.3.0", - "concat-stream": "1.6.0", - "estree-walker": "0.3.1", - "magic-string": "0.16.0", - "yargs": "4.8.1" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - } - } - } - }, - "optimize-js-plugin": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/optimize-js-plugin/-/optimize-js-plugin-0.0.4.tgz", - "integrity": "sha1-aeemfg9mxp9/wMeyXF0zsttsKBc=", - "dev": true, - "requires": { - "optimize-js": "1.0.3", - "webpack-sources": "0.1.5" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "webpack-sources": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz", - "integrity": "sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A=", - "dev": true, - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.5.6" - } - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", - "dev": true, - "requires": { - "url-parse": "1.0.5" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "dev": true, - "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" - } - } - } - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "p-map": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", - "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=", - "dev": true - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "pbkdf2": "3.0.12" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", - "dev": true - }, - "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pbkdf2": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", - "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "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 - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "dev": true, - "requires": { - "async": "1.5.2", - "debug": "2.6.8", - "mkdirp": "0.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "postcss": { - "version": "5.2.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.1.9", - "source-map": "0.5.6", - "supports-color": "3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "uniqid": "4.1.1" - } - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "requires": { - "cosmiconfig": "2.1.3", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "dev": true, - "requires": { - "cosmiconfig": "2.1.3", - "object-assign": "4.1.1" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dev": true, - "requires": { - "cosmiconfig": "2.1.3", - "object-assign": "4.1.1" - } - }, - "postcss-loader": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-1.3.3.tgz", - "integrity": "sha1-piHqH6KQYqg5cqRvVEhncTAZFus=", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-load-config": "1.2.0" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.17", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-selector-parser": "2.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "requires": { - "postcss": "6.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "3.1.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "2.0.1", - "source-map": "0.5.6", - "supports-color": "4.2.0" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "3.1.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "2.0.1", - "source-map": "0.5.6", - "supports-color": "4.2.0" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "3.1.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "2.0.1", - "source-map": "0.5.6", - "supports-color": "4.2.0" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "3.1.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "2.0.1", - "source-map": "0.5.6", - "supports-color": "4.2.0" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "dev": true, - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "dev": true, - "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.7.4.tgz", - "integrity": "sha1-XoYkrpNjyA+V7GRFhOzfVddPk/o=", - "dev": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "progress-bar-webpack-plugin": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.10.0.tgz", - "integrity": "sha1-4LEGOqA8eeKYqTQFmFkLth7++aQ=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "object.assign": "4.0.4", - "progress": "1.1.8" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "2.0.6" - } - }, - "proxy-addr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", - "dev": true, - "requires": { - "forwarded": "0.1.0", - "ipaddr.js": "1.4.0" - } - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" - } - }, - "pug": { - "version": "2.0.0-rc.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz", - "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==", - "dev": true, - "requires": { - "pug-code-gen": "2.0.0", - "pug-filters": "2.1.5", - "pug-lexer": "3.1.0", - "pug-linker": "3.0.3", - "pug-load": "2.0.9", - "pug-parser": "4.0.0", - "pug-runtime": "2.0.3", - "pug-strip-comments": "1.0.2" - }, - "dependencies": { - "pug-code-gen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz", - "integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==", - "dev": true, - "requires": { - "constantinople": "3.1.0", - "doctypes": "1.1.0", - "js-stringify": "1.0.2", - "pug-attrs": "2.0.2", - "pug-error": "1.3.2", - "pug-runtime": "2.0.3", - "void-elements": "2.0.1", - "with": "5.1.1" - } - }, - "pug-filters": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz", - "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==", - "dev": true, - "requires": { - "clean-css": "3.4.28", - "constantinople": "3.1.0", - "jstransformer": "1.0.0", - "pug-error": "1.3.2", - "pug-walk": "1.1.5", - "resolve": "1.3.3", - "uglify-js": "2.8.29" - } - }, - "pug-linker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz", - "integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==", - "dev": true, - "requires": { - "pug-error": "1.3.2", - "pug-walk": "1.1.5" - } - }, - "pug-load": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz", - "integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "pug-walk": "1.1.5" - } - }, - "pug-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz", - "integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==", - "dev": true, - "requires": { - "pug-error": "1.3.2", - "token-stream": "0.0.1" - } - }, - "pug-walk": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz", - "integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA==", - "dev": true - } - } - }, - "pug-attrs": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz", - "integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=", - "dev": true, - "requires": { - "constantinople": "3.1.0", - "js-stringify": "1.0.2", - "pug-runtime": "2.0.3" - } - }, - "pug-error": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", - "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=", - "dev": true - }, - "pug-lexer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz", - "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=", - "dev": true, - "requires": { - "character-parser": "2.2.0", - "is-expression": "3.0.0", - "pug-error": "1.3.2" - } - }, - "pug-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pug-loader/-/pug-loader-2.3.0.tgz", - "integrity": "sha1-uGkpRBOiIY8KfdkqlT5ZIoNnbBA=", - "dev": true, - "requires": { - "loader-utils": "0.2.17", - "pug-walk": "1.1.3", - "resolve": "1.3.3" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, - "pug-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-2.0.2.tgz", - "integrity": "sha1-U6aAz9BQOdywwn0CkJS8SnkmibA=", - "dev": true, - "requires": { - "pug-error": "1.3.2", - "token-stream": "0.0.1" - } - }, - "pug-runtime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz", - "integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o=", - "dev": true - }, - "pug-strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz", - "integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=", - "dev": true, - "requires": { - "pug-error": "1.3.2" - } - }, - "pug-walk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.3.tgz", - "integrity": "sha1-181bI9s8qHxjbIaglz+c2OAwQ2w=", - "dev": true - }, - "pug-walk-extract-text": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pug-walk-extract-text/-/pug-walk-extract-text-1.1.0.tgz", - "integrity": "sha1-2irPO16TQMfSax/aHLiFHUPymmw=", - "dev": true, - "requires": { - "pug-walk": "1.1.3" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "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.2.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", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - } - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "dev": true, - "requires": { - "balanced-match": "0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "reflect-metadata": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", - "dev": true - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regenerator-transform": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "private": "0.1.7" - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "0.6.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.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "ress": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ress/-/ress-1.2.2.tgz", - "integrity": "sha1-T9AGgcjTzqp59d4eVKqtFWF+l3c=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "3.1.2" - } - }, - "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 - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "5.2.2" - }, - "dependencies": { - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", - "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", - "dev": true, - "requires": { - "node-forge": "0.6.33" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "send": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", - "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", - "dev": true, - "requires": { - "debug": "2.6.8", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.0", - "fresh": "0.5.0", - "http-errors": "1.6.2", - "mime": "1.3.4", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - } - }, - "serialize-javascript": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", - "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", - "dev": true - }, - "serve-index": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", - "integrity": "sha1-0rKA/FYNYW7oG0i/D6gqvtJIXOc=", - "dev": true, - "requires": { - "accepts": "1.3.4", - "batch": "0.6.1", - "debug": "2.6.8", - "escape-html": "1.0.3", - "http-errors": "1.6.2", - "mime-types": "2.1.15", - "parseurl": "1.3.1" - } - }, - "serve-static": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", - "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", - "dev": true, - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.1", - "send": "0.15.4" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", - "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", - "dev": true, - "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } - }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", - "dev": true, - "requires": { - "debug": "2.6.8", - "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.1.9" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": "0.6.5" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "dev": true, - "requires": { - "source-map": "0.5.6" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", - "dev": true, - "requires": { - "debug": "2.6.8", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.0.20" - } - }, - "spdy-transport": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", - "dev": true, - "requires": { - "debug": "2.6.8", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1", - "wbuf": "1.7.2" - } - }, - "sprintf-js": { - "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.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "stackframe": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.3.tgz", - "integrity": "sha1-/mSrILFw5M5JBEsSbBGd+g5dx8w=", - "dev": true - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", - "dev": true, - "requires": { - "strip-ansi": "3.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "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.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" - } - }, - "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", - "dev": true, - "requires": { - "css-parse": "1.7.0", - "debug": "2.6.8", - "glob": "7.0.6", - "mkdirp": "0.5.1", - "sax": "0.5.8", - "source-map": "0.1.43" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "stylus-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.1.tgz", - "integrity": "sha1-d/SzT9Aw0lsmF7z1UT21sHMMQIk=", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "lodash.clonedeep": "4.5.0", - "when": "3.6.4" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "dev": true, - "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true - }, - "test-exclude": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", - "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", - "dev": true - }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", - "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.15" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.6", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.1" - } - }, - "ultron": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=", - "dev": true - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "dev": true, - "requires": { - "macaddress": "0.2.8" - } - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", - "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", - "dev": true, - "requires": { - "querystringify": "1.0.0", - "requires-port": "1.0.0" - }, - "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", - "dev": true - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", - "dev": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "vary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=", - "dev": true - }, - "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", - "dev": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "vlq": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", - "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "vue": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.4.tgz", - "integrity": "sha512-AHCPCJdPe/hP0lEd1j4KKyM5J5Qmihr5eL94AJMbfgSofxXF8izd3dcvLLBSRm1EhCqYf1RhUAKua0uOsp6xGA==", - "dev": true - }, - "vue-add-globals": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/vue-add-globals/-/vue-add-globals-2.0.1.tgz", - "integrity": "sha512-NvpO+te1DsZfZq9ecPR6lJrsVm+d+R2yTgQZUEme9zS23Q+wfGYojIPgBkr7Z0ZCv3OpbEG+xd/3KSiB856QOg==", - "dev": true - }, - "vue-class-component": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-5.0.2.tgz", - "integrity": "sha512-wgI/SKRozqADIeMGN16PXiHBa/cnRD7JcuYt7P4JHcMIMc2BdUw02pQ+EQmsui0tN2kRVZGwZ8h4Yb2Vbf4w0w==", - "dev": true - }, - "vue-hot-reload-api": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.2.3.tgz", - "integrity": "sha512-LNdf9SYan0S8DurNuMzBE6yZGI8B42CRvpm7OtyH3OkhYYlNZOqcLAYsPszsxKnLfo5p93Oszw4qSwbHTJdrow==", - "dev": true - }, - "vue-loader": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.5.0.tgz", - "integrity": "sha512-O0+ZU1oyLlDXSAQB7pV/pwVt3wJLfyhXtnGpCVFBGMKGC0Yp9Un7ULFHKejrFEYaMBKY0s6h4iJzjMdSngNA2g==", - "dev": true, - "requires": { - "consolidate": "0.14.5", - "hash-sum": "1.0.2", - "loader-utils": "1.1.0", - "lru-cache": "4.1.1", - "postcss": "6.0.14", - "postcss-load-config": "1.2.0", - "postcss-selector-parser": "2.2.3", - "prettier": "1.7.4", - "resolve": "1.5.0", - "source-map": "0.6.1", - "vue-hot-reload-api": "2.2.3", - "vue-style-loader": "3.0.3", - "vue-template-es2015-compiler": "1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", - "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.0" - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "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": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "vue-property-decorator": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-5.1.1.tgz", - "integrity": "sha1-jTslWBWN5riuixWcoxD3DsJK1L4=", - "dev": true, - "requires": { - "reflect-metadata": "0.1.10", - "vue-class-component": "5.0.2" - } - }, - "vue-router": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz", - "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==", - "dev": true - }, - "vue-server-renderer": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.5.4.tgz", - "integrity": "sha512-KuGemAcE6r9BZUxgfJyGY1946uRgVwULf+5t6e0c3zSZ8qcPsl6xgqPyvF65wuPmnAh2BJ6rxzdc8JwAPmLXqg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "hash-sum": "1.0.2", - "he": "1.1.1", - "lodash.template": "4.4.0", - "lodash.uniq": "4.5.0", - "resolve": "1.3.3", - "serialize-javascript": "1.4.0", - "source-map": "0.5.6" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "vue-style-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.0.3.tgz", - "integrity": "sha512-P/ihpaZKU23T1kq3E0y4c+F8sbm1HQO69EFYoLoGMSGVAHroHsGir/WQ9qUavP8dyFYHmXenzHaJ/nqd8vfaxw==", - "dev": true, - "requires": { - "hash-sum": "1.0.2", - "loader-utils": "1.1.0" - } - }, - "vue-template-compiler": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.4.tgz", - "integrity": "sha512-EOKW96eTxlcVAooCAYMLjuFZEcKXj7abCWjQaRJtcSApJEtBmo7ShmyBnJhYCpSSKzB9Fd6cXhvKmbLz2FZxsA==", - "dev": true, - "requires": { - "de-indent": "1.0.2", - "he": "1.1.1" - } - }, - "vue-template-es2015-compiler": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz", - "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", - "dev": true - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.11" - } - }, - "watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", - "dev": true - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "2.5.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - } - }, - "wbuf": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", - "dev": true, - "requires": { - "minimalistic-assert": "1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", - "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=", - "dev": true - }, - "webpack": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz", - "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==", - "dev": true, - "requires": { - "acorn": "5.1.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.2", - "ajv-keywords": "2.1.0", - "async": "2.5.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.0.3", - "json-loader": "0.5.4", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.0.0", - "source-map": "0.5.6", - "supports-color": "4.4.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.0.1", - "yargs": "8.0.2" - }, - "dependencies": { - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "enhanced-resolve": { - "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.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "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 - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.0.tgz", - "integrity": "sha1-tYvDTMMLJ//brz0AvyerpvopxuM=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "chalk": "1.1.3", - "commander": "2.9.0", - "ejs": "2.5.7", - "express": "4.15.4", - "filesize": "3.5.10", - "gzip-size": "3.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "opener": "1.4.3", - "ws": "2.3.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "webpack-bundle-size-analyzer": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-size-analyzer/-/webpack-bundle-size-analyzer-2.7.0.tgz", - "integrity": "sha1-LsBTn9V/hxYIOJizi4kv6UyIxrw=", - "dev": true, - "requires": { - "commander": "2.9.0", - "filesize": "3.5.10", - "humanize": "0.0.9" - } - }, - "webpack-dev-middleware": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", - "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", - "dev": true, - "requires": { - "memory-fs": "0.4.1", - "mime": "1.3.4", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" - } - }, - "webpack-dev-server": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.8.2.tgz", - "integrity": "sha512-wD9bs+Z1uwvf3Jc+8ZkyMI0Xi+aJJYjC2UZplOWoo/vStelK5Mv62X2uXYEYIQEjy9wJQMzC0fEFqQsg7vVEIg==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.0", - "connect-history-api-fallback": "1.3.0", - "del": "3.0.0", - "express": "4.15.4", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "internal-ip": "2.0.2", - "ip": "1.1.5", - "loglevel": "1.4.1", - "opn": "5.1.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.1", - "serve-index": "1.9.0", - "sockjs": "0.3.18", - "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "4.4.0", - "webpack-dev-middleware": "1.12.0", - "yargs": "6.6.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "p-map": "1.1.1", - "pify": "3.0.0", - "rimraf": "2.6.2" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "internal-ip": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-2.0.2.tgz", - "integrity": "sha512-1OBR5z3Te0FrUtpsPP04XQ2Tsgj+AwujBioVtM9WVW/Jyoe7xR3BIfWnnmg1eUwRuYFelIJM9mQwB7u3bLXD7Q==", - "dev": true, - "requires": { - "default-gateway": "2.0.2", - "ipaddr.js": "1.5.2" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "webpack-merge": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.0.tgz", - "integrity": "sha1-atciI7PguDflMeRZfBmfkJNhUR4=", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.5.6" - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": "0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", - "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", - "dev": true, - "requires": { - "iconv-lite": "0.4.13" - } - }, - "whatwg-url": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", - "dev": true, - "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - } - } - }, - "when": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", - "dev": true - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", - "dev": true, - "requires": { - "acorn": "3.3.0", - "acorn-globals": "3.1.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "worker-farm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.4.1.tgz", - "integrity": "sha512-tgFAtgOYLPutkAyzgpS6VJFL5HY+0ui1Tvua+fITgz8ByaJTMFGtazR6xxQfwfiAcbwE+2fLG/K49wc2TfwCNw==", - "dev": true, - "requires": { - "errno": "0.1.4", - "xtend": "4.0.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "write-file-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/write-file-webpack-plugin/-/write-file-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-KkFZtNeeuSjig5sACrd0n1ybrpd4CS8P5J2TGEklS7UGGlz+iISAxJf426XwaQ2TTlTAq1LTXRBWTTEYjy5e4A==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "debug": "2.6.8", - "filesize": "3.5.10", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "moment": "2.18.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", - "dev": true, - "requires": { - "safe-buffer": "5.0.1", - "ultron": "1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - } - } - }, - "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } -} diff --git a/package.json b/package.json index 6c6b19e0fb77..be6f9330a720 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { "name": "vuetify", - "version": "0.17.7", + "version": "1.0.0-beta.6", "author": { "name": "John Leider", "email": "john@vuetifyjs.com" }, "license": "MIT", "homepage": "http://vuetifyjs.com", + "repository": "vuetifyjs/vuetify", "main": "dist/vuetify.js", "unpkg": "dist/vuetify.js", "types": "index.d.ts", @@ -18,88 +19,85 @@ "build:dist": "rimraf dist && cross-env NODE_ENV=production webpack --config build/config.js --progress --hide-modules", "build:es5": "rimraf es5 && cross-env NODE_ENV=es5 babel src --out-dir es5", "debug-build": "node --inspect --debug-brk build/config.js", - "debug:test": "./node_modules/.bin/cross-env NODE_ENV=test node --inspect --inspect-brk ./node_modules/jest/bin/jest.js --no-cache --runInBand --verbose", - "test": "cross-env NODE_ENV=test jest -i", - "test:coverage": "cross-env NODE_ENV=test jest -i --coverage", + "debug:test": "cross-env NODE_ENV=test node --inspect --inspect-brk ./node_modules/jest/bin/jest.js --no-cache -i --verbose", + "test": "node build/run-tests.js", + "test:unix": "cross-env NODE_ENV=test jest", + "test:win32": "cross-env NODE_ENV=test jest -i", + "test:coverage": "cross-env NODE_ENV=test jest --coverage", "lint": "eslint --ext .js,.vue src", "preparecommitmsg": "node dev/prepare-commit-message.js", - "precommit": "yarn run lint && yarn test", - "prepush": "yarn run lint && yarn test", - "prepare": "git update-index --skip-worktree .env" + "commitmsg": "node dev/lint-commit-message.js", + "precommit": "node dev/warn-npm-install.js && yarn lint && yarn test" }, "description": "Vue.js 2 Semantic Component Framework", "devDependencies": { - "autoprefixer": "^7.1.4", - "avoriaz": "^4.1.0", - "babel-cli": "^6.26.0", - "babel-core": "^6.26.0", - "babel-eslint": "^8.0.0", - "babel-jest": "^21.0.2", - "babel-loader": "^7.1.2", - "babel-plugin-add-filehash": "^6.9.4", - "babel-plugin-detective": "^2.0.0", - "babel-plugin-module-resolver": "^2.7.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-polyfill": "^6.26.0", - "babel-preset-env": "^1.5.1", - "babel-preset-es2015": "^6.24.1", - "babel-preset-stage-2": "^6.24.1", - "cross-env": "^5.0.5", - "cross-spawn": "^5.1.0", - "css-loader": "^0.28.7", - "css-mqpacker": "^6.0.1", - "cssnano": "^3.10.0", - "dotenv": "^4.0.0", - "eslint": "^4.6.1", - "eslint-config-standard": "^10.2.1", - "eslint-config-vue": "^2.0.2", - "eslint-friendly-formatter": "^3.0.0", - "eslint-loader": "^1.6.1", - "eslint-plugin-html": "^3.2.1", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-node": "^5.1.1", - "eslint-plugin-promise": "^3.4.0", - "eslint-plugin-pug": "^1.0.0", + "autoprefixer": "7.2.5", + "avoriaz": "6.3.0", + "babel-cli": "6.26.0", + "babel-core": "6.26.0", + "babel-eslint": "8.2.1", + "babel-jest": "22.1.0", + "babel-loader": "7.1.2", + "babel-plugin-add-filehash": "6.9.5", + "babel-plugin-detective": "2.0.0", + "babel-plugin-module-resolver": "3.0.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-runtime": "6.23.0", + "babel-polyfill": "6.26.0", + "babel-preset-env": "1.6.1", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-2": "6.24.1", + "cross-env": "5.1.1", + "cross-spawn": "5.1.0", + "css-loader": "0.28.8", + "css-mqpacker": "6.0.1", + "cssnano": "3.10.0", + "dotenv": "4.0.0", + "eslint": "4.15.0", + "eslint-config-standard": "^11.0.0-beta.0", + "eslint-friendly-formatter": "3.0.0", + "eslint-loader": "1.9.0", + "eslint-plugin-import": "^2.8.0", + "eslint-plugin-node": "^5.2.1", + "eslint-plugin-promise": "^3.6.0", "eslint-plugin-standard": "^3.0.1", - "eslint-plugin-vue": "^2.1.0", - "eventsource-polyfill": "^0.9.6", - "extract-text-webpack-plugin": "^3.0.0", - "friendly-errors-webpack-plugin": "^1.6.1", - "function-bind": "^1.1.1", - "husky": "^0.14.3", - "inquirer": "^4.0.1", - "jest": "^21.1.0", - "jest-cli": "^21.1.0", - "jest-css-modules": "^1.1.0", - "jest-serializer-html": "^4.0.0", - "jest-vue-preprocessor": "^1.1.0", - "optimize-css-assets-webpack-plugin": "^3.2.0", - "optimize-js-plugin": "^0.0.4", - "postcss-loader": "^1.3.3", - "progress-bar-webpack-plugin": "^1.10.0", - "pug": "^2.0.0-rc.4", - "pug-loader": "^2.3.0", - "ress": "^1.1.1", - "rimraf": "^2.6.2", - "semver": "^5.4.1", - "serialize-javascript": "^1.3.0", - "shelljs": "^0.7.8", - "style-loader": "^0.18.2", - "stylus": "^0.54.5", - "stylus-loader": "^3.0.1", - "uglifyjs-webpack-plugin": "^0.4.6", - "vue": "^2.5.4", - "vue-loader": "^13.5.0", - "vue-router": "^3.0.1", - "vue-server-renderer": "^2.5.4", - "vue-template-compiler": "^2.5.4", - "webpack": "^3.6.0", - "webpack-bundle-analyzer": "^2.9.0", - "webpack-bundle-size-analyzer": "^2.7.0", - "webpack-dev-server": "^2.8.2", - "webpack-merge": "^4.1.0", - "write-file-webpack-plugin": "^4.1.0" + "eventsource-polyfill": "0.9.6", + "extract-text-webpack-plugin": "3.0.2", + "friendly-errors-webpack-plugin": "1.6.1", + "function-bind": "1.1.1", + "husky": "0.14.3", + "inquirer": "5.0.0", + "jest": "21.2.1", + "jest-cli": "21.2.1", + "jest-css-modules": "1.1.0", + "jest-serializer-html": "5.0.0", + "jest-vue-preprocessor": "1.3.1", + "optimize-css-assets-webpack-plugin": "3.2.0", + "optimize-js-plugin": "0.0.4", + "postcss-loader": "2.0.10", + "progress-bar-webpack-plugin": "1.10.0", + "pug": "2.0.0-rc.4", + "pug-loader": "2.3.0", + "ress": "1.2.2", + "rimraf": "2.6.2", + "semver": "5.4.1", + "serialize-javascript": "1.4.0", + "shelljs": "0.8.0", + "style-loader": "0.19.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.1", + "uglifyjs-webpack-plugin": "1.1.6", + "vue": "2.5.11", + "vue-loader": "13.7.0", + "vue-router": "3.0.1", + "vue-server-renderer": "2.5.11", + "vue-template-compiler": "2.5.11", + "webpack": "3.10.0", + "webpack-bundle-analyzer": "2.9.2", + "webpack-bundle-size-analyzer": "2.7.0", + "webpack-dev-server": "^2.11.1", + "webpack-merge": "4.1.1", + "write-file-webpack-plugin": "4.2.0" }, "dependencies": {}, "peerDependencies": { @@ -122,7 +120,11 @@ "node_modules" ], "moduleNameMapper": { - "src/(.*)": "/src/$1" + "src/(.*)": "/src/$1", + "^@components/(.*)$": "/src/components/$1", + "^@directives/(.*)$": "/src/directives/$1", + "^@mixins/(.*)$": "/src/mixins/$1", + "^@util/(.*)$": "/src/util/$1" }, "transform": { ".*\\.(vue)$": "/node_modules/jest-vue-preprocessor", diff --git a/src/components/VAlert/VAlert.js b/src/components/VAlert/VAlert.js index 1f7c6b3fbb70..89f8637d42b7 100644 --- a/src/components/VAlert/VAlert.js +++ b/src/components/VAlert/VAlert.js @@ -1,4 +1,4 @@ -require('../../stylus/components/_alerts.styl') +import '../../stylus/components/_alerts.styl' import VIcon from '../VIcon' @@ -38,14 +38,14 @@ export default { computed: { classes () { - const colorProp = (this.type && !this.color) ? 'type' : 'computedColor' + const color = (this.type && !this.color) ? this.type : this.computedColor const classes = { 'alert--dismissible': this.dismissible, 'alert--outline': this.outline } - return this.outline ? this.addTextColorClassChecks(classes, colorProp) - : this.addBackgroundColorClassChecks(classes, colorProp) + return this.outline ? this.addTextColorClassChecks(classes, color) + : this.addBackgroundColorClassChecks(classes, color) }, computedIcon () { if (this.icon || !this.type) return this.icon diff --git a/src/components/VAlert/VAlert.spec.js b/src/components/VAlert/VAlert.spec.js index ed9c23f9d069..3e2a7a80eab4 100644 --- a/src/components/VAlert/VAlert.spec.js +++ b/src/components/VAlert/VAlert.spec.js @@ -1,6 +1,6 @@ -import { test } from '~util/testing' -import VAlert from '~components/VAlert' -import VIcon from '~components/VIcon' +import { test } from '@util/testing' +import VAlert from '@components/VAlert' +import VIcon from '@components/VIcon' test('VAlert.vue', ({ mount }) => { it('should be closed by default', async () => { @@ -18,6 +18,24 @@ test('VAlert.vue', ({ mount }) => { expect(wrapper.html()).toMatchSnapshot() }) + it('should render component with transition', async () => { + const wrapper = mount(VAlert, { + propsData: { transition: 'foo' } + }) + + wrapper.setProps({ value: true }) + await wrapper.vm.$nextTick() + expect(wrapper.hasClass('foo-enter')).toBe(true) + }) + + it('should render component with outline prop', async () => { + const wrapper = mount(VAlert, { + propsData: { outline: true } + }) + + expect(wrapper.hasClass('alert--outline')).toBe(true) + }) + it('should be dismissible', async () => { const wrapper = mount(VAlert, { propsData: { diff --git a/src/components/VAlert/__snapshots__/VAlert.spec.js.snap b/src/components/VAlert/__snapshots__/VAlert.spec.js.snap index 6421dd5abd32..1a71b954dae5 100644 --- a/src/components/VAlert/__snapshots__/VAlert.spec.js.snap +++ b/src/components/VAlert/__snapshots__/VAlert.spec.js.snap @@ -20,7 +20,7 @@ exports[`VAlert.vue should be dismissible 1`] = `
@@ -38,7 +38,7 @@ exports[`VAlert.vue should have a close icon 1`] = ` diff --git a/src/components/VApp/VApp.js b/src/components/VApp/VApp.js index 86c4ce44fa63..879021f41205 100644 --- a/src/components/VApp/VApp.js +++ b/src/components/VApp/VApp.js @@ -1,4 +1,4 @@ -require('../../stylus/components/_app.styl') +import '../../stylus/components/_app.styl' // Component level mixins import AppTheme from './mixins/app-theme' @@ -7,16 +7,12 @@ import AppBreakpoint from './mixins/app-breakpoint' // Directives import Resize from '../../directives/resize' -// Utilities -import PointerSupport from '../../util/pointerSupport' - export default { name: 'v-app', mixins: [ AppBreakpoint, - AppTheme, - PointerSupport + AppTheme ], directives: { diff --git a/src/components/VApp/VApp.spec.js b/src/components/VApp/VApp.spec.js index e6648702ddf2..9b5814d9cbe2 100644 --- a/src/components/VApp/VApp.spec.js +++ b/src/components/VApp/VApp.spec.js @@ -1,5 +1,5 @@ -import VApp from '~components/VApp' -import { test } from '~util/testing' +import VApp from '@components/VApp' +import { test } from '@util/testing' test('VApp.js', ({ mount }) => { it('should match a snapshot', () => { @@ -26,4 +26,27 @@ test('VApp.js', ({ mount }) => { expect(app.getAttribute('id')).toBe('inspire') expect(wrapper.html()).toMatchSnapshot() }) + + it('should watch dark prop', async () => { + const wrapper = mount(VApp, { + propsData: { + dark: true + } + }) + + expect(wrapper.vm.$vuetify.dark).toBe(true) + wrapper.setProps({ + dark: false + }) + expect(wrapper.vm.$vuetify.dark).toBe(false) + }) + + it('should watch theme', async () => { + const wrapper = mount(VApp) + + expect(wrapper.vm.style).toMatchSnapshot() + wrapper.vm.$vuetify.theme.primary = '#000' + await wrapper.vm.$nextTick() + expect(wrapper.vm.style).toMatchSnapshot() + }) }) diff --git a/src/components/VApp/__snapshots__/VApp.spec.js.snap b/src/components/VApp/__snapshots__/VApp.spec.js.snap index 5c4330f052ed..76c4f7c1518b 100644 --- a/src/components/VApp/__snapshots__/VApp.spec.js.snap +++ b/src/components/VApp/__snapshots__/VApp.spec.js.snap @@ -23,3 +23,973 @@ exports[`VApp.js should match a snapshot 1`] = ` `; + +exports[`VApp.js should watch theme 1`] = ` + +`; + +exports[`VApp.js should watch theme 2`] = ` + +`; diff --git a/src/components/VApp/mixins/app-breakpoint.js b/src/components/VApp/mixins/app-breakpoint.js index b5645ba318a2..2128d37e24ad 100644 --- a/src/components/VApp/mixins/app-breakpoint.js +++ b/src/components/VApp/mixins/app-breakpoint.js @@ -26,7 +26,8 @@ const breakpoint = { data () { return { clientWidth: clientDimensions.getWidth(), - clientHeight: clientDimensions.getHeight() + clientHeight: clientDimensions.getHeight(), + resizeTimeout: null } }, @@ -114,8 +115,16 @@ const breakpoint = { methods: { onResize () { - this.clientWidth = clientDimensions.getWidth() - this.clientHeight = clientDimensions.getHeight() + clearTimeout(this.resizeTimeout) + + // Added debounce to match what + // v-resize used to do but was + // removed due to a memory leak + // https://github.com/vuetifyjs/vuetify/pull/2997 + this.resizeTimeout = setTimeout(() => { + this.clientWidth = clientDimensions.getWidth() + this.clientHeight = clientDimensions.getHeight() + }, 200) } } } diff --git a/src/components/VApp/mixins/app-breakpoint.spec.js b/src/components/VApp/mixins/app-breakpoint.spec.js index 7003a7a16c36..12f15571ac09 100644 --- a/src/components/VApp/mixins/app-breakpoint.spec.js +++ b/src/components/VApp/mixins/app-breakpoint.spec.js @@ -1,5 +1,5 @@ -import VApp from '~components/VApp' -import { test } from '~util/testing' +import VApp from '@components/VApp' +import { test } from '@util/testing' test('breakpoint.js', ({ mount }) => { const scenarios = [ diff --git a/src/components/VApp/mixins/app-theme.js b/src/components/VApp/mixins/app-theme.js index 2f5bc2a654c8..346032ac79d1 100644 --- a/src/components/VApp/mixins/app-theme.js +++ b/src/components/VApp/mixins/app-theme.js @@ -1,64 +1,76 @@ +import { intToHex } from '../../../util/colorUtils' +import * as Theme from '../../../util/theme' + export default { data: () => ({ style: null }), + computed: { + parsedTheme () { + return Theme.parse(this.$vuetify.theme) + } + }, + watch: { - '$vuetify.theme': { - deep: true, - handler () { - this.applyTheme() - } + parsedTheme () { + this.applyTheme() } }, created () { - if (typeof document === 'undefined') { - this.$ssrContext && !this.$ssrContext._styles && (this.$ssrContext._styles = {}) - return this.$ssrContext && this.$ssrContext._styles && - (this.$ssrContext._styles['vuetify-theme-stylesheet'] = { - ids: ['vuetify-theme-stylesheet'], - css: this.genColors(this.$vuetify.theme), - media: '' - }) + if (typeof document === 'undefined' && this.$ssrContext) { + this.$ssrContext.head = this.$ssrContext.head || '' + this.$ssrContext.head += `` + } else if (typeof document !== 'undefined') { + this.genStyle() + this.applyTheme() } - this.genStyle() - this.applyTheme() }, methods: { applyTheme () { - this.style.innerHTML = this.genColors(this.$vuetify.theme) + this.style.innerHTML = this.genColors(this.parsedTheme) }, genColors (theme) { - const colors = Object.keys(theme).map(key => { - const value = theme[key] + let css - return ( - this.genBackgroundColor(key, value) + - this.genTextColor(key, value) - ) - }) + if (this.$vuetify.options.themeCache != null) { + css = this.$vuetify.options.themeCache.get(theme) + if (css != null) return css + } - colors.push(this.genAnchorColor(this.$vuetify.theme.primary)) + const colors = Object.keys(theme) + css = `a { color: ${intToHex(theme.primary)}; }` - return colors.join('') - }, - genAnchorColor (color) { - return `.application a{color: ${color};}` - }, - genBackgroundColor (key, value) { - return `.${key}{background-color:${value} !important;border-color:${value} !important;}` - }, - genTextColor (key, value) { - return `.${key}--text{color:${value} !important;}` + for (let i = 0; i < colors.length; ++i) { + const name = colors[i] + const value = theme[name] + if (this.$vuetify.options.themeVariations.includes(name)) { + css += Theme.genVariations(name, value).join('') + } else { + css += Theme.genBaseColor(name, value) + } + } + + if (this.$vuetify.options.minifyTheme != null) { + css = this.$vuetify.options.minifyTheme(css) + } + + if (this.$vuetify.options.themeCache != null) { + this.$vuetify.options.themeCache.set(theme, css) + } + + return css }, genStyle () { - let style = document.querySelector('[data-vue-ssr-id=vuetify-theme-stylesheet]') + let style = document.querySelector('[data-vue-ssr-id=vuetify-theme-stylesheet]') || + document.getElementById('vuetify-theme-stylesheet') if (!style) { style = document.createElement('style') style.type = 'text/css' + style.id = 'vuetify-theme-stylesheet' document.head.appendChild(style) } diff --git a/src/components/VAvatar/VAvatar.js b/src/components/VAvatar/VAvatar.js index 0e7568fdb999..eb183b4f5b39 100644 --- a/src/components/VAvatar/VAvatar.js +++ b/src/components/VAvatar/VAvatar.js @@ -1,14 +1,19 @@ -require('../../stylus/components/_avatars.styl') +import '../../stylus/components/_avatars.styl' + +// Mixins +import Colorable from '../../mixins/colorable' export default { name: 'v-avatar', functional: true, + mixins: [Colorable], + props: { size: { - type: String, - default: '48px' + type: [Number, String], + default: 48 }, tile: Boolean }, @@ -19,8 +24,13 @@ export default { if (props.tile) data.staticClass += ' avatar--tile' - data.style.height = props.size - data.style.width = props.size + const size = `${parseInt(props.size)}px` + data.style.height = size + data.style.width = size + data.class = [ + data.class, + Colorable.methods.addBackgroundColorClassChecks.call(props, {}, props.color) + ] return h('div', data, children) } diff --git a/src/components/VAvatar/VAvatar.spec.js b/src/components/VAvatar/VAvatar.spec.js index 75da8bed32cd..ce5451fa7227 100644 --- a/src/components/VAvatar/VAvatar.spec.js +++ b/src/components/VAvatar/VAvatar.spec.js @@ -1,5 +1,5 @@ -import VAvatar from '~components/VAvatar' -import { test } from '~util/testing' +import VAvatar from '@components/VAvatar' +import { test } from '@util/testing' test('VAvatar.vue', ({ mount, functionalContext }) => { it('should have an avatar class', () => { @@ -8,4 +8,32 @@ test('VAvatar.vue', ({ mount, functionalContext }) => { expect(wrapper.hasClass('avatar')).toBe(true) expect(wrapper.html()).toMatchSnapshot() }) + + it('should have an proper class with tile prop', () => { + const wrapper = mount(VAvatar, functionalContext({ + props: { + tile: true + } + })) + + expect(wrapper.hasClass('avatar--tile')).toBe(true) + }) + + it('should accept custom or no class declarations', () => { + const wrapper = mount(VAvatar, functionalContext()) + const wrapperTwo = mount(VAvatar, functionalContext({ + class: 'active' + })) + const wrapperThree = mount(VAvatar, functionalContext({ + class: ['active'] + })) + const wrapperFour = mount(VAvatar, functionalContext({ + class: { 'active': true } + })) + + expect(wrapper.hasClass('active')).toBe(false) + expect(wrapperTwo.hasClass('active')).toBe(true) + expect(wrapperThree.hasClass('active')).toBe(true) + expect(wrapperFour.hasClass('active')).toBe(true) + }) }) diff --git a/src/components/VBadge/VBadge.js b/src/components/VBadge/VBadge.js index 08cb4b322159..5b4424ab7b76 100644 --- a/src/components/VBadge/VBadge.js +++ b/src/components/VBadge/VBadge.js @@ -1,21 +1,21 @@ -require('../../stylus/components/_badges.styl') +import '../../stylus/components/_badges.styl' // Mixins import Colorable from '../../mixins/colorable' import Toggleable from '../../mixins/toggleable' +import { factory as PositionableFactory } from '../../mixins/positionable' +import Transitionable from '../../mixins/transitionable' export default { name: 'v-badge', - mixins: [Colorable, Toggleable], + mixins: [Colorable, Toggleable, PositionableFactory(['left', 'bottom']), Transitionable], props: { - bottom: Boolean, color: { type: String, default: 'primary' }, - left: Boolean, overlap: Boolean, transition: { type: String, @@ -54,7 +54,9 @@ export default { this.$slots.default, h('transition', { props: { - name: this.transition + name: this.transition, + origin: this.origin, + mode: this.mode } }, badge) ]) diff --git a/src/components/VBadge/VBadge.spec.js b/src/components/VBadge/VBadge.spec.js index ff5f8abf1a41..8bd22c099033 100755 --- a/src/components/VBadge/VBadge.spec.js +++ b/src/components/VBadge/VBadge.spec.js @@ -1,9 +1,7 @@ -import { mount } from 'avoriaz' -import { compileToFunctions } from 'vue-template-compiler' -import VBadge from '~components/VBadge' -import { test } from '~util/testing' +import VBadge from '@components/VBadge' +import { test } from '@util/testing' -test('VBadge.js', () => { +test('VBadge.js', ({ mount, compileToFunctions }) => { it('should render component and match snapshot', async () => { const wrapper = mount(VBadge, { slots: { diff --git a/src/components/VBottomNav/VBottomNav.js b/src/components/VBottomNav/VBottomNav.js index 88589a8c0eb2..9b6c519348fb 100644 --- a/src/components/VBottomNav/VBottomNav.js +++ b/src/components/VBottomNav/VBottomNav.js @@ -1,4 +1,5 @@ -require('../../stylus/components/_bottom-navs.styl') +// Styles +import '../../stylus/components/_bottom-navs.styl' // Mixins import Applicationable from '../../mixins/applicationable' @@ -9,18 +10,21 @@ export default { name: 'v-bottom-nav', mixins: [ - Applicationable, + Applicationable('bottom', [ + 'height', + 'value' + ]), ButtonGroup, Colorable ], - data: () => ({ - defaultColor: 'primary' - }), - props: { - absolute: Boolean, active: [Number, String], + height: { + default: 56, + type: [Number, String], + validator: v => !isNaN(parseInt(v)) + }, shift: Boolean, value: { required: false } }, @@ -34,11 +38,14 @@ export default { computed: { classes () { return { - 'bottom-nav': true, 'bottom-nav--absolute': this.absolute, + 'bottom-nav--fixed': !this.absolute && (this.app || this.fixed), 'bottom-nav--shift': this.shift, 'bottom-nav--active': this.value } + }, + computedHeight () { + return parseInt(this.height) } }, @@ -47,20 +54,30 @@ export default { const item = this.getValue(i) return this.active === item }, + /** + * Update the application layout + * + * @return {number} + */ updateApplication () { - if (!this.app) return - - this.$vuetify.application.bottom = this.$el.clientHeight + return !this.value + ? 0 + : this.computedHeight }, updateValue (i) { const item = this.getValue(i) + this.$emit('update:active', item) } }, render (h) { return h('div', { + staticClass: 'bottom-nav', class: this.addBackgroundColorClassChecks(this.classes), + style: { + height: `${parseInt(this.computedHeight)}px` + }, ref: 'content' }, this.$slots.default) } diff --git a/src/components/VBottomNav/VBottomNav.spec.js b/src/components/VBottomNav/VBottomNav.spec.js index 89b4cbe8a98b..b5809b92bcd6 100644 --- a/src/components/VBottomNav/VBottomNav.spec.js +++ b/src/components/VBottomNav/VBottomNav.spec.js @@ -1,6 +1,23 @@ import VBottomNav from './VBottomNav' import VBtn from '../VBtn' -import { test } from '~util/testing' +import { test } from '@util/testing' +import Vue from 'vue' + +function createBtn (val = null) { + const options = { + props: { flat: true } + } + if (val) options.attrs = { value: val } + + return Vue.component('test', { + components: { + VBtn + }, + render (h) { + return h('v-btn', options) + } + }) +} test('VBottomNav.js', ({ mount }) => { it('should have a bottom-nav class', () => { @@ -58,7 +75,10 @@ test('VBottomNav.js', ({ mount }) => { const wrapper = mount(VBottomNav, { propsData: { value: true, active: 1 }, slots: { - default: [VBtn, VBtn] + default: [ + createBtn(), + createBtn() + ] } }) @@ -70,4 +90,36 @@ test('VBottomNav.js', ({ mount }) => { btn.trigger('click') expect(change).toBeCalledWith(0) }) + + it('should set the application bottom', () => { + const wrapper = mount(VBottomNav, { + propsData: { + app: true, + height: 80, + value: true + }, + slots: { + default: [VBtn, VBtn] + } + }) + + expect(wrapper.vm.$vuetify.application.bottom).toBe(80) + }) + + it('should emit update when active changes', async () => { + const update = jest.fn() + const wrapper = mount(VBottomNav, { + slots: { + default: [VBtn, VBtn] + } + }) + + wrapper.vm.$on('update:active', update) + + const btn = wrapper.find('.btn')[1] + btn.trigger('click') + + await wrapper.vm.$nextTick() + expect(update).toBeCalledWith(1) + }) }) diff --git a/src/components/VBottomNav/__snapshots__/VBottomNav.spec.js.snap b/src/components/VBottomNav/__snapshots__/VBottomNav.spec.js.snap index 3f19840254ed..8235d76a228f 100644 --- a/src/components/VBottomNav/__snapshots__/VBottomNav.spec.js.snap +++ b/src/components/VBottomNav/__snapshots__/VBottomNav.spec.js.snap @@ -2,17 +2,17 @@ exports[`VBottomNav.js should be hidden with a false value 1`] = ` -
+
`; @@ -13,7 +11,6 @@ exports[`VBtn.js should render an tag when using href prop 1`] = `
@@ -25,7 +22,6 @@ exports[`VBtn.js should render component and match snapshot 1`] = ` + +`; + +exports[`VBtn.js should render component with color prop and match snapshot 2`] = ` + + + +`; -
+ +
+ + + + +
+
+
+
+ + +`; + +exports[`VBtn.js should render component with loader slot and match snapshot 1`] = ` + + + +`; + +exports[`VBtn.js should render specified tag when using tag prop 1`] = ` + +
+
+
`; diff --git a/src/components/VBtnToggle/VBtnToggle.js b/src/components/VBtnToggle/VBtnToggle.js index f74df96d0620..3e0d974ea2bc 100644 --- a/src/components/VBtnToggle/VBtnToggle.js +++ b/src/components/VBtnToggle/VBtnToggle.js @@ -1,4 +1,4 @@ -require('../../stylus/components/_button-toggle.styl') +import '../../stylus/components/_button-toggle.styl' import ButtonGroup from '../../mixins/button-group' import Themeable from '../../mixins/themeable' @@ -17,10 +17,6 @@ export default { inputValue: { required: false }, - items: { - type: Array, - default: () => [] - }, mandatory: Boolean, multiple: Boolean }, @@ -80,12 +76,6 @@ export default { } }, - mounted () { - if (this.items.length > 0) { - console.warn('The \'items\' props has been deprecated. v-btn-toggle now has a default slot where you can place buttons.') - } - }, - render (h) { return h('div', { class: this.classes }, this.$slots.default) } diff --git a/src/components/VBtnToggle/VBtnToggle.spec.js b/src/components/VBtnToggle/VBtnToggle.spec.js index 7cbe35278972..86e556b1af38 100644 --- a/src/components/VBtnToggle/VBtnToggle.spec.js +++ b/src/components/VBtnToggle/VBtnToggle.spec.js @@ -1,13 +1,12 @@ -import { mount } from 'avoriaz' import VBtnToggle from './VBtnToggle' import VBtn from '../VBtn' import VIcon from '../VIcon' -import { test } from '~util/testing' -import Vue from 'vue/dist/vue.common' +import { test } from '@util/testing' +import Vue from 'vue' -function createBtn (val = null) { +function createBtn (val = null, buttonProps = {}) { const options = { - props: { flat: true } + props: Object.assign({ flat: true }, buttonProps) } if (val) options.attrs = { value: val } @@ -22,8 +21,25 @@ function createBtn (val = null) { }) } -test('VBtnToggle.vue', () => { - it('should not allow empty value when mandatory prop is used', () => { +function createFakeBtn() { + return Vue.component('v-btn', { + inject: ['buttonGroup'], + methods: { + testUnregister() { + this.buttonGroup.unregister(this) + } + }, + mounted() { + this.buttonGroup.register(this) + }, + render (h) { + return h('div') + } + }) +} + +test('VBtnToggle.vue', ({ mount }) => { + it('should not allow empty value when mandatory prop is used', async () => { const wrapper = mount(VBtnToggle, { propsData: { inputValue: 0, @@ -43,11 +59,13 @@ test('VBtnToggle.vue', () => { wrapper.instance().updateValue(0) + await wrapper.vm.$nextTick() + expect(change).not.toBeCalled() expect(wrapper.html()).toMatchSnapshot() }) - it('should allow new value when mandatory prop is used', () => { + it('should allow new value when mandatory prop is used', async () => { const wrapper = mount(VBtnToggle, { propsData: { inputValue: 1, @@ -67,11 +85,13 @@ test('VBtnToggle.vue', () => { wrapper.instance().updateValue(0) + await wrapper.vm.$nextTick() + expect(change).toBeCalledWith(0) expect(wrapper.html()).toMatchSnapshot() }) - it('should not allow empty value when mandatory prop is used with multiple prop', () => { + it('should not allow empty value when mandatory prop is used with multiple prop', async () => { const wrapper = mount(VBtnToggle, { propsData: { inputValue: [1], @@ -92,11 +112,13 @@ test('VBtnToggle.vue', () => { wrapper.instance().updateValue(1) + await wrapper.vm.$nextTick() + expect(change).not.toBeCalled() expect(wrapper.html()).toMatchSnapshot() }) - it('should allow new value when mandatory prop is used with multiple prop', () => { + it('should allow new value when mandatory prop is used with multiple prop', async () => { const wrapper = mount(VBtnToggle, { propsData: { inputValue: [1], @@ -117,11 +139,13 @@ test('VBtnToggle.vue', () => { wrapper.instance().updateValue(2) + await wrapper.vm.$nextTick() + expect(change).toBeCalledWith([1, 2]) expect(wrapper.html()).toMatchSnapshot() }) - it('should use button value attribute if available', () => { + it('should use button value attribute if available', async () => { const wrapper = mount(VBtnToggle, { propsData: { inputValue: 'center' @@ -140,11 +164,13 @@ test('VBtnToggle.vue', () => { wrapper.instance().updateValue(2) + await wrapper.vm.$nextTick() + expect(change).toBeCalledWith('right') expect(wrapper.html()).toMatchSnapshot() }) - it('should allow deselecting a value when mandatory prop is used with multiple prop', () => { + it('should allow deselecting a value when mandatory prop is used with multiple prop', async () => { const wrapper = mount(VBtnToggle, { propsData: { inputValue: [1, 2], @@ -165,11 +191,62 @@ test('VBtnToggle.vue', () => { wrapper.instance().updateValue(2) + await wrapper.vm.$nextTick() + expect(change).toBeCalledWith([1]) expect(wrapper.html()).toMatchSnapshot() }) - it('should have btn with data-only-child if only one selected', () => { + it('should preserve mandatory invariant when selected child is unregistered', async () => { + const wrapper = mount(VBtnToggle, { + propsData: { + inputValue: 1, + mandatory: true + }, + slots: { + default: [ + createBtn(), + createFakeBtn() + ] + } + }) + + const change = jest.fn() + wrapper.instance().$on('change', change) + + wrapper.vm.$children[1].testUnregister() + wrapper.update() + + await wrapper.vm.$nextTick() + + expect(change).toBeCalledWith(0) + }) + + it('should not set new value when not mandatory and selected child is unregistered', async () => { + const wrapper = mount(VBtnToggle, { + propsData: { + inputValue: 1, + }, + slots: { + default: [ + createBtn(), + createFakeBtn() + ] + } + }) + + const change = jest.fn() + wrapper.instance().$on('change', change) + + wrapper.vm.$children[1].testUnregister() + wrapper.update() + + await wrapper.vm.$nextTick() + + expect(change).not.toBeCalled() + }) + + it('should have btn with data-only-child if only one selected', async () => { const wrapper = mount(VBtnToggle, { propsData: { inputValue: 0 @@ -187,9 +264,9 @@ test('VBtnToggle.vue', () => { expect(btn.getAttribute('data-only-child')).toBe('true') }) - // TODO: change never fires - it.skip('should toggle values of any type', async () => { + it('should toggle values of any type', async () => { const values = [true, false, null, 6, 'foo', { key: 'value' }, ['arrayyy']] + const verifyValues = [true, 1, 2, 6, 'foo', { key: 'value' }, ['arrayyy']] const buttons = values.map(v => createBtn(v)) const wrapper = mount(VBtnToggle, { propsData: { @@ -198,16 +275,40 @@ test('VBtnToggle.vue', () => { slots: { default: buttons } }) - const change = jest.fn(value => { - wrapper.setProps({ inputValue: value }) - }) + const change = jest.fn() wrapper.vm.$on('change', change) - for (const button of wrapper.find(VBtn)) { + wrapper.find('button').forEach((button, i) => { button.trigger('click') - expect(change).toBeCalledWith(button.vm.value) - } + + expect(change).toBeCalledWith(verifyValues[i]) + }) expect(wrapper.html()).toMatchSnapshot() }) + + it('should toggle active state of button', async () => { + const wrapper = mount(VBtnToggle, { + propsData: { + inputValue: 'foo' + }, + slots: { + default: [ + createBtn('foo', { color: 'error' }), + createBtn('bar', { color: 'success' }) + ] + } + }) + + await wrapper.vm.$nextTick() + + expect(wrapper.vm.buttons[0].$data.isActive).toBe(true) + expect(wrapper.vm.buttons[1].$data.isActive).toBe(false) + + wrapper.setProps({ inputValue: 'bar' }) + await wrapper.vm.$nextTick() + + expect(wrapper.vm.buttons[0].$data.isActive).toBe(false) + expect(wrapper.vm.buttons[1].$data.isActive).toBe(true) + }) }) diff --git a/src/components/VBtnToggle/__snapshots__/VBtnToggle.spec.js.snap b/src/components/VBtnToggle/__snapshots__/VBtnToggle.spec.js.snap index 1fed89b5b2ba..c59829bc3969 100644 --- a/src/components/VBtnToggle/__snapshots__/VBtnToggle.spec.js.snap +++ b/src/components/VBtnToggle/__snapshots__/VBtnToggle.spec.js.snap @@ -5,37 +5,32 @@ exports[`VBtnToggle.vue should allow deselecting a value when mandatory prop is
+
+ +`; + +exports[`VBtnToggle.vue should toggle values of any type 1`] = ` + +
+ + + + + + +
- - -
`; -exports[`VCarousel.js should render component with custom left control icon and match snapshot 1`] = ` +exports[`VCarousel.js should render component with custom next icon and match snapshot 1`] = ` @@ -51,9 +49,89 @@ exports[`Vslider.vue should match a snapshot 1`] = `
-
+
+
+ +`; + +exports[`Vslider.vue should render component with thumbLabel and match a snapshot 1`] = ` + +
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +`; + +exports[`Vslider.vue should render component with ticks and match a snapshot 1`] = ` + +
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+
+
+
+
+
+
`; diff --git a/src/components/VSnackbar/VSnackbar.js b/src/components/VSnackbar/VSnackbar.js index 5cc6d57eb92e..53890c7b2acb 100644 --- a/src/components/VSnackbar/VSnackbar.js +++ b/src/components/VSnackbar/VSnackbar.js @@ -1,22 +1,13 @@ -require('../../stylus/components/_snackbars.styl') - -import { - VSlideYTransition, - VSlideYReverseTransition -} from '../transitions' +import '../../stylus/components/_snackbars.styl' import Colorable from '../../mixins/colorable' import Toggleable from '../../mixins/toggleable' +import { factory as PositionableFactory } from '../../mixins/positionable' export default { name: 'v-snackbar', - components: { - VSlideYTransition, - VSlideYReverseTransition - }, - - mixins: [Colorable, Toggleable], + mixins: [Colorable, Toggleable, PositionableFactory(['absolute', 'top', 'bottom', 'left', 'right'])], data () { return { @@ -25,12 +16,8 @@ export default { }, props: { - absolute: Boolean, - bottom: Boolean, - left: Boolean, + autoHeight: Boolean, multiLine: Boolean, - right: Boolean, - top: Boolean, // TODO: change this to closeDelay to match other API in delayable.js timeout: { type: Number, @@ -41,19 +28,17 @@ export default { computed: { classes () { - return this.addBackgroundColorClassChecks({ + return { 'snack--active': this.isActive, 'snack--absolute': this.absolute, + 'snack--auto-height': this.autoHeight, 'snack--bottom': this.bottom || !this.top, 'snack--left': this.left, 'snack--multi-line': this.multiLine && !this.vertical, 'snack--right': this.right, 'snack--top': this.top, 'snack--vertical': this.vertical - }) - }, - computedTransition () { - return this.top ? 'v-slide-y-transition' : 'v-slide-y-reverse-transition' + } } }, @@ -83,15 +68,26 @@ export default { const children = [] if (this.isActive) { - children.push(h('div', { - staticClass: 'snack__content' - }, this.$slots.default)) + children.push( + h('div', { + staticClass: 'snack', + class: this.classes, + on: this.$listeners + }, [ + h('div', { + staticClass: 'snack__wrapper', + class: this.addBackgroundColorClassChecks() + }, [ + h('div', { + staticClass: 'snack__content' + }, this.$slots.default) + ]) + ]) + ) } - return h('div', { - staticClass: 'snack', - 'class': this.classes, - on: this.$listeners - }, [h(this.computedTransition, children)]) + return h('transition', { + attrs: { name: 'snack-transition' } + }, children) } } diff --git a/src/components/VSnackbar/VSnackbar.spec.js b/src/components/VSnackbar/VSnackbar.spec.js index 81bd5740ef32..b96b1ff4e232 100644 --- a/src/components/VSnackbar/VSnackbar.spec.js +++ b/src/components/VSnackbar/VSnackbar.spec.js @@ -1,22 +1,27 @@ -import { mount } from 'avoriaz' -import VSnackbar from '~components/VSnackbar' +import { test } from '@util/testing' +import VSnackbar from '@components/VSnackbar' -describe('VSnackbar.vue', () => { +test('VSnackbar.vue', ({ mount }) => { it('should have a snack class', () => { - const wrapper = mount(VSnackbar) + const wrapper = mount(VSnackbar, { + propsData: { + value: true + } + }) expect(wrapper.hasClass('snack')).toBe(true) }) - it('should have a color class', () => { + it('should have a snack__wrapper with a color class', () => { const wrapper = mount(VSnackbar, { propsData: { + value: true, color: 'orange lighten-2' } }) - expect(wrapper.hasClass('orange')).toBe(true) - expect(wrapper.hasClass('lighten-2')).toBe(true) + expect(wrapper.find('.snack__wrapper.orange')).toHaveLength(1) + expect(wrapper.find('.snack__wrapper.lighten-2')).toHaveLength(1) }) it('should have a snack__content class only when active', async () => { diff --git a/src/components/VSpeedDial/VSpeedDial.js b/src/components/VSpeedDial/VSpeedDial.js index d71ef4ebbd4a..2d51231e0c0d 100644 --- a/src/components/VSpeedDial/VSpeedDial.js +++ b/src/components/VSpeedDial/VSpeedDial.js @@ -1,14 +1,15 @@ -require('../../stylus/components/_speed-dial.styl') +import '../../stylus/components/_speed-dial.styl' import Toggleable from '../../mixins/toggleable' import Positionable from '../../mixins/positionable' +import Transitionable from '../../mixins/transitionable' import ClickOutside from '../../directives/click-outside' export default { name: 'v-speed-dial', - mixins: [Positionable, Toggleable], + mixins: [Positionable, Toggleable, Transitionable], directives: { ClickOutside }, @@ -16,11 +17,11 @@ export default { direction: { type: String, default: 'top', - validator: (val) => { + validator: val => { return ['top', 'right', 'bottom', 'left'].includes(val) } }, - hover: Boolean, + openOnHover: Boolean, transition: { type: String, default: 'scale-transition' @@ -47,14 +48,15 @@ export default { const data = { 'class': this.classes, directives: [{ - name: 'click-outside' + name: 'click-outside', + value: () => (this.isActive = false) }], on: { click: () => (this.isActive = !this.isActive) } } - if (this.hover) { + if (this.openOnHover) { data.on.mouseenter = () => (this.isActive = true) data.on.mouseleave = () => (this.isActive = false) } @@ -71,6 +73,8 @@ export default { 'class': 'speed-dial__list', props: { name: this.transition, + mode: this.mode, + origin: this.origin, tag: 'div' } }, children) diff --git a/src/components/VSpeedDial/VSpeedDial.spec.js b/src/components/VSpeedDial/VSpeedDial.spec.js index 1645b796972f..c7d4b723275d 100644 --- a/src/components/VSpeedDial/VSpeedDial.spec.js +++ b/src/components/VSpeedDial/VSpeedDial.spec.js @@ -1,5 +1,6 @@ -import VSpeedDial from '~components/VSpeedDial' -import { test } from '~util/testing' +import VSpeedDial from '@components/VSpeedDial' +import { test } from '@util/testing' +import { compileToFunctions } from 'vue-template-compiler' test('VSpeedDial.js', ({ mount }) => { it('should render component and match snapshot', () => { @@ -8,6 +9,19 @@ test('VSpeedDial.js', ({ mount }) => { expect(wrapper.html()).toMatchSnapshot() }) + it('should render active component and match snapshot', () => { + const wrapper = mount(VSpeedDial, { + slots: { + default: [compileToFunctions('test')] + }, + data: { + isActive: true + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + it('should render component with custom direction and match snapshot', () => { const wrapper = mount(VSpeedDial, { propsData: { @@ -17,4 +31,26 @@ test('VSpeedDial.js', ({ mount }) => { expect(wrapper.html()).toMatchSnapshot() }) + + it('should activate on click', () => { + const wrapper = mount(VSpeedDial) + + expect(wrapper.vm.isActive).toBe(false) + wrapper.trigger('click') + expect(wrapper.vm.isActive).toBe(true) + }) + + it('should activate on hover', () => { + const wrapper = mount(VSpeedDial, { + propsData: { + openOnHover: true + } + }) + + expect(wrapper.vm.isActive).toBe(false) + wrapper.trigger('mouseenter') + expect(wrapper.vm.isActive).toBe(true) + wrapper.trigger('mouseleave') + expect(wrapper.vm.isActive).toBe(false) + }) }) diff --git a/src/components/VSpeedDial/__snapshots__/VSpeedDial.spec.js.snap b/src/components/VSpeedDial/__snapshots__/VSpeedDial.spec.js.snap index 6459c450154b..6e8fd3837e8c 100644 --- a/src/components/VSpeedDial/__snapshots__/VSpeedDial.spec.js.snap +++ b/src/components/VSpeedDial/__snapshots__/VSpeedDial.spec.js.snap @@ -1,5 +1,17 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`VSpeedDial.js should render active component and match snapshot 1`] = ` + +
+
+ + test + +
+
+ +`; + exports[`VSpeedDial.js should render component and match snapshot 1`] = `
diff --git a/src/components/VStepper/VStepper.js b/src/components/VStepper/VStepper.js index aa46724ea2a3..a34e0c35c3ac 100644 --- a/src/components/VStepper/VStepper.js +++ b/src/components/VStepper/VStepper.js @@ -1,4 +1,4 @@ -require('../../stylus/components/_steppers.styl') +import '../../stylus/components/_steppers.styl' import Themeable from '../../mixins/themeable' @@ -47,8 +47,12 @@ export default { watch: { inputValue (val, prev) { this.isReverse = Number(val) < Number(prev) - this.steps.forEach(i => i.toggle(this.inputValue)) - this.content.forEach(i => i.toggle(this.inputValue, this.isReverse)) + for (let index = this.steps.length; --index >= 0;) { + this.steps[index].toggle(this.inputValue) + } + for (let index = this.content.length; --index >= 0;) { + this.content[index].toggle(this.inputValue, this.isReverse) + } this.$emit('input', this.inputValue) prev && (this.isBooted = true) @@ -69,14 +73,15 @@ export default { getSteps () { this.steps = [] this.content = [] - this.$children.forEach(i => { - if (i.$options._componentTag === 'v-stepper-step') { - this.steps.push(i) - } else if (i.$options._componentTag === 'v-stepper-content') { - i.isVertical = this.vertical - this.content.push(i) + for (let index = 0; index < this.$children.length; index++) { + const child = this.$children[index] + if (child.$options._componentTag === 'v-stepper-step') { + this.steps.push(child) + } else if (child.$options._componentTag === 'v-stepper-content') { + child.isVertical = this.vertical + this.content.push(child) } - }) + } }, stepClick (step) { this.getSteps() diff --git a/src/components/VStepper/VStepperContent.js b/src/components/VStepper/VStepperContent.js index dd1ccace7d4e..66fee72eddbc 100644 --- a/src/components/VStepper/VStepperContent.js +++ b/src/components/VStepper/VStepperContent.js @@ -14,7 +14,9 @@ export default { data () { return { height: 0, - isActive: false, + // Must be null to allow + // previous comparison + isActive: null, isReverse: false, isVertical: false } @@ -53,16 +55,17 @@ export default { }, watch: { - isActive () { - if (!this.isVertical) { - return + isActive (current, previous) { + // If active and the previous state + // was null, is just booting up + if (current && previous == null) { + return (this.height = 'auto') } - if (this.isActive) { - this.enter() - } else { - this.leave() - } + if (!this.isVertical) return + + if (this.isActive) this.enter() + else this.leave() } }, @@ -83,8 +86,10 @@ export default { }, methods: { - onTransition () { - if (!this.isActive) return + onTransition (e) { + if (!this.isActive || + e.propertyName !== 'height' + ) return this.height = 'auto' }, @@ -92,9 +97,9 @@ export default { let scrollHeight = 0 // Render bug with height - setTimeout(() => { + requestAnimationFrame(() => { scrollHeight = this.$refs.wrapper.scrollHeight - }, 0) + }) this.height = 0 @@ -103,7 +108,7 @@ export default { }, leave () { this.height = this.$refs.wrapper.clientHeight - setTimeout(() => (this.height = 0), 0) + setTimeout(() => (this.height = 0), 10) }, toggle (step, reverse) { this.isActive = step.toString() === this.step.toString() diff --git a/src/components/VStepper/VStepperContent.spec.js b/src/components/VStepper/VStepperContent.spec.js new file mode 100644 index 000000000000..fcee59660d68 --- /dev/null +++ b/src/components/VStepper/VStepperContent.spec.js @@ -0,0 +1,19 @@ +import { test } from '@util/testing' +import VStepperContent from './VStepperContent' + +test('VStepperContent.js', ({ mount }) => { + it('should set height to auto', async () => { + const wrapper = mount(VStepperContent, { + attachToDocument: true, + propsData: { step: 0 } + }) + + expect(wrapper.vm.isActive).toBe(null) + expect(wrapper.vm.height).toBe(0) + + wrapper.setData({ isActive: true }) + await wrapper.vm.$nextTick() + expect(wrapper.vm.isActive).toBe(true) + expect(wrapper.vm.height).toBe('auto') + }) +}) diff --git a/src/components/VSubheader/VSubheader.js b/src/components/VSubheader/VSubheader.js index 3885e648d09b..299b3fec1d24 100644 --- a/src/components/VSubheader/VSubheader.js +++ b/src/components/VSubheader/VSubheader.js @@ -1,4 +1,4 @@ -require('../../stylus/components/_subheaders.styl') +import '../../stylus/components/_subheaders.styl' import Themeable from '../../mixins/themeable' diff --git a/src/components/VSwitch/VSwitch.js b/src/components/VSwitch/VSwitch.js index bfd41697dffa..1d9d3489a25b 100644 --- a/src/components/VSwitch/VSwitch.js +++ b/src/components/VSwitch/VSwitch.js @@ -1,6 +1,6 @@ -require('../../stylus/components/_input-groups.styl') -require('../../stylus/components/_selection-controls.styl') -require('../../stylus/components/_switch.styl') +import '../../stylus/components/_input-groups.styl' +import '../../stylus/components/_selection-controls.styl' +import '../../stylus/components/_switch.styl' // Mixins import Rippleable from '../../mixins/rippleable' diff --git a/src/components/VSwitch/VSwitch.spec.js b/src/components/VSwitch/VSwitch.spec.js index 102fc3fbe743..e156ea619df0 100644 --- a/src/components/VSwitch/VSwitch.spec.js +++ b/src/components/VSwitch/VSwitch.spec.js @@ -1,8 +1,7 @@ -import { test } from '~util/testing' -import { mount } from 'avoriaz' -import VSwitch from '~components/VSwitch' +import { test, touch } from '@util/testing' +import VSwitch from '@components/VSwitch' -test('VSwitch.js', () => { +test('VSwitch.js', ({ mount }) => { it('should set ripple data attribute based on ripple prop state', () => { const wrapper = mount(VSwitch, { propsData: { @@ -13,10 +12,55 @@ test('VSwitch.js', () => { const ripple = wrapper.find('.input-group--selection-controls__ripple')[0] - expect(ripple.getAttribute('data-ripple')).toBe('false') + expect(ripple.element._ripple.enabled).toBe(false) wrapper.setProps({ ripple: true }) - expect(ripple.getAttribute('data-ripple')).toBe('true') + expect(ripple.element._ripple.enabled).toBe(true) + expect(ripple.element._ripple.centered).toBe(true) + }) + + it('should emit change event on swipe', async () => { + const wrapper = mount(VSwitch, { + props: { + inputValue: false + } + }) + + const change = jest.fn() + wrapper.vm.$on('change', change) + touch(wrapper.find('.input-group--selection-controls__ripple')[0]).start(0, 0).end(20, 0) + expect(change).toBeCalledWith(true) + + wrapper.setProps({ inputValue: true }) + touch(wrapper.find('.input-group--selection-controls__ripple')[0]).start(0, 0).end(-20, 0) + expect(change).toBeCalledWith(false) + }) + + it('shouldn not emit change event on swipe when not active', async () => { + const wrapper = mount(VSwitch, { + props: { + inputValue: false + } + }) + + const change = jest.fn() + wrapper.vm.$on('change', change) + touch(wrapper.find('.input-group--selection-controls__ripple')[0]).start(0, 0).end(-20, 0) + expect(change).not.toBeCalled() + + wrapper.setProps({ inputValue: true }) + touch(wrapper.find('.input-group--selection-controls__ripple')[0]).start(0, 0).end(20, 0) + expect(change).not.toBeCalled() + }) + + it('should render component with error', async () => { + const wrapper = mount(VSwitch, { + props: { + errorMessages: ['error'] + } + }) + + expect(wrapper.html()).toMatchSnapshot() }) }) diff --git a/src/components/VSwitch/__snapshots__/VSwitch.spec.js.snap b/src/components/VSwitch/__snapshots__/VSwitch.spec.js.snap new file mode 100644 index 000000000000..b5c20197a2b5 --- /dev/null +++ b/src/components/VSwitch/__snapshots__/VSwitch.spec.js.snap @@ -0,0 +1,22 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VSwitch.js should render component with error 1`] = ` + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +`; diff --git a/src/components/VSystemBar/VSystemBar.js b/src/components/VSystemBar/VSystemBar.js index 218b3239161b..c645f9884fb7 100644 --- a/src/components/VSystemBar/VSystemBar.js +++ b/src/components/VSystemBar/VSystemBar.js @@ -1,4 +1,4 @@ -require('../../stylus/components/_system-bars.styl') +import '../../stylus/components/_system-bars.styl' import Applicationable from '../../mixins/applicationable' import Colorable from '../../mixins/colorable' @@ -7,11 +7,20 @@ import Themeable from '../../mixins/themeable' export default { name: 'v-system-bar', - mixins: [Applicationable, Colorable, Themeable], + mixins: [ + Applicationable('bar', [ + 'height', + 'window' + ]), + Colorable, + Themeable + ], props: { - absolute: Boolean, - fixed: Boolean, + height: { + type: [Number, String], + validator: v => !isNaN(parseInt(v)) + }, lightsOut: Boolean, status: Boolean, window: Boolean @@ -22,40 +31,29 @@ export default { return this.addBackgroundColorClassChecks(Object.assign({ 'system-bar--lights-out': this.lightsOut, 'system-bar--absolute': this.absolute, - 'system-bar--fixed': this.fixed, + 'system-bar--fixed': !this.absolute && (this.app || this.fixed), 'system-bar--status': this.status, 'system-bar--window': this.window }, this.themeClasses)) }, computedHeight () { - return this.window ? 32 : 24 - } - }, + if (this.height) return parseInt(this.height) - watch: { - window () { - this.updateApplication() - }, - fixed () { - this.updateApplication() - }, - absolute () { - this.updateApplication() + return this.window ? 32 : 24 } }, methods: { + /** + * Update the application layout + * + * @return {number} + */ updateApplication () { - if (this.app && this.$vuetify) { - this.$vuetify.application.bar = (this.fixed || this.absolute) ? this.computedHeight : 0 - } + return this.computedHeight } }, - destroyed () { - if (this.app && this.$vuetify) this.$vuetify.application.bar = 0 - }, - render (h) { const data = { staticClass: 'system-bar', diff --git a/src/components/VSystemBar/VSystemBar.spec.js b/src/components/VSystemBar/VSystemBar.spec.js index 3153df36fbb5..f19103c86bbc 100755 --- a/src/components/VSystemBar/VSystemBar.spec.js +++ b/src/components/VSystemBar/VSystemBar.spec.js @@ -1,8 +1,7 @@ -import { test } from '~util/testing' -import { mount } from 'avoriaz' -import VSystemBar from '~components/VSystemBar' +import { test } from '@util/testing' +import VSystemBar from '@components/VSystemBar' -test('VSystemBar.vue', () => { +test('VSystemBar.vue', ({ mount }) => { it('should render a colored system bar', () => { const wrapper = mount(VSystemBar, { propsData: { @@ -33,4 +32,34 @@ test('VSystemBar.vue', () => { expect(wrapper.element.classList).toContain('system-bar--absolute') }) + + it('should update height when window prop change', async () => { + const wrapper = mount(VSystemBar, { + propsData: { + app: true + } + }) + + expect(wrapper.vm.$vuetify.application.bar).toBe(24) + + wrapper.setProps({ + window: true + }) + expect(wrapper.vm.$vuetify.application.bar).toBe(32) + + wrapper.setProps({ + height: 90 + }) + expect(wrapper.vm.$vuetify.application.bar).toBe(90) + }) + + it('should warn for improper height', () => { + const wrapper = mount(VSystemBar, { + propsData: { + height: 'foo' + } + }) + + expect('custom validator check failed for prop "height"').toHaveBeenWarned() + }) }) diff --git a/src/components/VTabs/VTab.js b/src/components/VTabs/VTab.js new file mode 100644 index 000000000000..ee7f3a453286 --- /dev/null +++ b/src/components/VTabs/VTab.js @@ -0,0 +1,113 @@ +// Mixins +import Routable from '../../mixins/routable' +import { + inject as RegistrableInject +} from '../../mixins/registrable' + +// Utilities +import { getObjectValueByPath } from '../../util/helpers' + +export default { + name: 'v-tab', + + mixins: [ + RegistrableInject('tabs', 'v-tab', 'v-tabs'), + Routable + ], + + inject: ['tabClick'], + + data () { + return { + isActive: false + } + }, + + props: { + activeClass: { + type: String, + default: 'tabs__item--active' + }, + ripple: { + type: [Boolean, Object], + default: true + } + }, + + computed: { + classes () { + return { + 'tabs__item': true, + 'tabs__item--disabled': this.disabled, + [this.activeClass]: !this.to && this.isActive + } + }, + action () { + const to = this.to || this.href + + if (typeof to === 'string') return to.replace('#', '') + if (to === Object(to) && + to.hasOwnProperty('path') + ) return to.path + + return this + } + }, + + watch: { + $route: 'onRouteChange' + }, + + mounted () { + this.tabs.register(this) + this.onRouteChange() + }, + + beforeDestroy () { + this.tabs.unregister(this) + }, + + methods: { + click (e) { + // If user provides an + // actual link, do not + // prevent default + if (this.href && + this.href.indexOf('#') > -1 + ) e.preventDefault() + + this.$emit('click', e) + + this.to || this.tabClick(this) + }, + onRouteChange () { + if (!this.to || !this.$refs.link) return + + const path = `_vnode.data.class.${this.activeClass}` + + this.$nextTick(() => { + if (getObjectValueByPath(this.$refs.link, path)) { + this.tabClick(this) + } + }) + }, + toggle (action) { + this.isActive = (action === this) || (action === this.action) + } + }, + + render (h) { + const link = this.generateRouteLink() + const { data } = link + + // If disabled, use div as anchor tags do not support + // being disabled + const tag = this.disabled ? 'div' : link.tag + + data.ref = 'link' + + return h('div', { + staticClass: 'tabs__div' + }, [h(tag, data, this.$slots.default)]) + } +} diff --git a/src/components/VTabs/VTab.spec.js b/src/components/VTabs/VTab.spec.js new file mode 100644 index 000000000000..aa4ebf13fcd2 --- /dev/null +++ b/src/components/VTabs/VTab.spec.js @@ -0,0 +1,199 @@ +import { test } from '@util/testing' +import VTab from './VTab' +import Vue from 'vue' + +const tabClick = 'Injection "tabClick" not found' +const tabsWarning = '[Vuetify] The v-tab component must be used inside a v-tabs' +const stub = { + name: 'router-link', + + props: { + to: [String, Object] + }, + + render (h) { + return h('a', { + domProps: { href: this.to } + }) + } +} + +test('VTab', ({ mount }) => { + it('should render a div when disabled', async () => { + const wrapper = mount(VTab, { + propsData: { + href: '#foo' + } + }) + + expect(wrapper.find('.tabs__item')[0].vNode.elm.tagName).toBe('A') + wrapper.setProps({ disabled: true }) + expect(wrapper.find('.tabs__item')[0].vNode.elm.tagName).toBe('DIV') + + expect(tabClick).toHaveBeenWarned() + expect(tabsWarning).toHaveBeenTipped() + }) + + it('should register and unregister', async () => { + const register = jest.fn() + const unregister = jest.fn() + const wrapper = mount({ + provide: { + tabs: { + register, + unregister + } + }, + render (h) { + return h('div', this.$slots.default) + } + }, { + slots: { + default: [VTab] + } + }) + + const item = wrapper.find(VTab)[0] + item.destroy() + + expect(register).toHaveBeenCalled() + expect(unregister).toHaveBeenCalled() + expect(tabClick).toHaveBeenWarned() + }) + + it('should emit click event and prevent default', async () => { + const click = jest.fn() + const wrapper = mount({ + provide: { + tabClick: click + }, + render (h) { return h('div', this.$slots.default) } + }, { + slots: { + default: [{ + render: h => h(VTab, { + props: { href: '#foo' } + }) + }] + } + }) + + const tab = wrapper.find(VTab)[0] + tab.vm.$on('click', click) + const event = new Event('click') + tab.vm.click(event) + await wrapper.vm.$nextTick() + // Cannot figure out how to ensure this actually happens + // expect(event.defaultPrevented).toBe(false) + expect(click).toHaveBeenCalled() + expect(tabsWarning).toHaveBeenTipped() + }) + + it('should toggle isActive', () => { + const wrapper = mount(VTab, { + propsData: { href: '#foo' } + }) + + expect(wrapper.vm.isActive).toBe(false) + wrapper.vm.toggle('foo') + expect(wrapper.vm.isActive).toBe(true) + expect(tabClick).toHaveBeenWarned() + expect(tabsWarning).toHaveBeenTipped() + }) + + it('should not call tabClick', async () => { + const instance = Vue.extend() + instance.component('router-link', stub) + const wrapper = mount(VTab, { + instance + }) + const mockClick = jest.fn() + const click = jest.fn() + + wrapper.vm.$on('click', click) + wrapper.setMethods({ tabClick: mockClick }) + wrapper.vm.onRouteChange() + await wrapper.vm.$nextTick() + expect(mockClick).not.toHaveBeenCalled() + + wrapper.vm.click(new Event('click')) + expect(mockClick.mock.calls.length).toBe(1) + + wrapper.setProps({ href: '/foo' }) + wrapper.vm.click(new Event('click')) + await wrapper.vm.$nextTick() + expect(mockClick.mock.calls.length).toBe(2) + + wrapper.setProps({ href: null, to: '/foo' }) + wrapper.vm.click(new Event('click')) + await wrapper.vm.$nextTick() + expect(mockClick.mock.calls.length).toBe(2) + + expect(tabClick).toHaveBeenWarned() + expect(tabsWarning).toHaveBeenTipped() + }) + + + // This can no longer be accurately tested due + // to limitations with mocking tests for vue-router + // and the changes for https://github.com/vuetifyjs/vuetify/issues/3010 + // + // Current conversation on vue-router tests + // https://github.com/vuejs/vue-router/issues/1768 + it.skip('should call tabClick', async () => { + const instance = Vue.extend() + instance.component('router-link', stub) + const wrapper = mount(VTab, { + propsData: { + to: '/foo' + }, + globals: { + $route: { path: '/foo' } + }, + instance + }) + + const mockClick = jest.fn() + wrapper.setMethods({ tabClick: mockClick }) + + wrapper.vm.onRouteChange() + await wrapper.vm.$nextTick() + expect(mockClick).not.toHaveBeenCalled() + + // Mock the actions that would normally + // happen with a route-link + wrapper.vm.isActive = true + wrapper.vm.$el.firstChild.classList.add('tabs__item--active') + await wrapper.vm.$nextTick() + + // Mock on route change + wrapper.vm.onRouteChange() + await wrapper.vm.$nextTick() + + // expect(mockClick).toHaveBeenCalled() + expect(tabClick).toHaveBeenWarned() + expect(tabsWarning).toHaveBeenTipped() + }) + + it('should have the correct actions', () => { + const instance = Vue.extend() + instance.component('router-link', stub) + const wrapper = mount(VTab, { + propsData: { + href: '#foo' + }, + instance + }) + + expect(wrapper.vm.action).toBe('foo') + wrapper.setProps({ href: null, to: '/foo' }) + expect(wrapper.vm.action).toBe('/foo') + wrapper.setProps({ to: { path: '/bar' }}) + expect(wrapper.vm.action).toBe('/bar') + wrapper.setProps({ to: null }) + expect(wrapper.vm.action).toBe(wrapper.vm) + + expect(tabClick).toHaveBeenWarned() + expect(tabsWarning).toHaveBeenTipped() + }) +}) diff --git a/src/components/VTabs/VTabsContent.js b/src/components/VTabs/VTabItem.js similarity index 75% rename from src/components/VTabs/VTabsContent.js rename to src/components/VTabs/VTabItem.js index dcaf0debd32e..eab95db60d9b 100644 --- a/src/components/VTabs/VTabsContent.js +++ b/src/components/VTabs/VTabItem.js @@ -5,14 +5,19 @@ import { VTabReverseTransition } from '../transitions' +import { + inject as RegistrableInject +} from '../../mixins/registrable' + import Touch from '../../directives/touch' export default { - name: 'v-tabs-content', - - mixins: [Bootable], + name: 'v-tab-item', - inject: ['registerContent', 'unregisterContent'], + mixins: [ + Bootable, + RegistrableInject('tabs', 'v-tab-item', 'v-tabs-items') + ], components: { VTabTransition, @@ -31,10 +36,7 @@ export default { }, props: { - id: { - type: String, - required: true - }, + id: String, transition: { type: [Boolean, String], default: 'tab-transition' @@ -52,19 +54,19 @@ export default { }, methods: { - toggle (target, reverse, showTransition) { + toggle (target, reverse, showTransition, index) { this.$el.style.transition = !showTransition ? 'none' : null this.reverse = reverse - this.isActive = this.id === target + this.isActive = (this.id || index.toString()) === target } }, mounted () { - this.registerContent(this.id, this.toggle) + this.tabs.register(this) }, beforeDestroy () { - this.unregisterContent(this.id) + this.tabs.unregister(this) }, render (h) { @@ -74,11 +76,10 @@ export default { name: 'show', value: this.isActive }], + domProps: { id: this.id }, on: this.$listeners } - if (this.id) data.domProps = { id: this.id } - const div = h('div', data, this.showLazyContent(this.$slots.default)) if (!this.computedTransition) return div diff --git a/src/components/VTabs/VTabItem.spec.js b/src/components/VTabs/VTabItem.spec.js new file mode 100644 index 000000000000..d7d3d505b009 --- /dev/null +++ b/src/components/VTabs/VTabItem.spec.js @@ -0,0 +1,72 @@ +import { test } from '@util/testing' +import VTabs from './VTabs' +import VTabItem from './VTabItem' + +const contentWarning = '[Vuetify] The v-tab-item component must be used inside a v-tabs-items' + +test('VTabItem', ({ mount }) => { + it('should unregister on destroy', async () => { + const register = jest.fn() + const unregister = jest.fn() + const wrapper = mount({ + provide () { + return { + tabs: { + register, + unregister + } + } + }, + render (h) { + return h('div', [ + h(VTabItem, { + props: { id: 'foo' } + }) + ]) + } + }) + + await wrapper.vm.$nextTick() + expect(register).toHaveBeenCalled() + + const content = wrapper.find(VTabItem)[0] + content.destroy() + await wrapper.vm.$nextTick() + expect(unregister).toHaveBeenCalled() + }) + + it('should not wrap component in transition if false is used', () => { + const wrapper = mount(VTabItem, { + propsData: { + id: 'foo', + transition: false, + reverseTransition: false + } + }) + + expect(wrapper.vm.computedTransition).toBe(false) + expect(contentWarning).toHaveBeenTipped() + }) + + it('should set transition to none of no transition', async () => { + const wrapper = mount(VTabItem, { + propsData: { id: 'foo' } + }) + + wrapper.vm.toggle('foo', false, false) + expect(wrapper.vm.$el.style.transition).toBe('none') + wrapper.vm.toggle('foo', false, true) + expect(wrapper.vm.$el.style.transition).toBe(null) + expect(contentWarning).toHaveBeenTipped() + }) + + it('should return reverse transition', () => { + const wrapper = mount(VTabItem, { + propsData: { id: 'foo' } + }) + + wrapper.setData({ reverse: true }) + expect(wrapper.vm.computedTransition).toBe('tab-reverse-transition') + expect(contentWarning).toHaveBeenTipped() + }) +}) diff --git a/src/components/VTabs/VTabs.js b/src/components/VTabs/VTabs.js index 10348b5763a4..bf4d7596b495 100644 --- a/src/components/VTabs/VTabs.js +++ b/src/components/VTabs/VTabs.js @@ -1,237 +1,242 @@ -require('../../stylus/components/_tabs.styl') - +// Styles +import '../../stylus/components/_tabs.styl' + +// Component imports +import VIcon from '../VIcon' +import VTabsItems from './VTabsItems' +import VTabsSlider from './VTabsSlider' + +// Component level mixins +import TabsComputed from './mixins/tabs-computed' +import TabsGenerators from './mixins/tabs-generators' +import TabsProps from './mixins/tabs-props' +import TabsTouch from './mixins/tabs-touch' +import TabsWatchers from './mixins/tabs-watchers' + +// Mixins +import Colorable from '../../mixins/colorable' +import SSRBootable from '../../mixins/ssr-bootable' +import Themeable from '../../mixins/themeable' +import { + provide as RegistrableProvide +} from '../../mixins/registrable' + +// Directives import Resize from '../../directives/resize' +import Touch from '../../directives/touch' export default { name: 'v-tabs', + components: { + VIcon, + VTabsItems, + VTabsSlider + }, + + mixins: [ + RegistrableProvide('tabs'), + Colorable, + SSRBootable, + TabsComputed, + TabsProps, + TabsGenerators, + TabsTouch, + TabsWatchers, + Themeable + ], + directives: { - Resize + Resize, + Touch }, provide () { return { - registerContent: this.registerContent, - unregisterContent: this.unregisterContent, - registerTabItem: this.registerTabItem, - unregisterTabItem: this.unregisterTabItem, - next: this.next, - prev: this.prev, - slider: this.slider, tabClick: this.tabClick, - isScrollable: () => this.scrollable, - isMobile: () => this.isMobile + tabProxy: this.tabProxy, + registerItems: this.registerItems, + unregisterItems: this.unregisterItems } }, data () { return { - activeIndex: null, + bar: [], content: [], isBooted: false, + isOverflowing: false, + lazyValue: this.value, + nextIconVisible: false, + prevIconVisible: false, resizeTimeout: null, reverse: false, - tabItems: [], + scrollOffset: 0, + sliderWidth: null, + sliderLeft: null, + startX: 0, tabsContainer: null, - tabsSlider: null, - target: null, - targetEl: null, + tabs: [], + tabItems: null, transitionTime: 300 } }, - props: { - centered: Boolean, - fixed: Boolean, - grow: Boolean, - icons: Boolean, - mobileBreakPoint: { - type: [Number, String], - default: 1280 - }, - value: String, - scrollable: { - type: Boolean, - default: true - } - }, - - computed: { - classes () { - return { - 'tabs': true, - 'tabs--centered': this.centered, - 'tabs--fixed': this.fixed, - 'tabs--grow': this.grow, - 'tabs--icons': this.icons, - 'tabs--mobile': this.isMobile, - 'tabs--scroll-bars': this.scrollable - } - }, - isMobile () { - return this.$vuetify.breakpoint.width < this.mobileBreakPoint - } - }, - - watch: { - value () { - this.tabClick(this.value) - }, - activeIndex () { - this.updateTabs() - this.$nextTick(() => (this.isBooted = true)) - }, - tabItems (newItems, oldItems) { - // Tab item was removed and - // there are still more - if (oldItems.length > newItems.length && - newItems.length > 0 - ) { - if (!newItems.find(o => o.id === this.target)) { - const i = oldItems.findIndex(o => o.id === this.target) - - this.$nextTick(() => { - this.activeIndex = this.tabItems[i > 0 ? i - 1 : 0].id - this.target = this.activeIndex - }) - } - } - this.slider() - }, - '$vuetify.application.left' () { - this.onContainerResize() - }, - '$vuetify.application.right' () { - this.onContainerResize() - } - }, - - mounted () { - // This is a workaround to detect if link is active - // when being used as a router or nuxt link - const i = this.tabItems.findIndex(({ el }) => { - return el.firstChild.classList.contains('tabs__item--active') - }) - - const tab = this.value || (this.tabItems[i !== -1 ? i : 0] || {}).id - - tab && this.tabClick(tab) - }, - methods: { - registerContent (id, toggle) { - this.content.push({ id, toggle }) - }, - registerTabItem (id, toggle, el) { - this.tabItems.push({ id, toggle, el }) - }, - unregisterContent (id) { - this.content = this.content.filter(o => o.id !== id) - }, - unregisterTabItem (id) { - this.tabItems = this.tabItems.filter(o => o.id !== id) + checkPrevIcon () { + return this.scrollOffset > 0 }, - next (cycle) { - let nextIndex = this.activeIndex + 1 + checkNextIcon () { + // Check one scroll ahead to know the width of right-most item + const container = this.$refs.container + const wrapper = this.$refs.wrapper - if (!this.content[nextIndex]) { - if (!cycle) return - nextIndex = 0 - } - - this.tabClick(this.tabItems[nextIndex].id) + return container.clientWidth > this.scrollOffset + wrapper.clientWidth }, - prev (cycle) { - let prevIndex = this.activeIndex - 1 + callSlider () { + this.setOverflow() + if (this.hideSlider || !this.activeTab) return false - if (!this.content[prevIndex]) { - if (!cycle) return - prevIndex = this.content.length - 1 - } + // Give screen time to paint + const action = this.activeTab.action + const activeTab = action === this.activeTab + ? this.activeTab + : this.tabs.find(tab => tab.action === action) - this.tabClick(this.tabItems[prevIndex].id) - }, - onResize () { - this.slider() + if (!activeTab) return + this.sliderWidth = activeTab.$el.scrollWidth + this.sliderLeft = activeTab.$el.offsetLeft }, /** * When v-navigation-drawer changes the * width of the container, call resize * after the transition is complete - * - * @return {Void} */ onContainerResize () { clearTimeout(this.resizeTimeout) - this.resizeTimeout = setTimeout(this.onResize, this.transitionTime) + this.resizeTimeout = setTimeout(this.callSlider, this.transitionTime) }, - slider (el) { - this.tabsSlider = this.tabsSlider || - !!this.$el && this.$el.querySelector('.tabs__slider') - - this.tabsContainer = this.tabsContainer || - !!this.$el && this.$el.querySelector('.tabs__container') - - if (!this.tabsSlider || !this.tabsContainer) return - - this.targetEl = el || this.targetEl - - if (!this.targetEl) return + onResize () { + if (this._isDestroyed) return - // Gives DOM time to paint when - // processing slider for - // dynamic tabs - this.$nextTick(() => { - // #684 Calculate width as % - const width = ( - this.targetEl.scrollWidth / - this.tabsContainer.clientWidth * - 100 - ) + this.callSlider() + this.scrollIntoView() + }, + overflowCheck (e, fn) { + this.isOverflowing && fn(e) + }, + scrollTo (direction) { + this.scrollOffset = this.newOffset(direction) + }, + setOverflow () { + this.isOverflowing = this.$refs.bar.clientWidth < this.$refs.container.clientWidth + }, + findActiveLink () { + if (!this.tabs.length || this.lazyValue) return - this.tabsSlider.style.width = `${width}%` - this.tabsSlider.style.left = `${this.targetEl.offsetLeft}px` + const activeIndex = this.tabs.findIndex((tabItem, index) => { + const id = tabItem.action === tabItem ? index.toString() : tabItem.action + return id === this.lazyValue || + tabItem.$el.firstChild.className.indexOf(this.activeClass) > -1 }) - }, - tabClick (target) { - const setActiveIndex = index => { - if (this.activeIndex === index) { - // #762 update tabs display - // In case tabs count got changed but activeIndex didn't - this.updateTabs() - } else { - this.activeIndex = index + + const index = activeIndex > -1 ? activeIndex : 0 + const tab = this.tabs[index] + + /* istanbul ignore next */ + // There is not a reliable way to test + this.inputValue = tab.action === tab ? index : tab.action + }, + parseNodes () { + const item = [] + const items = [] + const slider = [] + const tab = [] + const length = (this.$slots.default || []).length + + for (let i = 0; i < length; i++) { + const vnode = this.$slots.default[i] + + /* istanbul ignore else */ + if (vnode.componentOptions) { + switch (vnode.componentOptions.Ctor.options.name) { + case 'v-tabs-slider': slider.push(vnode) + break + case 'v-tabs-items': items.push(vnode) + break + case 'v-tab-item': item.push(vnode) + break + // case 'v-tab' - intentionally omitted + default: tab.push(vnode) + } } } - this.target = target + return { tab, slider, items, item } + }, + register (options) { + this.tabs.push(options) + }, + scrollIntoView () { + if (!this.activeTab) return false - this.$nextTick(() => { - const nextIndex = this.content.findIndex(o => o.id === target) - this.reverse = nextIndex < this.activeIndex - setActiveIndex(nextIndex) + const { clientWidth, offsetLeft } = this.activeTab.$el + const wrapperWidth = this.$refs.wrapper.clientWidth + const totalWidth = wrapperWidth + this.scrollOffset + const itemOffset = clientWidth + offsetLeft + const additionalOffset = clientWidth * 0.3 - this.$emit('input', this.target) - }) + /* instanbul ignore else */ + if (offsetLeft < this.scrollOffset) { + this.scrollOffset = Math.max(offsetLeft - additionalOffset, 0) + } else if (totalWidth < itemOffset) { + this.scrollOffset -= totalWidth - itemOffset - additionalOffset + } + }, + tabClick (tab) { + this.inputValue = tab.action === tab ? this.tabs.indexOf(tab) : tab.action + this.scrollIntoView() + }, + tabProxy (val) { + this.inputValue = val + }, + registerItems (fn) { + this.tabItems = fn + }, + unregisterItems () { + this.tabItems = null + }, + unregister (tab) { + this.tabs = this.tabs.filter(o => o !== tab) }, updateTabs () { - this.content.forEach(({ toggle }) => { - toggle(this.target, this.reverse, this.isBooted) - }) + for (let index = this.tabs.length; --index >= 0;) { + this.tabs[index].toggle(this.target) + } - this.tabItems.forEach(({ toggle }) => { - toggle(this.target) - }) + this.setOverflow() } }, + mounted () { + this.prevIconVisible = this.checkPrevIcon() + this.nextIconVisible = this.checkNextIcon() + }, + render (h) { + const { tab, slider, items, item } = this.parseNodes() + return h('div', { - 'class': this.classes, + staticClass: 'tabs', directives: [{ name: 'resize', + arg: 400, + modifiers: { quiet: true }, value: this.onResize }] - }, this.$slots.default) + }, [ + this.genBar([this.hideSlider ? null : this.genSlider(slider), tab]), + this.genItems(items, item) + ]) } } diff --git a/src/components/VTabs/VTabs.spec.js b/src/components/VTabs/VTabs.spec.js index c10777a76bd7..56a6048c79e1 100644 --- a/src/components/VTabs/VTabs.spec.js +++ b/src/components/VTabs/VTabs.spec.js @@ -1,102 +1,374 @@ -import { test } from '~util/testing' -import { mount } from 'avoriaz' +import { test, touch } from '@util/testing' +import { createRange } from '@util/helpers' import VTabs from './VTabs' -import VTabsBar from './VTabsBar' -import VTabsItem from './VTabsItem' -import Vue from 'vue' -import { createRange } from '~util/helpers' +import VTab from './VTab' +import VTabItem from './VTabItem' +import VTabsItems from './VTabsItems' +import VTabsSlider from './VTabsSlider' + +const Component = (items = ['foo', 'bar']) => { + return { + inheritAttrs: false, -function createBar (items = ['foo', 'bar']) { - return Vue.extend({ render (h) { - return h(VTabsBar, items.map(i => ( - h(VTabsItem, { props: { href: `${i}` } }) - ))) + return h(VTabs, { + attrs: this.$attrs + }, [ + items.map(item => h(VTab, { + props: { href: `#${item}` } + })), + h(VTabsItems, items.map(item => h(VTabItem, { + props: { id: item } + }))) + ]) } - }) + } } -test('VTabs', () => { - it('should change model when tab is clicked', async () => { +const ssrBootable = () => new Promise(resolve => requestAnimationFrame(resolve)) + +test('VTabs', ({ mount, shallow }) => { + it('should provide', () => { + const wrapper = mount(Component()) + + const tab = wrapper.find(VTab)[0] + expect(typeof tab.vm.tabClick).toBe('function') + expect(typeof tab.vm.tabs.register).toBe('function') + expect(typeof tab.vm.tabs.unregister).toBe('function') + + const items = wrapper.find(VTabsItems)[0] + expect(typeof items.vm.registerItems).toBe('function') + expect(typeof items.vm.unregisterItems).toBe('function') + }) + + it('should register tabs and items', async () => { const wrapper = mount(VTabs, { slots: { - default: [ - createBar() - ] + default: [VTab, VTabsItems] } }) + const tab = wrapper.find(VTab)[0] + expect(wrapper.vm.tabs.length).toBe(1) + tab.destroy() + expect(wrapper.vm.tabs.length).toBe(0) + + const items = wrapper.find(VTabsItems)[0] + expect(typeof wrapper.vm.tabItems).toBe('function') + items.destroy() + expect(wrapper.vm.tabItems).toBe(null) + }) + + it('should change tab and content when model changes', async () => { + const wrapper = mount(Component(), { + attachToDocument: true + }) + + const tabs = wrapper.find(VTabs)[0] + const tab = wrapper.find(VTab)[0] + const item = wrapper.find(VTabItem)[0] + + expect(tabs.vm.activeIndex).toBe(-1) + expect(tab.vm.isActive).toBe(false) + expect(item.vm.isActive).toBe(false) + await ssrBootable() await wrapper.vm.$nextTick() + expect(tabs.vm.activeIndex).toBe(0) + expect(tab.vm.isActive).toBe(true) + expect(item.vm.isActive).toBe(true) + }) + + it('should call slider on application resize', async () => { + const wrapper = mount(Component()) + + const tabs = wrapper.find(VTabs)[0] + + expect(tabs.vm.resizeTimeout).toBe(null) + tabs.vm.$vuetify.application.left = 100 + await tabs.vm.$nextTick() + expect(tabs.vm.resizeTimeout).toBeTruthy() + tabs.setData({ resizeTimeout: null }) + expect(tabs.vm.resizeTimeout).toBe(null) + tabs.vm.$vuetify.application.right = 100 + await tabs.vm.$nextTick() + expect(tabs.vm.resizeTimeout).toBeTruthy() + }) + + it('should reset offset on resize', async () => { + const wrapper = mount(Component(), { + attachToDocument: true + }) + + await ssrBootable() + + const tabs = wrapper.find(VTabs)[0] + + tabs.setData({ scrollOffset: 1 }) + tabs.vm.onResize() + await tabs.vm.$nextTick() + expect(tabs.vm.scrollOffset).toBe(0) + tabs.setData({ scrollOffset: 2 }) + await tabs.vm.$nextTick() + tabs.destroy() + tabs.vm.onResize() + expect(tabs.vm.scrollOffset).toBe(2) + }) + + it('should update model when route changes', async () => { + const $route = { path: 'bar' } + const wrapper = mount(Component(), { + attachToDocument: true, + globals: { + $route + } + }) + + await ssrBootable() + const tabs = wrapper.find(VTabs)[0] + const tab = wrapper.find(VTab)[1] const input = jest.fn() - wrapper.vm.$on('input', input) - const item1 = wrapper.find('.tabs__item')[0] - const item2 = wrapper.find('.tabs__item')[1] + tabs.vm.$on('input', input) + tab.vm.click(new Event('click')) + await wrapper.vm.$nextTick() + + expect(input).toHaveBeenCalled() + }) + + it('should call method if overflowing', () => { + const wrapper = mount(VTabs) + const fn = jest.fn() + + wrapper.vm.overflowCheck(null, fn) + expect(fn).not.toHaveBeenCalled() + wrapper.setData({ isOverflowing: true }) + wrapper.vm.overflowCheck(null, fn) + expect(fn).toHaveBeenCalled() + }) + + it('should update scroll and item offset', async () => { + const newOffset = jest.fn() + const wrapper = mount(VTabs, { + props: { + showArrows: true + } + }) + + wrapper.setMethods({ newOffset }) + + await ssrBootable() - item1.trigger('click') + wrapper.vm.scrollTo('next') + wrapper.vm.scrollTo('prev') + expect(newOffset.mock.calls.length).toBe(2) + + wrapper.setMethods({ newOffset: () => 5 }) await wrapper.vm.$nextTick() - expect(input).toBeCalledWith('foo') - item2.trigger('click') + wrapper.vm.scrollTo('prev') + expect(wrapper.vm.scrollOffset).toBe(5) + }) + + it('should validate height prop', async () => { + const wrapper = mount(VTabs, { + propsData: { height: 'auto' } + }) + + expect('Invalid prop: custom validator check failed for prop "height"').toHaveBeenWarned() + wrapper.setProps({ height: null }) + expect(wrapper.vm.containerStyles).toBe(null) + wrapper.setProps({ height: 112 }) + expect(wrapper.vm.containerStyles.height).toBe('112px') + }) + + it('should return lazy value when accessing input', async () => { + const wrapper = mount(VTabs) + + expect(wrapper.vm.inputValue).toBe(undefined) + wrapper.setData({ lazyValue: 'foo' }) await wrapper.vm.$nextTick() - expect(input).toBeCalledWith('bar') + expect(wrapper.vm.inputValue).toBe('foo') }) - it('should change tab when model changes', async () => { + it('should show tabs arrows', async () => { const wrapper = mount(VTabs, { - propsData: { - value: 'bar' - }, - slots: { - default: [ - createBar() - ] - } + propsData: { showArrows: true } }) + wrapper.setData({ isOverflowing: true }) await wrapper.vm.$nextTick() + expect(wrapper.find('.tabs__wrapper--show-arrows')).toHaveLength(1) + expect(wrapper.html()).toMatchSnapshot() + }) - const input = jest.fn() - wrapper.vm.$on('input', input) + it('should have a null target with no activeTab', () => { + const wrapper = mount(VTabs) + + expect(wrapper.vm.target).toBe(null) + }) - expect(wrapper.vm.value).toBe('bar') + it('should not conditionally render prev and next icons', async () => { + const scrollTo = jest.fn() + const wrapper = mount(VTabs, { + attachToDocument: true + }) - wrapper.setProps({ value: 'foo' }) + expect(wrapper.vm.genIcon('prev')).toBe(null) + + // // Mock display state + wrapper.setData({ isOverflowing: true, scrollOffset: 1 }) + wrapper.setProps({ showArrows: true }) + wrapper.vm.$vuetify.breakpoint.width = 800 + await ssrBootable() + wrapper.setProps({ mobileBreakPoint: 1200 }) + + expect(wrapper.vm.genIcon('prev')).toBeTruthy() + + wrapper.setMethods({ scrollTo }) + // Since the elements will have no width + // trick next icon to show + wrapper.setData({ scrollOffset: -1 }) + await wrapper.vm.$nextTick() + + const next = wrapper.find('.tabs__icon--next')[0] + next.trigger('click') await wrapper.vm.$nextTick() - expect(input).toBeCalledWith('foo') + expect(scrollTo).toHaveBeenCalledWith('next') + }) + + it('should call on touch methods', async () => { + const wrapper = mount(VTabs, { + attachToDocument: true + }) + + wrapper.setData({ isOverflowing: true }) + + const onTouch = jest.fn() + wrapper.setMethods({ + onTouchStart: onTouch, + onTouchMove: onTouch, + onTouchEnd: onTouch + }) + await ssrBootable() + + const tabsWrapper = wrapper.find('.tabs__wrapper')[0] + + touch(tabsWrapper).start(0, 0) + touch(tabsWrapper).end(0, 0) + touch(tabsWrapper).move(15, 15) + expect(onTouch.mock.calls.length).toBe(3) + }) + + it('should use a slotted slider', () => { + const wrapper = mount(VTabs, { + slots: { + default: [{ + name: 'v-tabs-slider', + render: h => h(VTabsSlider, { + props: { color: 'pink' } + }) + }] + } + }) + + const slider = wrapper.find(VTabsSlider)[0] + expect(slider.hasClass('pink')).toBe(true) + }) + + it('should handle touch events and remove container transition', async () => { + const wrapper = mount(VTabs, { + attachToDocument: true + }) + + wrapper.setData({ isOverflowing: true }) + const container = wrapper.find('.tabs__container')[0] + + await ssrBootable() + + expect(wrapper.vm.startX).toBe(0) + wrapper.vm.onTouchStart({ touchstartX: 0 }) + expect(container.hasStyle('transition', 'none')).toBe(true) + + wrapper.vm.onTouchMove({ touchmoveX: -100 }) + expect(wrapper.vm.scrollOffset).toBe(100) + + wrapper.vm.onTouchEnd() + expect(wrapper.vm.scrollOffset).toBe(0) + + wrapper.setData({ isOverflowing: false, scrollOffset: 100 }) + wrapper.vm.onTouchEnd() + expect(wrapper.vm.scrollOffset).toBe(0) + }) + + it('should generate a v-tabs-items if none present and has v-tab-item', async () => { + const wrapper = mount(VTabs, { + propsData: { value: 'foo' }, + slots: { + default: [{ + name: 'v-tab-item', + render: h => h('div') + }] + } + }) + + await ssrBootable() + + expect(wrapper.find(VTabsItems).length).toBe(1) }) - it('should mount with booted false then activate to remove transition', async () => { + it('should scroll active item into view if off screen', async () => { const wrapper = mount(VTabs, { - propsData: { - value: 'bar' - }, + attachToDocument: true, + propsData: { value: 'bar' }, slots: { - default: [ - createBar() - ] + default: [{ + name: 'v-tab', + render: h => h(VTab, { + props: { href: 'foo' } + }) + }] } }) - expect(wrapper.vm.isBooted).toBe(false) + await ssrBootable() + + expect(wrapper.vm.scrollIntoView()).toEqual(false) + + wrapper.setProps({ value: 'foo' }) + // Simulate being scrolled too far to the right + wrapper.setData({ scrollOffset: 400 }) + await wrapper.vm.$nextTick() + + wrapper.vm.scrollIntoView() + await wrapper.vm.$nextTick() + + expect(wrapper.vm.scrollOffset).toBe(0) - wrapper.vm.activeIndex = 0 + // DOM elements have no actual widths + // Trick into running else condition + wrapper.setData({ scrollOffset: -1 }) + wrapper.vm.scrollIntoView() await wrapper.vm.$nextTick() - expect(wrapper.vm.isBooted).toBe(true) + expect(wrapper.vm.scrollOffset).toBe(0) }) - /* TODO: Don't know how to dynamically change slots after wrapper created?? - it('should add navigation if dynamically added tabs result in overflow', async () => { + it('should hide slider', async () => { const wrapper = mount(VTabs, { + attachToDocument: true, + propsData: { hideSlider: true }, slots: { - default: [createBar(createRange(2))] - }, - attachToDocument: true + default: [{ + name: 'v-tab', + render: h => h(VTab) + }] + } }) - console.log(wrapper.html()) + await ssrBootable() + + const slider = wrapper.find('.tabs__slider') + expect(slider).toHaveLength(0) }) - */ }) diff --git a/src/components/VTabs/VTabsBar.js b/src/components/VTabs/VTabsBar.js deleted file mode 100644 index 253635137fa2..000000000000 --- a/src/components/VTabs/VTabsBar.js +++ /dev/null @@ -1,212 +0,0 @@ -// Component imports -import VIcon from '../VIcon' - -// Mixins -import Colorable from '../../mixins/colorable' -import Themeable from '../../mixins/themeable' - -// Directives -import Resize from '../../directives/resize' -import Touch from '../../directives/touch' - -export default { - name: 'v-tabs-bar', - - mixins: [Colorable, Themeable], - - directives: { - Resize, - Touch - }, - - provide () { - return { - addTabItem: (action, toggle, el) => { - this.registerTabItem(action, toggle, el) - this.onResize() - }, - removeTabItem: (action) => { - this.unregisterTabItem(action) - this.onResize() - } - } - }, - - inject: ['isScrollable', 'isMobile', 'registerTabItem', 'unregisterTabItem'], - - data () { - return { - isOverflowing: false, - itemOffset: 0, - scrollOffset: 0, - startX: 0 - } - }, - - computed: { - classes () { - return { - 'tabs__bar': true, - 'theme--dark': this.dark, - 'theme--light': this.light - } - }, - containerClasses () { - return { - 'tabs__container': true - } - }, - wrapperClasses () { - return { - 'tabs__wrapper': true, - 'tabs__wrapper--scrollable': this.isScrollable(), - 'tabs__wrapper--overflow': this.isOverflowing - } - }, - containerStyles () { - return { - 'transform': `translateX(${-this.scrollOffset}px)` - } - }, - leftIconVisible () { - return !this.isMobile() && - this.isScrollable() && - this.isOverflowing && - this.scrollOffset > 0 - }, - rightIconVisible () { - if (this.isMobile() || - !this.isScrollable() || - !this.isOverflowing) return - - // Check one scroll ahead to know the width of right-most item - const container = this.$refs.container - const item = this.newOffsetRight(this.scrollOffset, this.itemOffset) - const itemWidth = item && container.children[item.index].clientWidth || 0 - const scrollOffset = this.scrollOffset + container.clientWidth - - return container.scrollWidth - scrollOffset > itemWidth * 0.30 - } - }, - - methods: { - genContainer () { - return this.$createElement('ul', { - 'class': this.containerClasses, - 'style': this.containerStyles, - ref: 'container' - }, this.$slots.default) - }, - genIcon (direction) { - const capitalize = direction.charAt(0).toUpperCase() + direction.slice(1) - return this.$createElement(VIcon, { - props: { [`${direction}`]: true }, - style: { display: 'inline-flex' }, - on: { - click: this[`scroll${capitalize}`] - } - }, `chevron_${direction}`) - }, - genWrapper () { - return this.$createElement('div', { - class: this.wrapperClasses, - directives: [{ - name: 'touch', - value: { - start: this.start, - move: this.move, - end: this.end - } - }] - }, [this.genContainer()]) - }, - start (e) { - this.startX = this.scrollOffset + e.touchstartX - this.$refs.container.style.transition = 'none' - }, - move (e) { - const offset = this.startX - e.touchmoveX - this.scrollOffset = offset - }, - end (e) { - this.onResize() - const container = this.$refs.container - const scrollWidth = container.scrollWidth - this.$el.clientWidth / 2 - container.style.transition = null - - if (this.scrollOffset < 0 || !this.isOverflowing) { - this.scrollOffset = 0 - } else if (this.scrollOffset >= scrollWidth) { - const lastItem = container.children[container.children.length - 1] - this.scrollOffset = scrollWidth - lastItem.clientWidth - } - }, - scrollLeft () { - const { offset, index } = this.newOffset('Left') - this.scrollOffset = offset - this.itemOffset = index - }, - scrollRight () { - const { offset, index } = this.newOffset('Right') - this.scrollOffset = offset - this.itemOffset = index - }, - onResize () { - if (this._isDestroyed) return - - const container = this.$refs.container - this.isOverflowing = container.clientWidth < container.scrollWidth - }, - newOffset (direction) { - return this[`newOffset${direction}`](this.scrollOffset, this.itemOffset) - }, - newOffsetLeft (currentOffset, currentIndex) { - const container = this.$refs.container - const items = container.children - let offset = 0 - - for (let index = currentIndex - 1; index >= 0; index--) { - if (!items[index].classList.contains('tabs__slider')) { - const newOffset = offset + items[index].clientWidth - if (newOffset >= container.clientWidth) { - return { offset: currentOffset - offset, index: index + 1 } - } - offset = newOffset - } - } - - return { offset: 0, index: 0 } - }, - newOffsetRight (currentOffset, currentIndex) { - const container = this.$refs.container - const items = container.children - let offset = currentOffset - - for (let index = currentIndex; index < items.length; index++) { - if (!items[index].classList.contains('tabs__slider')) { - const newOffset = offset + items[index].clientWidth - if (newOffset > currentOffset + container.clientWidth) { - return { offset, index } - } - offset = newOffset - } - } - - return null - } - }, - - render (h) { - return h('div', { - 'class': this.addBackgroundColorClassChecks(this.classes), - directives: [{ - name: 'resize', - value: this.onResize - }] - }, [ - this.genWrapper(), - this.leftIconVisible ? this.genIcon('left') : null, - this.rightIconVisible ? this.genIcon('right') : null - ]) - } -} diff --git a/src/components/VTabs/VTabsItem.js b/src/components/VTabs/VTabsItem.js deleted file mode 100644 index faaf2485aeb1..000000000000 --- a/src/components/VTabs/VTabsItem.js +++ /dev/null @@ -1,99 +0,0 @@ -import Routable from '../../mixins/routable' - -export default { - name: 'v-tabs-item', - - inject: ['slider', 'tabClick', 'addTabItem', 'removeTabItem'], - - mixins: [Routable], - - data () { - return { - isActive: false - } - }, - - props: { - activeClass: { - type: String, - default: 'tabs__item--active' - } - }, - - computed: { - classes () { - const classes = { - 'tabs__item': true, - 'tabs__item--disabled': this.disabled - } - - classes[this.activeClass] = !this.to && this.isActive - - return classes - }, - action () { - const to = this.to || this.href - - if (!to || to === Object(to)) return this._uid - - return to.replace('#', '') - } - }, - - watch: { - $route () { - this.to && this.callSlider() - } - }, - - mounted () { - this.addTabItem(this.action, this.toggle, this.$el) - this.callSlider() - }, - - beforeDestroy () { - this.removeTabItem(this.action) - }, - - methods: { - callSlider () { - setTimeout(() => { - this.$el.firstChild.classList.contains('tabs__item--active') && - this.slider(this.$el) - }, 0) - }, - click (e) { - e.preventDefault() - this.$emit('click', e) - - if (!this.to && !this.href) return - - if (!this.to) { - this.tabClick(this.action) - } - - this.callSlider() - }, - - toggle (action) { - this.isActive = this.action === action - - this.$nextTick(() => { - this.isActive && this.slider(this.$el) - }) - } - }, - - render (h) { - const link = this.generateRouteLink() - const { data } = link - - // If disabled, use div as anchor tags do not support - // being disabled - const tag = this.disabled ? 'div' : link.tag - - return h('li', { - 'class': 'tabs__li' - }, [h(tag, data, this.$slots.default)]) - } -} diff --git a/src/components/VTabs/VTabsItems.js b/src/components/VTabs/VTabsItems.js index 6186494fbfe6..24091781eb48 100644 --- a/src/components/VTabs/VTabsItems.js +++ b/src/components/VTabs/VTabsItems.js @@ -1,23 +1,124 @@ +// Mixins +import { + provide as RegistrableProvide +} from '../../mixins/registrable' + +// Directives import Touch from '../../directives/touch' export default { name: 'v-tabs-items', + mixins: [RegistrableProvide('tabs')], + directives: { Touch }, - inject: ['next', 'prev'], + inject: { + registerItems: { + default: null + }, + tabProxy: { + default: null + }, + unregisterItems: { + default: null + } + }, + + data () { + return { + items: [], + lazyValue: this.value, + reverse: false + } + }, props: { cycle: Boolean, - touchless: Boolean + touchless: Boolean, + value: [Number, String] + }, + + computed: { + activeIndex () { + return this.items.findIndex((item, index) => (item.id || index.toString()) === this.lazyValue) + }, + activeItem () { + if (!this.items.length) return undefined + + return this.items[this.activeIndex] + }, + inputValue: { + get () { + return this.lazyValue + }, + set (val) { + val = val.toString() + + this.lazyValue = val + + if (this.tabProxy) this.tabProxy(val) + else this.$emit('input', val) + } + } + }, + + watch: { + activeIndex (current, previous) { + this.reverse = current < previous + this.updateItems() + }, + value (val) { + this.lazyValue = val + } + }, + + mounted () { + this.registerItems && this.registerItems(this.changeModel) + }, + + beforeDestroy () { + this.unregisterItems && this.unregisterItems() }, methods: { - swipeLeft () { - this.next(this.cycle) + changeModel (val) { + this.inputValue = val }, - swipeRight () { - this.prev(this.cycle) + next (cycle) { + let nextIndex = this.activeIndex + 1 + + if (!this.items[nextIndex]) { + if (!cycle) return + nextIndex = 0 + } + + this.inputValue = this.items[nextIndex].id || nextIndex + }, + prev (cycle) { + let prevIndex = this.activeIndex - 1 + + if (!this.items[prevIndex]) { + if (!cycle) return + prevIndex = this.items.length - 1 + } + + this.inputValue = this.items[prevIndex].id || prevIndex + }, + onSwipe (action) { + this[action](this.cycle) + }, + register (item) { + this.items.push(item) + }, + unregister (item) { + this.items = this.items.filter(i => i !== item) + }, + updateItems () { + for (let index = this.items.length; --index >= 0;) { + this.items[index].toggle(this.lazyValue, this.reverse, this.isBooted, index) + } + this.isBooted = true } }, @@ -30,8 +131,8 @@ export default { !this.touchless && data.directives.push({ name: 'touch', value: { - left: this.swipeLeft, - right: this.swipeRight + left: () => this.onSwipe('next'), + right: () => this.onSwipe('prev') } }) diff --git a/src/components/VTabs/VTabsItems.spec.js b/src/components/VTabs/VTabsItems.spec.js new file mode 100644 index 000000000000..a0bb3daac462 --- /dev/null +++ b/src/components/VTabs/VTabsItems.spec.js @@ -0,0 +1,84 @@ +import { test, touch } from '@util/testing' +import { createRange } from '@util/helpers' +import VTabItem from './VTabItem' +import VTabsItems from './VTabsItems' + +test('VTabsItems', ({ mount, shallow }) => { + it('should have no active item with no children', () => { + const wrapper = mount(VTabsItems) + + expect(wrapper.vm.activeItem).toBe(undefined) + }) + + it('should return currently active item', async () => { + const wrapper = shallow(VTabsItems, { + propsData: { + value: 'foo' + }, + slots: { + default: [{ + render: h => h(VTabItem, { + props: { id: 'foo' } + }) + }] + } + }) + + expect(wrapper.vm.activeIndex).toBe(0) + expect(wrapper.vm.activeItem).toBeTruthy() + }) + + it('should return lazy value', () => { + const wrapper = mount(VTabsItems) + + expect(wrapper.vm.inputValue).toBe(undefined) + wrapper.setProps({ value: 'foo' }) + expect(wrapper.vm.inputValue).toBe('foo') + expect(wrapper.vm.lazyValue).toBe('foo') + }) + + it('should emit input value when registerItems is not provided', () => { + const wrapper = mount(VTabsItems) + const input = jest.fn() + wrapper.vm.$on('input', input) + + wrapper.vm.inputValue = 'foo' + expect(input).toHaveBeenCalled() + }) + + it('should react to touch', () => { + const wrapper = mount(VTabsItems, { + propsData: { value: '1' }, + slots: { + default: createRange(5).map(x => ({ + render: h => h(VTabItem, { + props: { id: x.toString() } + }) + })) + } + }) + + expect(wrapper.vm.inputValue).toBe('1') + touch(wrapper).start(0, 0).end(200, 0) + expect(wrapper.vm.inputValue).toBe('0') + // Without cycle, should stay on this index + touch(wrapper).start(0, 0).end(200, 0) + expect(wrapper.vm.inputValue).toBe('0') + + touch(wrapper).start(200, 0).end(0, 0) + expect(wrapper.vm.inputValue).toBe('1') + + wrapper.setProps({ value: '4' }) + touch(wrapper).start(200, 0).end(0, 0) + expect(wrapper.vm.inputValue).toBe('4') + + wrapper.setProps({ cycle: true }) + wrapper.setProps({ value: '4' }) + touch(wrapper).start(200, 0).end(0, 0) + expect(wrapper.vm.inputValue).toBe('0') + + wrapper.setProps({ value: '0' }) + touch(wrapper).start(0, 0).end(200, 0) + expect(wrapper.vm.inputValue).toBe('4') + }) +}) diff --git a/src/components/VTabs/VTabsSlider.js b/src/components/VTabs/VTabsSlider.js index ab773d4241ab..084b6f7fad96 100755 --- a/src/components/VTabs/VTabsSlider.js +++ b/src/components/VTabs/VTabsSlider.js @@ -10,7 +10,7 @@ export default { }), render (h) { - return h('li', { + return h('div', { staticClass: 'tabs__slider', class: this.addBackgroundColorClassChecks() }) diff --git a/src/components/VTabs/VTabsSlider.spec.js b/src/components/VTabs/VTabsSlider.spec.js index 0a05db620cd3..4d57180dc826 100755 --- a/src/components/VTabs/VTabsSlider.spec.js +++ b/src/components/VTabs/VTabsSlider.spec.js @@ -1,8 +1,7 @@ -import { test } from '~util/testing' -import { mount } from 'avoriaz' -import VTabsSlider from '~components/VTabs/VTabsSlider.js' +import { test } from '@util/testing' +import VTabsSlider from '@components/VTabs/VTabsSlider.js' -test('VTabsSlider.vue', () => { +test('VTabsSlider.vue', ({ mount }) => { it('should render a tabs slider', () => { const wrapper = mount(VTabsSlider, { propsData: { diff --git a/src/components/VTabs/__snapshots__/VTabs.spec.js.snap b/src/components/VTabs/__snapshots__/VTabs.spec.js.snap new file mode 100644 index 000000000000..3ad5ec5f8da2 --- /dev/null +++ b/src/components/VTabs/__snapshots__/VTabs.spec.js.snap @@ -0,0 +1,18 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VTabs should show tabs arrows 1`] = ` + +
+
+
+
+
+
+
+
+
+
+
+
+ +`; diff --git a/src/components/VTabs/index.js b/src/components/VTabs/index.js index 2ed6c53de6a4..fea3fccb6cc3 100644 --- a/src/components/VTabs/index.js +++ b/src/components/VTabs/index.js @@ -1,19 +1,17 @@ import VTabs from './VTabs' -import VTabsBar from './VTabsBar' -import VTabsContent from './VTabsContent' -import VTabsItem from './VTabsItem' +import VTab from './VTab' import VTabsItems from './VTabsItems' +import VTabItem from './VTabItem' import VTabsSlider from './VTabsSlider' -export { VTabs, VTabsBar, VTabsContent, VTabsItem, VTabsItems, VTabsSlider } +export { VTabs, VTabItem, VTab, VTabsItems, VTabsSlider } /* istanbul ignore next */ VTabs.install = function install (Vue) { Vue.component(VTabs.name, VTabs) - Vue.component(VTabsBar.name, VTabsBar) - Vue.component(VTabsContent.name, VTabsContent) - Vue.component(VTabsItem.name, VTabsItem) + Vue.component(VTab.name, VTab) Vue.component(VTabsItems.name, VTabsItems) + Vue.component(VTabItem.name, VTabItem) Vue.component(VTabsSlider.name, VTabsSlider) } diff --git a/src/components/VTabs/mixins/tabs-computed.js b/src/components/VTabs/mixins/tabs-computed.js new file mode 100644 index 000000000000..be05ffbce064 --- /dev/null +++ b/src/components/VTabs/mixins/tabs-computed.js @@ -0,0 +1,55 @@ +/** + * Tabs computed + * + * @mixin + */ +export default { + computed: { + activeIndex () { + return this.tabs.findIndex((tab, index) => { + const id = tab.action === tab ? index.toString() : tab.action + return id === this.lazyValue + }) + }, + activeTab () { + if (!this.tabs.length) return undefined + + return this.tabs[this.activeIndex] + }, + containerStyles () { + return this.height ? { + height: `${parseInt(this.height, 10)}px` + } : null + }, + hasArrows () { + return (this.showArrows || !this.isMobile) && this.isOverflowing + }, + inputValue: { + get () { + return this.lazyValue + }, + set (val) { + // Always use strings + val = val.toString() + + this.lazyValue = val + this.$emit('input', val) + } + }, + isMobile () { + return this.$vuetify.breakpoint.width < this.mobileBreakPoint + }, + sliderStyles () { + return { + left: `${this.sliderLeft}px`, + transition: this.sliderLeft != null ? null : 'none', + width: `${this.sliderWidth}px` + } + }, + target () { + return this.activeTab + ? this.activeTab.action + : null + } + } +} diff --git a/src/components/VTabs/mixins/tabs-generators.js b/src/components/VTabs/mixins/tabs-generators.js new file mode 100644 index 000000000000..adfa82a83f43 --- /dev/null +++ b/src/components/VTabs/mixins/tabs-generators.js @@ -0,0 +1,96 @@ +/** + * Tabs generators + * + * @mixin + */ +export default { + methods: { + genBar (items) { + return this.$createElement('div', { + staticClass: 'tabs__bar', + 'class': this.addBackgroundColorClassChecks({ + 'theme--dark': this.dark, + 'theme--light': this.light + }), + ref: 'bar' + }, [ + this.genTransition('prev'), + this.genWrapper( + this.genContainer(items) + ), + this.genTransition('next') + ]) + }, + genContainer (items) { + return this.$createElement('div', { + staticClass: 'tabs__container', + class: { + 'tabs__container--align-with-title': this.alignWithTitle, + 'tabs__container--centered': this.centered, + 'tabs__container--fixed-tabs': this.fixedTabs, + 'tabs__container--grow': this.grow, + 'tabs__container--icons-and-text': this.iconsAndText, + 'tabs__container--overflow': this.isOverflowing, + 'tabs__container--right': this.right + }, + style: this.containerStyles, + ref: 'container' + }, items) + }, + genIcon (direction) { + if (!this.hasArrows || + !this[`${direction}IconVisible`] + ) return null + + return this.$createElement('v-icon', { + staticClass: `tabs__icon tabs__icon--${direction}`, + props: { + disabled: !this[`${direction}IconVisible`] + }, + on: { + click: () => this.scrollTo(direction) + } + }, this[`${direction}Icon`]) + }, + genItems (items, item) { + if (items.length > 0) return items + if (!item.length) return null + + return this.$createElement('v-tabs-items', item) + }, + genTransition (direction) { + return this.$createElement('transition', { + props: { name: 'fade-transition' } + }, [this.genIcon(direction)]) + }, + genWrapper (items) { + return this.$createElement('div', { + staticClass: 'tabs__wrapper', + class: { + 'tabs__wrapper--show-arrows': this.hasArrows + }, + ref: 'wrapper', + directives: [{ + name: 'touch', + value: { + start: e => this.overflowCheck(e, this.onTouchStart), + move: e => this.overflowCheck(e, this.onTouchMove), + end: e => this.overflowCheck(e, this.onTouchEnd) + } + }] + }, [items]) + }, + genSlider (items) { + if (!items.length) { + items = [this.$createElement('v-tabs-slider', { + props: { color: this.sliderColor } + })] + } + + return this.$createElement('div', { + staticClass: 'tabs__slider-wrapper', + style: this.sliderStyles + }, items) + } + } +} diff --git a/src/components/VTabs/mixins/tabs-props.js b/src/components/VTabs/mixins/tabs-props.js new file mode 100644 index 000000000000..991b9f9b70ab --- /dev/null +++ b/src/components/VTabs/mixins/tabs-props.js @@ -0,0 +1,40 @@ +/** + * Tabs props + * + * @mixin + */ +export default { + props: { + alignWithTitle: Boolean, + centered: Boolean, + fixedTabs: Boolean, + grow: Boolean, + height: { + type: [Number, String], + default: undefined, + validator: v => !isNaN(parseInt(v)) + }, + hideSlider: Boolean, + iconsAndText: Boolean, + mobileBreakPoint: { + type: [Number, String], + default: 1264, + validator: v => !isNaN(parseInt(v)) + }, + nextIcon: { + type: String, + default: 'chevron_right' + }, + prevIcon: { + type: String, + default: 'chevron_left' + }, + right: Boolean, + showArrows: Boolean, + sliderColor: { + type: String, + default: 'accent' + }, + value: [Number, String] + } +} diff --git a/src/components/VTabs/mixins/tabs-touch.js b/src/components/VTabs/mixins/tabs-touch.js new file mode 100644 index 000000000000..dec2a1c33dab --- /dev/null +++ b/src/components/VTabs/mixins/tabs-touch.js @@ -0,0 +1,40 @@ +/** + * Tabs touch + * + * @mixin + */ +export default { + methods: { + newOffset (direction) { + const clientWidth = this.$refs.wrapper.clientWidth + + if (direction === 'prev') { + return Math.max(this.scrollOffset - clientWidth, 0) + } else { + return Math.min(this.scrollOffset + clientWidth, this.$refs.container.clientWidth - clientWidth) + } + }, + onTouchStart (e) { + this.startX = this.scrollOffset + e.touchstartX + this.$refs.container.style.transition = 'none' + this.$refs.container.style.willChange = 'transform' + }, + onTouchMove (e) { + this.scrollOffset = this.startX - e.touchmoveX + }, + onTouchEnd () { + const container = this.$refs.container + const wrapper = this.$refs.wrapper + const maxScrollOffset = container.clientWidth - wrapper.clientWidth + container.style.transition = null + container.style.willChange = null + + /* istanbul ignore else */ + if (this.scrollOffset < 0 || !this.isOverflowing) { + this.scrollOffset = 0 + } else if (this.scrollOffset >= maxScrollOffset) { + this.scrollOffset = maxScrollOffset + } + } + } +} diff --git a/src/components/VTabs/mixins/tabs-watchers.js b/src/components/VTabs/mixins/tabs-watchers.js new file mode 100644 index 000000000000..61357c3dd733 --- /dev/null +++ b/src/components/VTabs/mixins/tabs-watchers.js @@ -0,0 +1,41 @@ +/** + * Tabs watchers + * + * @mixin + */ +export default { + watch: { + activeTab (tab, prev) { + !prev && tab && this.updateTabs() + + setTimeout(this.callSlider, 0) + + if (!tab) return + + const action = tab.action + this.tabItems && this.tabItems(action === tab ? this.tabs.indexOf(tab).toString() : action) + }, + alignWithTitle: 'callSlider', + centered: 'callSlider', + fixedTabs: 'callSlider', + isBooted: 'findActiveLink', + lazyValue: 'updateTabs', + right: 'callSlider', + value (val) { + const tab = this.tabs.find(tab => tab.action === val) || this.tabs[val] + + if (!tab) return + + this.tabClick(tab) + }, + '$vuetify.application.left': 'onContainerResize', + '$vuetify.application.right': 'onContainerResize', + scrollOffset (val) { + this.$refs.container.style.transform = `translateX(${-val}px)` + if (this.hasArrows) { + this.prevIconVisible = this.checkPrevIcon() + this.nextIconVisible = this.checkNextIcon() + } + } + } +} diff --git a/src/components/VTextField/VTextField.js b/src/components/VTextField/VTextField.js index 217d21c5d429..11d5d6526ffb 100644 --- a/src/components/VTextField/VTextField.js +++ b/src/components/VTextField/VTextField.js @@ -1,15 +1,22 @@ -require('../../stylus/components/_input-groups.styl') -require('../../stylus/components/_text-fields.styl') +// Styles +import '../../stylus/components/_input-groups.styl' +import '../../stylus/components/_text-fields.styl' +// Mixins import Colorable from '../../mixins/colorable' import Input from '../../mixins/input' import Maskable from '../../mixins/maskable' -import { isMaskDelimiter } from '../../util/mask' +import Soloable from '../../mixins/soloable' export default { name: 'v-text-field', - mixins: [Colorable, Input, Maskable], + mixins: [ + Colorable, + Input, + Maskable, + Soloable + ], inheritAttrs: false, @@ -18,8 +25,7 @@ export default { initialValue: null, inputHeight: null, internalChange: false, - badInput: false, - lazySelection: 0 + badInput: false } }, @@ -35,13 +41,20 @@ export default { counter: [Boolean, Number, String], fullWidth: Boolean, multiLine: Boolean, + noResize: Boolean, placeholder: String, prefix: String, + rowHeight: { + type: [Number, String], + default: 24, + validator: v => !isNaN(parseFloat(v)) + }, rows: { - default: 5 + type: [Number, String], + default: 5, + validator: v => !isNaN(parseInt(v, 10)) }, singleLine: Boolean, - solo: Boolean, suffix: String, textarea: Boolean, type: { @@ -53,12 +66,13 @@ export default { computed: { classes () { const classes = { + ...this.genSoloClasses(), 'input-group--text-field': true, 'input-group--text-field-box': this.box, - 'input-group--single-line': this.singleLine || this.solo, - 'input-group--solo': this.solo, + 'input-group--single-line': this.singleLine || this.isSolo, 'input-group--multi-line': this.multiLine, 'input-group--full-width': this.fullWidth, + 'input-group--no-resize': this.noResizeHandle, 'input-group--prefix': this.prefix, 'input-group--suffix': this.suffix, 'input-group--textarea': this.textarea @@ -98,13 +112,19 @@ export default { } }, isDirty () { - return this.lazyValue != null && - this.lazyValue.toString().length > 0 || + return (this.lazyValue != null && + this.lazyValue.toString().length > 0) || this.badInput || ['time', 'date', 'datetime-local', 'week', 'month'].includes(this.type) }, + isTextarea () { + return this.multiLine || this.textarea + }, + noResizeHandle () { + return this.isTextarea && (this.noResize || this.shouldAutoGrow) + }, shouldAutoGrow () { - return (this.multiLine || this.textarea) && this.autoGrow + return this.isTextarea && this.autoGrow } }, @@ -148,9 +168,8 @@ export default { const height = this.$refs.input ? this.$refs.input.scrollHeight : 0 - const minHeight = this.rows * 24 - const inputHeight = height < minHeight ? minHeight : height - this.inputHeight = inputHeight + (this.textarea ? 4 : 0) + const minHeight = parseInt(this.rows, 10) * parseFloat(this.rowHeight) + this.inputHeight = Math.max(minHeight, height) }) }, onInput (e) { @@ -184,7 +203,7 @@ export default { // Prevents closing of a // dialog when pressing // enter - if (this.multiLine && + if (this.isTextarea && this.isFocused && e.keyCode === 13 ) { @@ -202,20 +221,20 @@ export default { }, this.count) }, genInput () { - const tag = this.multiLine || this.textarea ? 'textarea' : 'input' + const tag = this.isTextarea ? 'textarea' : 'input' const listeners = Object.assign({}, this.$listeners) delete listeners['change'] // Change should not be bound externally const data = { style: {}, domProps: { - autofocus: this.autofocus, - disabled: this.disabled, - required: this.required, value: this.maskText(this.lazyValue) }, attrs: { ...this.$attrs, + autofocus: this.autofocus, + disabled: this.disabled, + required: this.required, readonly: this.readonly, tabindex: this.tabindex, 'aria-label': (!this.$attrs || !this.$attrs.id) && this.label // Label `for` will be set if we have an id @@ -233,12 +252,12 @@ export default { data.style.height = this.inputHeight && `${this.inputHeight}px` } - if (this.placeholder) data.domProps.placeholder = this.placeholder + if (this.placeholder) data.attrs.placeholder = this.placeholder - if (!this.textarea && !this.multiLine) { - data.domProps.type = this.type + if (!this.isTextarea) { + data.attrs.type = this.type } else { - data.domProps.rows = this.rows + data.attrs.rows = this.rows } if (this.mask) { @@ -260,15 +279,6 @@ export default { clearableCallback () { this.inputValue = null this.$nextTick(() => this.$refs.input.focus()) - }, - resetSelections (input) { - if (!input.selectionEnd) return - this.selection = input.selectionEnd - this.lazySelection = 0 - - for (const char of input.value.substr(0, this.selection)) { - isMaskDelimiter(char) || this.lazySelection++ - } } }, diff --git a/src/components/VTextField/VTextField.spec.js b/src/components/VTextField/VTextField.spec.js index 417a5690d5c4..769b1562555b 100644 --- a/src/components/VTextField/VTextField.spec.js +++ b/src/components/VTextField/VTextField.spec.js @@ -1,7 +1,7 @@ -import { test } from '~util/testing' +import { test } from '@util/testing' import Vue from 'vue/dist/vue.common' -import VTextField from '~components/VTextField' -import VProgressLinear from '~components/VProgressLinear' +import VTextField from '@components/VTextField' +import VProgressLinear from '@components/VProgressLinear' test('VTextField.js', ({ mount }) => { it('should render component and match snapshot', () => { @@ -288,7 +288,7 @@ test('VTextField.js', ({ mount }) => { input.trigger('blur') await wrapper.vm.$nextTick() - expect(change.mock.calls.length).toBe(0) + expect(change.mock.calls).toHaveLength(0) }) it('should render component with async loading and match snapshot', () => { @@ -351,4 +351,214 @@ test('VTextField.js', ({ mount }) => { await wrapper.vm.$nextTick() expect(wrapper.vm.internalChange).toBe(false) }) + + it('should emit input when externally set value was modified internally', async () => { + let value = '33' + const input = jest.fn() + const wrapper = mount(VTextField, { + propsData: { + value, + mask: '##', + returnMaskedValue: true + } + }) + + wrapper.vm.$on('input', (v) => { + value = v + }) + wrapper.vm.$on('input', input) + + wrapper.setProps({ value: '4444' }) + await wrapper.vm.$nextTick() + + expect(value).toBe('44') + expect(input).toBeCalled() + }) + + it('should mask value if return-masked-value is true', async () => { + let value = '44' + const component = { + render (h) { + return h(VTextField, { + on: { + input: i => value = i + }, + props: { + value, + returnMaskedValue: true, + mask: '#-#', + } + }) + } + } + + const wrapper = mount(component) + const input = wrapper.find('input')[0] + + expect(value).toBe('4-4') + + input.trigger('focus') + await wrapper.vm.$nextTick() + input.element.value = '33' + input.trigger('input') + await wrapper.vm.$nextTick() + + expect(value).toBe('3-3') + }) + + it('should not mask value if return-masked-value is false', async () => { + let value = '44' + const component = { + render (h) { + return h(VTextField, { + on: { + input: i => value = i + }, + props: { + value, + returnMaskedValue: false, + mask: '#-#', + } + }) + } + } + + const wrapper = mount(component) + const input = wrapper.find('input')[0] + + expect(value).toBe('44') + + input.trigger('focus') + await wrapper.vm.$nextTick() + input.element.value = '33' + input.trigger('input') + await wrapper.vm.$nextTick() + + expect(value).toBe('33') + }) + + it('should use pre-defined mask if prop matches', async () => { + let value = '12311999' + const component = { + render (h) { + return h(VTextField, { + on: { + input: i => value = i + }, + props: { + value, + returnMaskedValue: true, + mask: 'date', + } + }) + } + } + + const wrapper = mount(component) + + expect(value).toBe('12/31/1999') + }) + + it('should allow switching mask', async () => { + const wrapper = mount(VTextField, { + propsData: { + mask: '#-#-#', + value: '1-2-3' + } + }) + + const input = wrapper.find('input')[0] + + expect(input.element.value).toBe('1-2-3') + + wrapper.setProps({ mask: '#.#.#'}) + await wrapper.vm.$nextTick() + + expect(input.element.value).toBe('1.2.3') + + wrapper.setProps({ mask: '#,#' }) + await wrapper.vm.$nextTick() + + expect(input.element.value).toBe('1,2') + }) + + it('should calculate element height when using auto-grow prop', async () => { + let value = '' + const component = { + render (h) { + return h(VTextField, { + on: { + input: i => value = i + }, + props: { + value, + multiLine: true, + autoGrow: true + } + }) + } + } + + const wrapper = mount(component) + const input = wrapper.find('textarea')[0] + + input.trigger('focus') + await wrapper.vm.$nextTick() + input.element.value = 'this is a really long text that should hopefully make auto-grow kick in. maybe?' + input.trigger('input') + await wrapper.vm.$nextTick() + + expect(wrapper.html()).toMatchSnapshot() + expect(input.element.style.getPropertyValue('height').length).not.toBe(0) + }) + + it('should match multi-line snapshot', () => { + const wrapper = mount(VTextField, { + propsData: { + multiLine: true + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should match textarea snapshot', () => { + const wrapper = mount(VTextField, { + propsData: { + textarea: true + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should match auto-grow snapshot', async () => { + const wrapper = mount(VTextField, { + propsData: { + textarea: true, + autoGrow: true + } + }) + await wrapper.vm.$nextTick() + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should render no-resize the same if already auto-grow', () => { + const wrappers = [ + { autoGrow:true, multiLine: true }, + { autoGrow:true, textarea: true } + ].map(propsData => mount(VTextField,{propsData})) + + wrappers.forEach(async wrapper => { + await wrapper.vm.$nextTick() + const html1 = wrapper.html() + + wrapper.setProps({ noResize: true }) + // will still pass without this, do not remove + await wrapper.vm.$nextTick() + const html2 = wrapper.html() + + expect(html2).toBe(html1) + }) + }) }) diff --git a/src/components/VTextField/__snapshots__/VTextField.spec.js.snap b/src/components/VTextField/__snapshots__/VTextField.spec.js.snap index 7508a3ea20f6..8df0cb97e2a1 100644 --- a/src/components/VTextField/__snapshots__/VTextField.spec.js.snap +++ b/src/components/VTextField/__snapshots__/VTextField.spec.js.snap @@ -1,5 +1,67 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`VTextField.js should calculate element height when using auto-grow prop 1`] = ` + +
+
+ +
+
+
+
+ +`; + +exports[`VTextField.js should match auto-grow snapshot 1`] = ` + +
+
+ +
+
+
+
+ +`; + +exports[`VTextField.js should match multi-line snapshot 1`] = ` + +
+
+ +
+
+
+
+ +`; + +exports[`VTextField.js should match textarea snapshot 1`] = ` + +
+
+ +
+
+
+
+ +`; + exports[`VTextField.js should not display counter when set to false 1`] = `
@@ -9,8 +71,6 @@ exports[`VTextField.js should not display counter when set to false 1`] = ` >
-
-
0 / 25
@@ -28,8 +88,6 @@ exports[`VTextField.js should not display counter when set to false 2`] = ` >
-
-
@@ -44,8 +102,6 @@ exports[`VTextField.js should render component and match snapshot 1`] = ` >
-
-
@@ -64,7 +120,7 @@ exports[`VTextField.js should render component with async loading and custom pro style="height: 7px;" >
@@ -74,11 +130,8 @@ exports[`VTextField.js should render component with async loading and custom pro
- -
-
@@ -97,7 +150,7 @@ exports[`VTextField.js should render component with async loading and match snap style="height: 2px;" >
@@ -107,11 +160,8 @@ exports[`VTextField.js should render component with async loading and match snap
- -
-
diff --git a/src/components/VTimePicker/VTimePicker.js b/src/components/VTimePicker/VTimePicker.js index 2eb468c5166b..0589af5f6b84 100644 --- a/src/components/VTimePicker/VTimePicker.js +++ b/src/components/VTimePicker/VTimePicker.js @@ -1,38 +1,41 @@ -require('../../stylus/components/_pickers.styl') -require('../../stylus/components/_time-picker.styl') +// Components +import VTimePickerTitle from './VTimePickerTitle' +import VTimePickerClock from './VTimePickerClock' -import { createRange } from '../../util/helpers' +// Mixins +import Picker from '../../mixins/picker' -import VCard from '../VCard' +// Utils +import { createRange } from '../../util/helpers' +import pad from '../VDatePicker/util/pad' -import Picker from '../../mixins/picker' -import TimeTitle from './mixins/time-title' -import TimeBody from './mixins/time-body' +const rangeHours24 = createRange(24) +const rangeHours12am = createRange(12) +const rangeHours12pm = rangeHours12am.map(v => v + 12) +const rangeMinutes = createRange(60) export default { name: 'v-time-picker', components: { - VCard + VTimePickerTitle, + VTimePickerClock }, - mixins: [Picker, TimeBody, TimeTitle], + mixins: [Picker], data () { return { - isDragging: false, - rotate: 0, - originalTime: this.value, + inputHour: null, + inputMinute: null, period: 'am', - selectingHour: true, - ranges: { - hours: createRange(24), - minutes: createRange(60) - } + selectingHour: true } }, props: { + allowedHours: Function, + allowedMinutes: Function, format: { type: String, default: 'ampm', @@ -40,248 +43,178 @@ export default { return ['ampm', '24hr'].includes(val) } }, - allowedHours: { - type: [Array, Object, Function], - default: () => (null) - }, - allowedMinutes: { - type: [Array, Object, Function], - default: () => (null) - } + min: String, + max: String, + scrollable: Boolean, + value: null }, computed: { - is24hr () { - return this.format !== 'ampm' - }, - is24hrAfter12 () { - return this.selectingHour && this.is24hr && this.hour >= 12 - }, - divider () { - return this.selectingHour ? 12 : 60 - }, - degrees () { - return this.degreesPerUnit * Math.PI / 180 - }, - degreesPerUnit () { - return 360 / this.divider - }, - inputTime: { - get () { - if (this.value && !(this.value instanceof Date)) { - if (!this.is24hr) { - this.period = this.value.match(/pm/i) - ? 'pm' - : 'am' - } - - return this.value - } - let value = new Date() - - if (this.value instanceof Date) { - value = this.value - } - - let hour = value.getHours() - let minute = value.getMinutes() - let period = '' + isAllowedHourCb () { + if (!this.min && !this.max) return this.allowedHours - if (!this.is24hr) { - period = hour >= 12 ? 'pm' : 'am' - hour = hour > 12 ? hour - 12 : hour - hour = hour === 0 ? 12 : hour - } + const minHour = this.min ? this.min.split(':')[0] : 0 + const maxHour = this.max ? this.max.split(':')[0] : 23 - period && (this.period = period) - - hour = this.firstAllowed('hour', hour) - minute = this.firstAllowed('minute', minute) - - minute = minute < 10 ? `0${minute}` : minute > 59 ? '00' : minute - - return `${hour}:${minute}${period}` - }, - set (val) { - return this.$emit('input', val) + return val => { + return val >= minHour * 1 && + val <= maxHour * 1 && + (!this.allowedHours || this.allowedHours(val)) } }, - timeArray () { - return this.inputTime.replace(/(am|pm)/, '').split(':') - }, - hour: { - get () { - return parseInt(this.timeArray[0]) - }, - set (val) { - if (!this.is24hr) { - val = val > 12 ? val - 12 : val < 1 ? 12 : val - } else { - val = val < 10 ? `0${val}` : val > 23 ? '00' : val - } - - this.inputTime = `${val}:${this.minute}${!this.is24hr ? this.period : ''}` + isAllowedMinuteCb () { + const isHourAllowed = !this.allowedHours || this.allowedHours(this.inputHour) + if (!this.min && !this.max) { + return isHourAllowed ? this.allowedMinutes : () => false } - }, - minute: { - get () { - const minute = parseInt(this.timeArray[1]) - - return minute < 10 ? `0${minute}` : minute > 59 ? '00' : minute - }, - set (val) { - val = val < 10 ? `0${parseInt(val)}` : val > 59 ? '00' : val - let hour = this.hour - if (this.is24hr && hour < 10) { - hour = `0${hour}` - } - - this.inputTime = `${hour}:${val}${!this.is24hr ? this.period : ''}` + const [minHour, minMinute] = this.min ? this.min.split(':') : [0, 0] + const [maxHour, maxMinute] = this.max ? this.max.split(':') : [23, 59] + const minTime = minHour * 60 + minMinute * 1 + const maxTime = maxHour * 60 + maxMinute * 1 + + return val => { + const time = 60 * this.inputHour + val + return time >= minTime && + time <= maxTime && + isHourAllowed && + (!this.allowedMinutes || this.allowedMinutes(val)) } }, - clockHand () { - if (this.selectingHour) return this.degreesPerUnit * this.hour - return this.degreesPerUnit * this.minute - }, - radius () { - return this.clockSize / 2 - }, - clockSize: { - get () { - return this.size - }, - set (val) { - this.size = val - } - }, - size () { - return this.landscape ? 250 : 280 + isAmPm () { + return this.format === 'ampm' } }, watch: { - period (val) { - const hour = !!this.allowedHours && this.selectingHour ? this.firstAllowed('hour', this.hour - 1) : this.hour - this.inputTime = `${hour}:${this.minute}${val}` - }, - value (val) { - if (this.isSaving) { - this.originalTime = this.inputTime - this.isSaving = false - } - } + value: 'setInputData' }, methods: { - save () { - if (this.originalTime) { - this.originalTime = this.value - } else { - this.inputTime = this.inputTime - this.originalTime = this.inputTime + emitValue () { + if (this.inputHour != null && this.inputMinute != null) { + this.$emit('input', `${pad(this.inputHour)}:${pad(this.inputMinute)}`) } - - if (this.$parent && this.$parent.isActive) this.$parent.isActive = false - - // Fix for #1818 - // Wait for data to persist - // then set selectingHour - this.$nextTick(() => (this.selectingHour = true)) }, - cancel () { - this.inputTime = this.originalTime - if (this.$parent && this.$parent.isActive) this.$parent.isActive = false - - // Fix for #1818 - // Wait for data to persist - // then set selectingHour - this.$nextTick(() => (this.selectingHour = true)) + setPeriod (period) { + this.period = period + if (this.inputHour != null) { + const newHour = this.inputHour + (period === 'am' ? -12 : 12) + this.inputHour = this.firstAllowed('hour', newHour) + this.emitValue() + } }, - isAllowed (type, value) { - const allowed = this[`allowed${type.charAt(0).toUpperCase() + type.slice(1)}s`] - const val = type === 'hour' && - !this.is24hr && - this.period === 'pm' - ? value + 12 - : value - - if (!allowed) return true - - if (Array.isArray(allowed)) { - return !!allowed.some(v => v === value) - } else if (allowed instanceof Function) { - return allowed(val) - } else if (allowed === Object(allowed)) { - const range = type === 'minute' ? this.ranges.minutes : this.ranges.hours - const mod = type === 'minute' ? 60 : 24 - - if (allowed.min === String(allowed.min)) { - allowed.min = this.convert12to24hr(allowed.min) - } - - if (allowed.max === String(allowed.max)) { - allowed.max = this.convert12to24hr(allowed.max) - } - - const steps = allowed.max - allowed.min - value = type === 'hour' && !this.is24hr && this.period === 'pm' ? value + 12 : value + setInputData (value) { + if (value == null) { + this.inputHour = null + this.inputMinute = null + return + } - for (let i = 0; i <= steps; i++) { - const index = (allowed.min + i) % mod - if (range[index] === value) return true - } + if (value instanceof Date) { + this.inputHour = value.getHours() + this.inputMinute = value.getMinutes() + } else { + const [, hour, minute, , period] = value.trim().toLowerCase().match(/^(\d+):(\d+)(:\d+)?([ap]m)?$/, '') || [] - return false + this.inputHour = period ? this.convert12to24(parseInt(hour, 10), period) : parseInt(hour, 10) + this.inputMinute = parseInt(minute, 10) } - return true + this.period = this.inputHour < 12 ? 'am' : 'pm' }, - convert12to24hr (input) { - input = input.toLowerCase() - const pm = input.indexOf('pm') !== -1 - const hour = parseInt(input.slice(0, input.indexOf(pm ? 'pm' : 'am'))) - - return pm ? hour + 12 : hour + convert24to12 (hour) { + return hour ? ((hour - 1) % 12 + 1) : 12 }, - generateRange (type, start) { - let range = type === 'hour' ? this.ranges.hours : this.ranges.minutes - let offset = 1 - - if (type === 'hour' && !this.is24hr) { - range = range.slice(1, 13) - offset = 0 + convert12to24 (hour, period) { + return hour % 12 + (period === 'pm' ? 12 : 0) + }, + onInput (value) { + if (this.selectingHour) { + this.inputHour = this.isAmPm ? this.convert12to24(value, this.period) : value + } else { + this.inputMinute = value + } + this.emitValue() + }, + onChange () { + if (!this.selectingHour) { + this.$emit('change', this.value) } - return range.slice(start + offset, range.length) - .concat(range.slice(0, start + offset)) + this.selectingHour = !this.selectingHour }, firstAllowed (type, value) { - const allowed = this[`allowed${type.charAt(0).toUpperCase() + type.slice(1)}s`] - - if (!allowed) return value - - const range = this.generateRange(type, value) - - const first = range.find(v => this.isAllowed(type, v)) - - return first || value + const allowedFn = type === 'hour' ? this.isAllowedHourCb : this.isAllowedMinuteCb + if (!allowedFn) return value + + // TODO: clean up + const range = type === 'minute' + ? rangeMinutes + : (this.isAmPm + ? (value < 12 + ? rangeHours12am + : rangeHours12pm) + : rangeHours24) + const first = range.find(v => allowedFn((v + value) % range.length + range[0])) + return ((first || 0) + value) % range.length + range[0] + }, + genClock () { + return this.$createElement('v-time-picker-clock', { + props: { + allowedValues: this.selectingHour ? this.isAllowedHourCb : this.isAllowedMinuteCb, + color: this.color, + dark: this.dark, + double: this.selectingHour && !this.isAmPm, + format: this.selectingHour ? (this.isAmPm ? this.convert24to12 : val => val) : val => pad(val, 2), + max: this.selectingHour ? (this.isAmPm && this.period === 'am' ? 11 : 23) : 59, + min: this.selectingHour && this.isAmPm && this.period === 'pm' ? 12 : 0, + scrollable: this.scrollable, + size: this.width - ((!this.fullWidth && this.landscape) ? 80 : 20), + step: this.selectingHour ? 1 : 5, + value: this.selectingHour ? this.inputHour : this.inputMinute + }, + on: { + input: this.onInput, + change: this.onChange + }, + ref: 'clock' + }) + }, + genPickerBody () { + return this.$createElement('div', { + staticClass: 'time-picker-clock__container', + style: { + width: `${this.width}px`, + height: `${this.width - ((!this.fullWidth && this.landscape) ? 60 : 0)}px` + }, + key: this.selectingHour + }, [this.genClock()]) + }, + genPickerTitle () { + return this.$createElement('v-time-picker-title', { + props: { + ampm: this.isAmPm, + hour: this.inputHour, + minute: this.inputMinute, + period: this.period, + selectingHour: this.selectingHour + }, + on: { + 'update:selectingHour': value => (this.selectingHour = value), + 'update:period': this.setPeriod + }, + ref: 'title', + slot: 'title' + }) } }, - render (h) { - const children = [this.genBody()] - - !this.noTitle && children.unshift(this.genTitle()) - this.$scopedSlots.default && children.push(this.genSlot()) + mounted () { + this.setInputData(this.value) + }, - return h('v-card', { - 'class': { - 'picker picker--time': true, - 'picker--landscape': this.landscape, - 'picker--time--hours': this.selectingHour, - ...this.themeClasses - } - }, children) + render (h) { + return this.genPicker('picker--time') } } diff --git a/src/components/VTimePicker/VTimePicker.spec.js b/src/components/VTimePicker/VTimePicker.spec.js index c1ffa56980fe..44229de0354b 100644 --- a/src/components/VTimePicker/VTimePicker.spec.js +++ b/src/components/VTimePicker/VTimePicker.spec.js @@ -1,54 +1,73 @@ -import VTimePicker from '~components/VTimePicker' -import { test } from '~util/testing' +import Vue from 'vue' +import { test } from '@util/testing' +import VTimePicker from '@components/VTimePicker' +import VMenu from '@components/VMenu' test('VTimePicker.js', ({ mount }) => { - it('should accept a value', () => { + it('should accept a value', async () => { const wrapper = mount(VTimePicker, { propsData: { - value: '09:00:00' + value: '09:12:34' } }) - expect(wrapper.vm.inputTime).toBe('09:00:00') + await wrapper.vm.$nextTick() + expect(wrapper.vm.selectingHour).toBe(true) + expect(wrapper.vm.inputHour).toBe(9) + expect(wrapper.vm.inputMinute).toBe(12) expect(wrapper.html()).toMatchSnapshot() }) - it('should accept a date object for a value', () => { - const now = new Date('2017-01-01 12:00 AM') - const wrapper = mount(VTimePicker, { + it('should render landscape component', async () => { + var wrapper = mount(VTimePicker, { propsData: { - value: now + value: '09:12:34', + landscape: true } }) - expect(wrapper.vm.inputTime).toEqual('12:00am') + await wrapper.vm.$nextTick() expect(wrapper.html()).toMatchSnapshot() }) - it('should change am/pm when updated from model', () => { + it('should render component without a title', () => { const wrapper = mount(VTimePicker, { propsData: { - value: '9:00am' + value: '09:12:34', + noTitle: true } }) - wrapper.setProps({ value: '9:00pm' }) + expect(wrapper.find('.picker__title')).toHaveLength(0) + }) - expect(wrapper.data().period).toBe('pm') + it('should accept a date object for a value', async () => { + const now = new Date('2017-01-01 12:00 AM') + const wrapper = mount(VTimePicker, { + propsData: { + value: now + } + }) + + await wrapper.vm.$nextTick() + expect(wrapper.vm.inputHour).toBe(0) + expect(wrapper.vm.inputMinute).toBe(0) + expect(wrapper.vm.period).toBe('am') expect(wrapper.html()).toMatchSnapshot() }) - it('should not change period with 24hr prop', () => { + it('should change am/pm when updated from model', async () => { const wrapper = mount(VTimePicker, { propsData: { - format: '24hr', - value: null + value: '9:00am' } }) - const ampm = wrapper.instance().inputTime.match(/(am|pm)/) + await wrapper.vm.$nextTick() + wrapper.setProps({ value: '9:00pm' }) - expect(ampm).toBe(null) + expect(wrapper.vm.period).toBe('pm') + expect(wrapper.html()).toMatchSnapshot() }) it('should set picker to pm when given Date after noon', () => { @@ -58,7 +77,7 @@ test('VTimePicker.js', ({ mount }) => { } }) - expect(wrapper.data().period).toEqual('pm') + expect(wrapper.vm.period).toBe('pm') }) it('should set picker to pm when given string with PM in it', () => { @@ -68,7 +87,7 @@ test('VTimePicker.js', ({ mount }) => { } }) - expect(wrapper.data().period).toEqual('pm') + expect(wrapper.vm.period).toBe('pm') }) it('should set picker to pm when given string with pm in it', () => { @@ -78,7 +97,7 @@ test('VTimePicker.js', ({ mount }) => { } }) - expect(wrapper.data().period).toEqual('pm') + expect(wrapper.vm.period).toBe('pm') }) it('should set picker to am when given Date before noon', () => { @@ -88,95 +107,213 @@ test('VTimePicker.js', ({ mount }) => { } }) - expect(wrapper.data().period).toEqual('am') + expect(wrapper.vm.period).toBe('am') }) - it('should return proper value for isAllowed method (max)', () => { + it('should render colored time picker', async () => { const wrapper = mount(VTimePicker, { propsData: { - allowedMinutes: [50, 55, 0, 5, 10], - value: null + value: '09:00:00', + color: 'primary', + headerColor: 'orange darken-1' } }) - expect([0, 5, 10, 15, 20, 45, 50, 55].map(minute => wrapper.vm.isAllowed('minute', minute))) - .toEqual([true, true, true, false, false, false, true, true]) + await wrapper.vm.$nextTick() + expect(wrapper.html()).toMatchSnapshot() }) - it('should return proper value for isAllowed method (min/max)', () => { + it('should render colored time picker', async () => { const wrapper = mount(VTimePicker, { propsData: { - allowedMinutes: { min: 33, max: 55 }, - value: null + value: '09:00:00', + color: 'orange darken-1' } }) - expect([0, 20, 30, 35, 45, 50, 55].map(minute => wrapper.vm.isAllowed('minute', minute))) - .toEqual([false, false, false, true, true, true, true]) + await wrapper.vm.$nextTick() + expect(wrapper.html()).toMatchSnapshot() }) - it('should return proper value for isAllowed method (function)', () => { + it('should set input hour when setting hour in 12hr mode', () => { const wrapper = mount(VTimePicker, { propsData: { - allowedMinutes: minute => [55, 0, 5].includes(minute), - value: null + value: '01:23pm', + format: 'ampm' } }) - expect([0, 5, 45, 50, 55].map(minute => wrapper.vm.isAllowed('minute', minute))) - .toEqual([true, true, false, false, true]) + const clock = wrapper.vm.$refs.clock + + clock.$emit('input', 7) + expect(wrapper.vm.inputHour).toBe(19) + + wrapper.setProps({ format: '24hr' }) + clock.$emit('input', 8) + expect(wrapper.vm.inputHour).toBe(8) + + wrapper.vm.selectingHour = false + clock.$emit('input', 33) + expect(wrapper.vm.inputHour).toBe(8) + expect(wrapper.vm.inputMinute).toBe(33) }) - it('should return proper value for isAllowed when evaluating the current period (function)', () => { + it('should set properly input time', () => { const wrapper = mount(VTimePicker, { propsData: { - allowedHours: hour => hour > 13, - format: '24hr', - value: null + format: '24hr' } }) - expect([8, 9, 10, 14, 17].map(hour => wrapper.vm.isAllowed('hour', hour))) - .toEqual([false, false, false, true, true]) + wrapper.vm.setInputData(new Date('2001-01-01 17:35')) + expect(wrapper.vm.inputHour).toBe(17) + expect(wrapper.vm.inputMinute).toBe(35) + + wrapper.vm.setInputData(null) + expect(wrapper.vm.inputHour).toBe(null) + expect(wrapper.vm.inputMinute).toBe(null) + + wrapper.vm.setInputData('12:34am') + expect(wrapper.vm.inputHour).toBe(0) + expect(wrapper.vm.inputMinute).toBe(34) + + wrapper.vm.setInputData('7:34am') + expect(wrapper.vm.inputHour).toBe(7) + + wrapper.vm.setInputData('12:34pm') + expect(wrapper.vm.inputHour).toBe(12) + + wrapper.vm.setInputData('7:34pm') + expect(wrapper.vm.inputHour).toBe(19) }) - it('should reset selectingHour when saved/canceled', async () => { + it('should update hour when changing period', async () => { const wrapper = mount(VTimePicker, { propsData: { - value: null + value: '15:34' } }) - wrapper.vm.selectingHour = false - wrapper.vm.save() + wrapper.vm.setPeriod('am') await wrapper.vm.$nextTick() - expect(wrapper.vm.selectingHour).toBe(true) - wrapper.vm.selectingHour = false - wrapper.vm.cancel() + expect(wrapper.vm.inputHour).toBe(3) + wrapper.vm.setPeriod('pm') await wrapper.vm.$nextTick() + expect(wrapper.vm.inputHour).toBe(15) + }) + + it('should change selectingHour when hour/minute is selected', () => { + const wrapper = mount(VTimePicker, { + propsData: { + value: '01:23pm', + format: 'ampm' + } + }) + + const clock = wrapper.vm.$refs.clock + + clock.$emit('change') + expect(wrapper.vm.selectingHour).toBe(false) + clock.$emit('change') expect(wrapper.vm.selectingHour).toBe(true) }) - it('should render colored time picker', () => { + it('should change selectingHour when clicked in title', () => { const wrapper = mount(VTimePicker, { propsData: { - value: '09:00:00', - color: 'primary', - headerColor: 'orange darken-1' + value: '01:23pm', + format: 'ampm' } }) - expect(wrapper.html()).toMatchSnapshot() + const title = wrapper.vm.$refs.title + + expect(wrapper.vm.selectingHour).toBe(true) + title.$emit('update:selectingHour', false) + expect(wrapper.vm.selectingHour).toBe(false) + title.$emit('update:selectingHour', true) + expect(wrapper.vm.selectingHour).toBe(true) }) - it('should render colored time picker', () => { + it('should change period when clicked in title', () => { const wrapper = mount(VTimePicker, { propsData: { - value: '09:00:00', - color: 'orange darken-1' + value: '01:23pm', + format: 'ampm' } }) - expect(wrapper.html()).toMatchSnapshot() + const title = wrapper.vm.$refs.title + + expect(wrapper.vm.period).toBe('pm') + title.$emit('update:period', 'am') + expect(wrapper.vm.period).toBe('am') + title.$emit('update:period', 'pm') + expect(wrapper.vm.period).toBe('pm') + }) + + it('should match snapshot with slot', async () => { + const vm = new Vue() + const slot = props => vm.$createElement('div', { class: 'scoped-slot' }) + const component = Vue.component('test', { + components: { + VTimePicker + }, + render (h) { + return h('v-time-picker', { + props: { + value: '10:12' + }, + scopedSlots: { + default: slot + } + }) + } + }) + + const wrapper = mount(component) + expect(wrapper.find('.picker__actions .scoped-slot')).toHaveLength(1) + }) + + it('should calculate allowed minute/hour callback', async () => { + const wrapper = mount(VTimePicker, { + propsData: { + value: '10:00', + allowedMinutes: value => value % 5 === 0, + allowedHours: value => value !== 11, + min: '9:31', + max: '12:30' + } + }) + + expect(wrapper.vm.isAllowedHourCb(8)).toBe(false) + expect(wrapper.vm.isAllowedHourCb(9)).toBe(true) + expect(wrapper.vm.isAllowedHourCb(10)).toBe(true) + expect(wrapper.vm.isAllowedHourCb(11)).toBe(false) + expect(wrapper.vm.isAllowedHourCb(12)).toBe(true) + expect(wrapper.vm.isAllowedHourCb(13)).toBe(false) + + wrapper.vm.inputHour = 8 + expect(wrapper.vm.isAllowedMinuteCb(30)).toBe(false) + + wrapper.vm.inputHour = 9 + expect(wrapper.vm.isAllowedMinuteCb(30)).toBe(false) + expect(wrapper.vm.isAllowedMinuteCb(31)).toBe(false) + expect(wrapper.vm.isAllowedMinuteCb(35)).toBe(true) + + wrapper.vm.inputHour = 10 + expect(wrapper.vm.isAllowedMinuteCb(30)).toBe(true) + expect(wrapper.vm.isAllowedMinuteCb(31)).toBe(false) + expect(wrapper.vm.isAllowedMinuteCb(35)).toBe(true) + + wrapper.vm.inputHour = 11 + expect(wrapper.vm.isAllowedMinuteCb(30)).toBe(false) + expect(wrapper.vm.isAllowedMinuteCb(31)).toBe(false) + expect(wrapper.vm.isAllowedMinuteCb(35)).toBe(false) + + wrapper.vm.inputHour = 12 + expect(wrapper.vm.isAllowedMinuteCb(30)).toBe(true) + expect(wrapper.vm.isAllowedMinuteCb(31)).toBe(false) + expect(wrapper.vm.isAllowedMinuteCb(35)).toBe(false) }) }) diff --git a/src/components/VTimePicker/VTimePickerClock.js b/src/components/VTimePicker/VTimePickerClock.js new file mode 100644 index 000000000000..088d48af34a6 --- /dev/null +++ b/src/components/VTimePicker/VTimePickerClock.js @@ -0,0 +1,218 @@ +import '../../stylus/components/_time-picker-clock.styl' + +// Mixins +import Colorable from '../../mixins/colorable' +import Themeable from '../../mixins/themeable' + +export default { + name: 'v-time-picker-clock', + + mixins: [ + Colorable, + Themeable + ], + + data () { + return { + defaultColor: 'accent', + inputValue: this.value, + isDragging: false + } + }, + + props: { + allowedValues: Function, + double: Boolean, + format: { + type: Function, + default: val => val + }, + max: { + type: Number, + required: true + }, + min: { + type: Number, + required: true + }, + scrollable: Boolean, + rotate: { + type: Number, + default: 0 + }, + size: { + type: [Number, String], + default: 270 + }, + step: { + type: Number, + default: 1 + }, + value: Number + }, + + computed: { + count () { + return this.max - this.min + 1 + }, + innerRadius () { + return this.radius - Math.max(this.radius * 0.4, 48) + }, + outerRadius () { + return this.radius - 4 + }, + roundCount () { + return this.double ? (this.count / 2) : this.count + }, + degreesPerUnit () { + return 360 / this.roundCount + }, + degrees () { + return this.degreesPerUnit * Math.PI / 180 + }, + radius () { + return this.size / 2 + }, + displayedValue () { + return this.value == null ? this.min : this.value + } + }, + + watch: { + value (value) { + this.inputValue = value + } + }, + + methods: { + wheel (e) { + e.preventDefault() + const value = this.displayedValue + Math.sign(e.wheelDelta || 1) + this.update((value - this.min + this.count) % this.count + this.min) + }, + handScale (value) { + return this.double && (value - this.min >= this.roundCount) ? (this.innerRadius / this.radius) : (this.outerRadius / this.radius) + }, + isAllowed (value) { + return !this.allowedValues || this.allowedValues(value) + }, + genValues () { + const children = [] + + for (let value = this.min; value <= this.max; value = value + this.step) { + const classes = { + active: value === this.displayedValue, + disabled: !this.isAllowed(value) + } + + children.push(this.$createElement('span', { + 'class': this.addBackgroundColorClassChecks(classes, value === this.value ? this.computedColor : null), + style: this.getTransform(value), + domProps: { innerHTML: `${this.format(value)}` } + })) + } + + return children + }, + genHand () { + const scale = `scaleY(${this.handScale(this.displayedValue)})` + const angle = this.rotate + this.degreesPerUnit * (this.displayedValue - this.min) + + return this.$createElement('div', { + staticClass: 'time-picker-clock__hand', + 'class': this.value == null ? {} : this.addBackgroundColorClassChecks(), + style: { + transform: `rotate(${angle}deg) ${scale}` + } + }) + }, + getTransform (i) { + const { x, y } = this.getPosition(i) + return { transform: `translate(${x}px, ${y}px)` } + }, + getPosition (value) { + const radius = (this.radius - 24) * this.handScale(value) + const rotateRadians = this.rotate * Math.PI / 180 + return { + x: Math.round(Math.sin((value - this.min) * this.degrees + rotateRadians) * radius), + y: Math.round(-Math.cos((value - this.min) * this.degrees + rotateRadians) * radius) + } + }, + onMouseDown (e) { + e.preventDefault() + + this.isDragging = true + this.onDragMove(e) + }, + onMouseUp () { + this.isDragging = false + this.isAllowed(this.inputValue) && this.$emit('change', this.inputValue) + }, + onDragMove (e) { + e.preventDefault() + if (!this.isDragging && e.type !== 'click') return + + const { width, top, left } = this.$refs.clock.getBoundingClientRect() + const { clientX, clientY } = 'touches' in e ? e.touches[0] : e + const center = { x: width / 2, y: -width / 2 } + const coords = { x: clientX - left, y: top - clientY } + const handAngle = Math.round(this.angle(center, coords) - this.rotate + 360) % 360 + const insideClick = this.double && this.euclidean(center, coords) < (this.outerRadius + this.innerRadius) / 2 - 16 + const value = Math.round(handAngle / this.degreesPerUnit) + + this.min + (insideClick ? this.roundCount : 0) + + // Necessary to fix edge case when selecting left part of max value + if (handAngle >= (360 - this.degreesPerUnit / 2)) { + this.update(insideClick ? this.max : this.min) + } else { + this.update(value) + } + }, + update (value) { + if (this.inputValue !== value && this.isAllowed(value)) { + this.inputValue = value + this.$emit('input', value) + } + }, + euclidean (p0, p1) { + const dx = p1.x - p0.x + const dy = p1.y - p0.y + + return Math.sqrt(dx * dx + dy * dy) + }, + angle (center, p1) { + const value = 2 * Math.atan2(p1.y - center.y - this.euclidean(center, p1), p1.x - center.x) + return Math.abs(value * 180 / Math.PI) + } + }, + + render (h) { + const data = { + staticClass: 'time-picker-clock', + class: { + 'time-picker-clock--indeterminate': this.value == null + }, + on: { + mousedown: this.onMouseDown, + mouseup: this.onMouseUp, + mouseleave: () => (this.isDragging && this.onMouseUp()), + touchstart: this.onMouseDown, + touchend: this.onMouseUp, + mousemove: this.onDragMove, + touchmove: this.onDragMove + }, + style: { + height: `${this.size}px`, + width: `${this.size}px` + }, + ref: 'clock' + } + + this.scrollable && (data.on.wheel = this.wheel) + + return this.$createElement('div', data, [ + this.genHand(), + this.genValues() + ]) + } +} diff --git a/src/components/VTimePicker/VTimePickerClock.spec.js b/src/components/VTimePicker/VTimePickerClock.spec.js new file mode 100644 index 000000000000..37d0bce169e2 --- /dev/null +++ b/src/components/VTimePicker/VTimePickerClock.spec.js @@ -0,0 +1,167 @@ +import VTimePickerClock from './VTimePickerClock' +import { test, touch } from '@util/testing' + +test('VTimePickerClock.js', ({ mount }) => { + it('should render component', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + allowedValues: n => n % 2, + max: 59, + min: 0, + size: 280, + step: 5, + value: 10 + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should render component with double prop', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + allowedValues: n => n % 2, + double: true, + max: 59, + min: 0, + size: 280, + step: 5, + value: 10 + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should emit input event on wheel if scrollable', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + max: 59, + min: 3, + value: 59, + scrollable: true + } + }) + + const input = jest.fn() + wrapper.vm.$on('input', input) + wrapper.trigger('wheel') + expect(input).toBeCalledWith(3) + }) + + it('should not emit input event on wheel if not scrollable', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + max: 59, + min: 3, + value: 59, + scrollable: false + } + }) + + const input = jest.fn() + wrapper.vm.$on('input', input) + wrapper.trigger('wheel') + expect(input).not.toBeCalled() + }) + + it('should emit change event on mouseup/touchend', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + value: 59, + min: 0, + max: 60 + } + }) + + const change = jest.fn() + wrapper.vm.$on('change', change) + + wrapper.trigger('mouseup') + expect(change).toBeCalledWith(59) + + wrapper.setProps({ value: 55 }) + wrapper.trigger('touchend') + expect(change).toBeCalledWith(55) + }) + + it('should emit change event on mouseleave', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + value: 59, + min: 0, + max: 60 + } + }) + + const change = jest.fn() + wrapper.vm.$on('change', change) + + wrapper.trigger('mouseleave') + expect(change).not.toBeCalled() + + wrapper.vm.isDragging = true + wrapper.trigger('mouseleave') + expect(change).toBeCalledWith(59) + }) + + it('should calculate angle', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + value: 59, + min: 0, + max: 60 + } + }) + + const center = { x: 1, y: 1 } + const angle = p => Math.round(wrapper.vm.angle(center, p)) + expect(angle({ x: 2, y: 1 })).toBe(90) + expect(angle({ x: 2, y: 2 })).toBe(45) + expect(angle({ x: 0, y: 2 })).toBe(315) + expect(angle({ x: 0, y: 0 })).toBe(225) + expect(angle({ x: 2, y: 0 })).toBe(135) + }) + + it('should change with touch move', () => { + const wrapper = mount(VTimePickerClock, { + propsData: { + min: 0, + max: 7, + value: 0, + size: 300, + double: true + } + }) + + wrapper.vm.$refs.clock.getBoundingClientRect = () => { + return { + width: 300, + height: 300, + top: 0, + left: 0, + right: 300, + bottom: 300, + x: 0, + y: 0 + } + } + + const input = jest.fn() + const finger = touch(wrapper).start(0, 0) + wrapper.vm.$on('input', input) + + finger.move(300, 150) + expect(input).toBeCalledWith(1) + finger.move(150, 300) + expect(input).toBeCalledWith(2) + finger.move(150, 200) + expect(input).toBeCalledWith(6) + + // edge case + finger.move(120, 0) + expect(input).toBeCalledWith(0) + finger.move(135, 90) + expect(input).toBeCalledWith(7) + }) +}) diff --git a/src/components/VTimePicker/VTimePickerTitle.js b/src/components/VTimePicker/VTimePickerTitle.js new file mode 100644 index 000000000000..d5c93731ee13 --- /dev/null +++ b/src/components/VTimePicker/VTimePickerTitle.js @@ -0,0 +1,61 @@ +import '../../stylus/components/_time-picker-title.styl' + +// Mixins +import PickerButton from '../../mixins/picker-button' + +// Utils +import { pad } from '../VDatePicker/util' + +export default { + name: 'v-time-picker-title', + + mixins: [PickerButton], + + props: { + ampm: Boolean, + hour: Number, + minute: Number, + period: { + type: String, + validator: period => period === 'am' || period === 'pm' + }, + selectingHour: Boolean + }, + + methods: { + genTime () { + let hour = this.hour + if (this.ampm) { + hour = hour ? ((hour - 1) % 12 + 1) : 12 + } + + const displayedHour = this.hour == null ? '--' : this.ampm ? hour : pad(hour) + const displayedMinute = this.minute == null ? '--' : pad(this.minute) + + return this.$createElement('div', { + 'class': 'time-picker-title__time' + }, [ + this.genPickerButton('selectingHour', true, displayedHour), + this.$createElement('span', ':'), + this.genPickerButton('selectingHour', false, displayedMinute) + ]) + }, + genAmPm () { + return this.$createElement('div', { + staticClass: 'time-picker-title__ampm' + }, [ + this.genPickerButton('period', 'am', 'am'), + this.genPickerButton('period', 'pm', 'pm') + ]) + } + }, + + render (h) { + return h('div', { + staticClass: 'time-picker-title' + }, [ + this.genTime(), + this.ampm ? this.genAmPm() : null + ]) + } +} diff --git a/src/components/VTimePicker/VTimePickerTitle.spec.js b/src/components/VTimePicker/VTimePickerTitle.spec.js new file mode 100644 index 000000000000..4b2506fa4c3f --- /dev/null +++ b/src/components/VTimePicker/VTimePickerTitle.spec.js @@ -0,0 +1,92 @@ +import VTimePickerTitle from './VTimePickerTitle' +import { test } from '@util/testing' + +test('VTimePickerTitle.js', ({ mount }) => { + it('should render component in 24hr', () => { + const wrapper = mount(VTimePickerTitle, { + propsData: { + hour: 14, + minute: 13, + period: 'pm', + ampm: false + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should render component in 12hr', () => { + const wrapper = mount(VTimePickerTitle, { + propsData: { + hour: 14, + minute: 13, + period: 'pm', + ampm: true + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should render component when selecting hour', () => { + const wrapper = mount(VTimePickerTitle, { + propsData: { + hour: 14, + minute: 13, + period: 'pm', + selectingHour: true + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should emit event when clicked on am/pm', async () => { + const wrapper = mount(VTimePickerTitle, { + propsData: { + hour: 14, + minute: 13, + period: 'pm', + ampm: true + } + }) + + const period = jest.fn() + wrapper.vm.$on('update:period', period) + + wrapper.find('.time-picker-title__ampm .picker__title__btn.active')[0].trigger('click') + expect(period).not.toBeCalled() + wrapper.find('.time-picker-title__ampm .picker__title__btn:not(.active)')[0].trigger('click') + expect(period).toBeCalledWith('am') + + wrapper.setProps({ + hour: 2, + minute: 13, + period: 'am' + }) + wrapper.find('.time-picker-title__ampm .picker__title__btn:not(.active)')[0].trigger('click') + expect(period).toBeCalledWith('pm') + }) + + it('should emit event when clicked on hours/minutes', async () => { + const wrapper = mount(VTimePickerTitle, { + propsData: { + hour: 14, + minute: 13, + period: 'pm' + } + }) + + const selectingHour = jest.fn() + wrapper.vm.$on('update:selectingHour', selectingHour) + + wrapper.find('.time-picker-title__time .picker__title__btn')[1].trigger('click') + expect(selectingHour).not.toBeCalled() + wrapper.find('.time-picker-title__time .picker__title__btn')[0].trigger('click') + expect(selectingHour).toBeCalledWith(true) + wrapper.setProps({ selectingHour: true }) + await wrapper.vm.$nextTick() + wrapper.find('.time-picker-title__time .picker__title__btn')[1].trigger('click') + expect(selectingHour).toBeCalledWith(false) + }) +}) diff --git a/src/components/VTimePicker/__snapshots__/VTimePicker.spec.js.snap b/src/components/VTimePicker/__snapshots__/VTimePicker.spec.js.snap index 218070136291..e836d4010e7b 100644 --- a/src/components/VTimePicker/__snapshots__/VTimePicker.spec.js.snap +++ b/src/components/VTimePicker/__snapshots__/VTimePicker.spec.js.snap @@ -2,92 +2,104 @@ exports[`VTimePicker.js should accept a date object for a value 1`] = ` -
-
- - 12 - - - :00 - -
-
- - AM - - - PM - -
-
-
-
-
-
- - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - +
+
+
+ 12 +
- 11 + : - - - - 12 +
+ 00 +
+
+
+
+ am +
+
+ pm +
+
+
+
+
+
+
+
+
+ + + 12 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + - +
@@ -96,92 +108,104 @@ exports[`VTimePicker.js should accept a date object for a value 1`] = ` exports[`VTimePicker.js should accept a value 1`] = ` -
-
- - 9 - - - :00 - -
-
- - AM - - - PM - -
-
-
-
-
-
- - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - +
+
+
9 - - - +
- 10 + : - - - - 11 - - - - +
12 +
+
+
+
+ am +
+
+ pm +
+
+
+
+
+
+
+
+
+ + + 12 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + - +
@@ -190,92 +214,104 @@ exports[`VTimePicker.js should accept a value 1`] = ` exports[`VTimePicker.js should change am/pm when updated from model 1`] = ` -
-
- - 9 - - - :00 - -
-
- - AM - - - PM - -
-
-
-
-
-
- - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - +
+
+
9 - - - - - 10 - - - +
- 11 + : - - - - 12 +
+ 00 +
+
+
+
+ am +
+
+ pm +
+
+
+
+
+
+
+
+
+ + + 12 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + - +
@@ -284,92 +320,104 @@ exports[`VTimePicker.js should change am/pm when updated from model 1`] = ` exports[`VTimePicker.js should render colored time picker 1`] = ` -
-
- - 9 - - - :00 - -
-
- - AM - - - PM - -
-
-
-
-
-
- - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - +
+
+
9 - - - +
- 10 + : - - - - 11 - - - - - 12 +
+ 00 +
+
+
+
+ am +
+
+ pm +
+
+
+
+
+
+
+
+
+ + + 12 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + - +
@@ -378,92 +426,210 @@ exports[`VTimePicker.js should render colored time picker 1`] = ` exports[`VTimePicker.js should render colored time picker 2`] = ` -
-
- - 9 - - - :00 - -
-
- - AM - - - PM - -
-
-
-
-
-
- - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - +
+
+
+ 9 +
- 7 + : - - - - 8 +
+ 00 +
+
+
+
+ am +
+
+ pm +
+
+
+
+
+
+
+
+
+ + + 12 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + - - - +
+
+
+
+ +`; + +exports[`VTimePicker.js should render landscape component 1`] = ` + +
+
+
+
+
9 - - - +
- 10 + : - - - - 11 - - - - +
12 +
+
+
+
+ am +
+
+ pm +
+
+
+
+
+
+
+
+
+ + + 12 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + - +
diff --git a/src/components/VTimePicker/__snapshots__/VTimePickerClock.spec.js.snap b/src/components/VTimePicker/__snapshots__/VTimePickerClock.spec.js.snap new file mode 100644 index 000000000000..7e47630dda06 --- /dev/null +++ b/src/components/VTimePicker/__snapshots__/VTimePickerClock.spec.js.snap @@ -0,0 +1,143 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VTimePickerClock.js should render component 1`] = ` + +
+
+
+ + + 0 + + + + + 5 + + + + + 10 + + + + + 15 + + + + + 20 + + + + + 25 + + + + + 30 + + + + + 35 + + + + + 40 + + + + + 45 + + + + + 50 + + + + + 55 + + +
+ +`; + +exports[`VTimePickerClock.js should render component with double prop 1`] = ` + +
+
+
+ + + 0 + + + + + 5 + + + + + 10 + + + + + 15 + + + + + 20 + + + + + 25 + + + + + 30 + + + + + 35 + + + + + 40 + + + + + 45 + + + + + 50 + + + + + 55 + + +
+ +`; diff --git a/src/components/VTimePicker/__snapshots__/VTimePickerTitle.spec.js.snap b/src/components/VTimePicker/__snapshots__/VTimePickerTitle.spec.js.snap new file mode 100644 index 000000000000..79c270a47d11 --- /dev/null +++ b/src/components/VTimePicker/__snapshots__/VTimePickerTitle.spec.js.snap @@ -0,0 +1,63 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VTimePickerTitle.js should render component in 12hr 1`] = ` + +
+
+
+ 2 +
+ + : + +
+ 13 +
+
+
+
+ am +
+
+ pm +
+
+
+ +`; + +exports[`VTimePickerTitle.js should render component in 24hr 1`] = ` + +
+
+
+ 14 +
+ + : + +
+ 13 +
+
+
+ +`; + +exports[`VTimePickerTitle.js should render component when selecting hour 1`] = ` + +
+
+
+ 14 +
+ + : + +
+ 13 +
+
+
+ +`; diff --git a/src/components/VTimePicker/index.js b/src/components/VTimePicker/index.js index 7d42af74ea13..5b6304c813ee 100644 --- a/src/components/VTimePicker/index.js +++ b/src/components/VTimePicker/index.js @@ -1,8 +1,18 @@ import VTimePicker from './VTimePicker' +import VTimePickerClock from './VTimePickerClock' +import VTimePickerTitle from './VTimePickerTitle' + +export { + VTimePicker, + VTimePickerClock, + VTimePickerTitle +} /* istanbul ignore next */ VTimePicker.install = function install (Vue) { Vue.component(VTimePicker.name, VTimePicker) + Vue.component(VTimePickerClock.name, VTimePickerClock) + Vue.component(VTimePickerTitle.name, VTimePickerTitle) } export default VTimePicker diff --git a/src/components/VTimePicker/mixins/time-body.js b/src/components/VTimePicker/mixins/time-body.js deleted file mode 100644 index f8735653d5d5..000000000000 --- a/src/components/VTimePicker/mixins/time-body.js +++ /dev/null @@ -1,213 +0,0 @@ -export default { - data () { - return { - hasChanged: false - } - }, - methods: { - genBody () { - const children = [this.genHand(this.selectingHour ? 'hour' : 'minute')] - const data = { - 'class': 'picker--time__clock', - on: { - mousedown: this.onMouseDown, - mouseup: this.onMouseUp, - mouseleave: () => { - this.isDragging && this.onMouseUp() - }, - touchstart: this.onMouseDown, - touchend: this.onMouseUp, - mousemove: this.onDragMove, - touchmove: this.onDragMove - }, - key: this.selectingHour ? 'hour' : 'minute', - ref: 'clock' - } - - this.selectingHour && - children.push(this.genHours()) || - children.push(this.genMinutes()) - - if (this.scrollable) { - data.on.wheel = e => { - e.preventDefault() - - const diff = e.wheelDelta > 0 ? 1 : -1 - const changing = this.selectingHour ? 'changeHour' : 'changeMinute' - - this[changing](diff) - } - } - - return this.$createElement('div', { - 'class': 'picker__body' - }, [ - this.$createElement('transition', { - props: { - name: 'fade-transition', - mode: 'out-in' - } - }, [ - this.$createElement('div', data, children) - ]) - ]) - }, - genHand (type) { - const scale = this.is24hrAfter12 ? 'scaleY(0.6)' : '' - return [this.$createElement('div', { - staticClass: 'picker--time__clock-hand', - 'class': this.addBackgroundColorClassChecks({ - [type]: true - }), - style: { - transform: `rotate(${this.clockHand}deg) ${scale}` - } - })] - }, - genHours () { - let hours = this.is24hr ? 24 : 12 - const children = [] - let start = 0 - - if (hours === 12) { - hours++ - start = 1 - } - - for (let i = start; i < hours; i++) { - const classes = { - 'active': i === this.hour, - 'disabled': !this.isAllowed('hour', i) - } - children.push(this.$createElement('span', { - 'class': this.addBackgroundColorClassChecks(classes, i === this.hour ? 'computedColor' : null), - style: this.getTransform(i), - domProps: { innerHTML: `${i}` } - })) - } - - return children - }, - genMinutes () { - const children = [] - - for (let i = 0; i < 60; i = i + 5) { - let num = i - - if (num < 10) num = `0${num}` - if (num === 60) num = '00' - - const classes = { - 'active': num.toString() === this.minute.toString(), - 'disabled': !this.isAllowed('minute', i) - } - children.push(this.$createElement('span', { - 'class': this.addBackgroundColorClassChecks(classes, num.toString() === this.minute.toString() ? 'computedColor' : null), - style: this.getTransform(i), - domProps: { innerHTML: `${num}` } - })) - } - - return children - }, - getTransform (i) { - const { x, y } = this.getPosition(i) - - return { transform: `translate(${x}px, ${y}px)` } - }, - getPosition (i) { - const radiusPercentage = this.selectingHour && - this.is24hr && - i >= 12 ? 0.5 : 0.8 - const r = this.radius * radiusPercentage - i = this.selectingHour && this.is24hr ? i % 12 : i - return { - x: Math.round(Math.sin(i * this.degrees) * r), - y: Math.round(-Math.cos(i * this.degrees) * r) - } - }, - changeHour (time) { - let range = this.generateRange('hour', this.hour) - - time < 0 && (range = range.reverse().slice(1)) - this.hour = range.find((h) => { - return this.allowedHours ? this.isAllowed('hour', h) : true - }) - - return true - }, - changeMinute (time) { - const current = Number(this.minute) - let range = this.generateRange('minute', current) - - time < 0 && (range = range.reverse().slice(1)) - const minute = range.find((m) => { - return this.allowedMinutes ? this.isAllowed('minute', m) : true - }) - - this.minute = minute < 10 ? `0${minute}` : minute - - return true - }, - onMouseDown (e) { - e.preventDefault() - - this.isDragging = true - this.onDragMove(e) - }, - onMouseUp () { - this.isDragging = false - !this.selectingHour && this.autosave && this.save() - if (this.hasChanged) { - this.selectingHour = false - this.hasChanged = false - } - }, - onDragMove (e) { - e.preventDefault() - if (!this.isDragging && e.type !== 'click') return - - const rect = this.$refs.clock.getBoundingClientRect() - const center = { x: rect.width / 2, y: 0 - rect.width / 2 } - const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY - const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX - const coords = { - y: rect.top - clientY, - x: clientX - rect.left - } - - const selecting = this.selectingHour ? 'hour' : 'minute' - let value = Math.round(this.angle(center, coords) / this.degreesPerUnit) - - if (this.selectingHour && this.is24hr) { - const insideClick = this.euclidean(center, coords) / this.radius < 0.65 - value = insideClick ? value + 12 : value - - // Necessary to fix edge case when selecting left part of 0 and 12 - value = this.angle(center, coords) >= 345 ? (value + 12) % 24 : value - } - - if (this.isAllowed(selecting, value)) { - this[selecting] = value - this.hasChanged = true - } - }, - euclidean (p0, p1) { - const dx = Math.abs(p1.x - p0.x) - const dy = Math.abs(p1.y - p0.y) - - return Math.sqrt(dx * dx + dy * dy) - }, - angle (center, p1) { - var p0 = { - x: center.x, - y: center.y + Math.sqrt( - Math.abs(p1.x - center.x) * Math.abs(p1.x - center.x) + - Math.abs(p1.y - center.y) * Math.abs(p1.y - center.y)) - } - - const value = 2 * Math.atan2(p1.y - p0.y, p1.x - p0.x) - return Math.abs(value * 180 / Math.PI) - } - } -} diff --git a/src/components/VTimePicker/mixins/time-title.js b/src/components/VTimePicker/mixins/time-title.js deleted file mode 100644 index 2964567cf39f..000000000000 --- a/src/components/VTimePicker/mixins/time-title.js +++ /dev/null @@ -1,49 +0,0 @@ -export default { - methods: { - genTitle () { - const children = [this.genTime()] - - if (this.format === 'ampm') { - children.push(this.genAMPM()) - } - - return this.genPickerTitle(children) - }, - genTime () { - let hour = this.hour - - if (this.is24hr && hour < 10) { - hour = `0${hour}` - } - - return this.$createElement('div', { - 'class': 'picker--time__title' - }, [ - this.$createElement('span', { - 'class': { active: this.selectingHour }, - on: { - click: () => (this.selectingHour = true) - } - }, hour), - this.$createElement('span', { - 'class': { active: !this.selectingHour }, - on: { - click: () => (this.selectingHour = false) - } - }, `:${this.minute}`) - ]) - }, - genAMPM () { - return this.$createElement('div', [ - this.genPeriod('am'), - this.genPeriod('pm') - ]) - }, - genPeriod (period) { - return this.$createElement('span', { - 'class': { active: this.period === period }, - on: { click: () => (this.period = period) } - }, period.toUpperCase()) - } - } -} diff --git a/src/components/VToolbar/VToolbar.js b/src/components/VToolbar/VToolbar.js index f2252df6b4fd..c6e5fbbd38dc 100644 --- a/src/components/VToolbar/VToolbar.js +++ b/src/components/VToolbar/VToolbar.js @@ -1,54 +1,81 @@ -require('../../stylus/components/_toolbar.styl') +// Styles +import '../../stylus/components/_toolbar.styl' +// Mixins import Applicationable from '../../mixins/applicationable' import Colorable from '../../mixins/colorable' import Themeable from '../../mixins/themeable' +import SSRBootable from '../../mixins/ssr-bootable' + +// Directives +import Scroll from '../../directives/scroll' export default { name: 'v-toolbar', - mixins: [Applicationable, Colorable, Themeable], + mixins: [ + Applicationable('top', [ + 'clippedLeft', + 'clippedRight', + 'computedHeight', + 'invertedScroll', + 'manualScroll' + ]), + Colorable, + SSRBootable, + Themeable + ], + + directives: { Scroll }, data: () => ({ + activeTimeout: null, + currentScroll: 0, heights: { mobileLandscape: 48, mobile: 56, desktop: 64, dense: 48 }, + isActive: true, isExtended: false, - isScrollingProxy: false, - marginTop: 0, + isScrollingUp: false, previousScroll: null, + previousScrollDirection: null, + savedScroll: 0, target: null }), props: { - absolute: Boolean, card: Boolean, clippedLeft: Boolean, clippedRight: Boolean, dense: Boolean, extended: Boolean, - fixed: Boolean, + extensionHeight: { + type: [Number, String], + validator: v => !isNaN(parseInt(v)) + }, flat: Boolean, floating: Boolean, - height: [Number, String], - manualScroll: { - type: Boolean, - default: null + height: { + type: [Number, String], + validator: v => !isNaN(parseInt(v)) }, + invertedScroll: Boolean, + manualScroll: Boolean, prominent: Boolean, scrollOffScreen: Boolean, scrollTarget: String, scrollThreshold: { type: Number, - default: 100 - } + default: 300 + }, + tabs: Boolean }, computed: { - computedHeight () { + computedContentHeight () { if (this.height) return parseInt(this.height) if (this.dense) return this.heights.dense @@ -62,126 +89,136 @@ export default { return this.heights.mobile }, + computedExtensionHeight () { + if (this.tabs) return 48 + if (this.extensionHeight) return parseInt(this.extensionHeight) + + return this.computedContentHeight + }, + computedHeight () { + if (!this.isExtended) return this.computedContentHeight + + return this.computedContentHeight + this.computedExtensionHeight + }, computedMarginTop () { - if (!this.app) return this.marginTop + if (!this.app) return 0 - return this.marginTop + this.$vuetify.application.bar + return this.$vuetify.application.bar }, classes () { return this.addBackgroundColorClassChecks({ 'toolbar': true, - 'elevation-0': this.flat, + 'elevation-0': this.flat || (!this.isActive && !this.tabs), 'toolbar--absolute': this.absolute, 'toolbar--card': this.card, 'toolbar--clipped': this.clippedLeft || this.clippedRight, 'toolbar--dense': this.dense, - 'toolbar--fixed': this.fixed, + 'toolbar--extended': this.isExtended, + 'toolbar--fixed': !this.absolute && (this.app || this.fixed), 'toolbar--floating': this.floating, 'toolbar--prominent': this.prominent, - 'toolbar--extended': this.isExtended, 'theme--dark': this.dark, 'theme--light': this.light }) }, - isScrolling: { - get () { - return this.manualScroll != null - ? this.manualScroll - : this.isScrollingProxy - }, - set (val) { - this.isScrollingProxy = val - } - }, - paddingLeft () { + computedPaddingLeft () { if (!this.app || this.clippedLeft) return 0 return this.$vuetify.application.left }, - paddingRight () { + computedPaddingRight () { if (!this.app || this.clippedRight) return 0 return this.$vuetify.application.right }, + computedTransform () { + return !this.isActive + ? -this.computedHeight + : 0 + }, + currentThreshold () { + return Math.abs(this.currentScroll - this.savedScroll) + }, styles () { - const style = { - marginTop: `${this.computedMarginTop}px` - } - - if (this.app) { - style.paddingRight = `${this.paddingRight}px` - style.paddingLeft = `${this.paddingLeft}px` + return { + marginTop: `${this.computedMarginTop}px`, + paddingRight: `${this.computedPaddingRight}px`, + paddingLeft: `${this.computedPaddingLeft}px`, + transform: `translateY(${this.computedTransform}px)` } - - return style } }, watch: { - clippedLeft (val) { - this.updateApplication() + currentThreshold (val) { + if (this.invertedScroll) { + return this.isActive = this.currentScroll > this.scrollThreshold + } + + if (val < this.scrollThreshold || + !this.isBooted + ) return + + this.isActive = this.isScrollingUp + this.savedScroll = this.currentScroll + }, + isActive () { + this.savedScroll = 0 }, - clippedRight (val) { - this.updateApplication() + invertedScroll (val) { + this.isActive = !val }, - isScrolling (val) { - this.whenScrolled(val) + manualScroll (val) { + this.isActive = !val + }, + isScrollingUp (val) { + this.savedScroll = this.savedScroll || this.currentScroll } }, - mounted () { - this.whenScrolled(this.isScrolling) + created () { + if (this.invertedScroll || + this.manualScroll + ) this.isActive = false }, - destroyed () { - if (this.app) this.$vuetify.application.top = 0 + mounted () { + if (this.scrollTarget) { + this.target = document.querySelector(this.scrollTarget) + } }, methods: { onScroll () { - if (typeof window === 'undefined') return + if (!this.scrollOffScreen || + this.manualScroll || + typeof window === 'undefined' + ) return - if (!this.target) { - this.target = this.scrollTarget - ? document.querySelector(this.scrollTarget) - : window - } - - const currentScroll = this.scrollTarget - ? this.target.scrollTop - : this.target.pageYOffset || document.documentElement.scrollTop + const target = this.target || window - if (currentScroll < this.scrollThreshold) return + this.currentScroll = this.scrollTarget + ? target.scrollTop + : target.pageYOffset || document.documentElement.scrollTop - if (this.previousScroll === null) { - this.previousScroll = currentScroll - } + this.isScrollingUp = this.currentScroll < this.previousScroll - this.isScrollingProxy = this.previousScroll < currentScroll - - this.previousScroll = currentScroll + this.previousScroll = this.currentScroll }, + /** + * Update the application layout + * + * @return {number} + */ updateApplication () { - if (!this.app) return - - this.$vuetify.application.top = !this.fixed && !this.absolute + return this.invertedScroll || this.manualScroll ? 0 - : this.isExtended && !this.isScrolling - ? this.computedHeight * 2 - : this.computedHeight - }, - whenScrolled (val) { - this.marginTop = val - ? -this.$refs.content.clientHeight - 6 - : 0 - - this.updateApplication() + : this.computedHeight } }, render (h) { this.isExtended = this.extended || !!this.$slots.extension - this.updateApplication() const children = [] const data = { @@ -190,26 +227,22 @@ export default { on: this.$listeners } - if (this.scrollOffScreen) { - data.directives = [{ - name: 'scroll', - value: { - callback: this.onScroll, - target: this.scrollTarget - } - }] - } + data.directives = [{ + arg: this.scrollTarget, + name: 'scroll', + value: this.onScroll + }] children.push(h('div', { staticClass: 'toolbar__content', - style: { height: `${this.computedHeight}px` }, + style: { height: `${this.computedContentHeight}px` }, ref: 'content' }, this.$slots.default)) if (this.isExtended) { children.push(h('div', { staticClass: 'toolbar__extension', - style: { height: `${this.computedHeight}px` } + style: { height: `${this.computedExtensionHeight}px` } }, this.$slots.extension)) } diff --git a/src/components/VToolbar/VToolbar.spec.js b/src/components/VToolbar/VToolbar.spec.js index 72e0da9b296f..9863cdaffbb9 100755 --- a/src/components/VToolbar/VToolbar.spec.js +++ b/src/components/VToolbar/VToolbar.spec.js @@ -1,8 +1,16 @@ -import { test } from '~util/testing' -import { mount } from 'avoriaz' -import VToolbar from '~components/VToolbar' +import Vue from 'vue' +import { test, resizeWindow } from '@util/testing' +import VApp from '@components/VApp' +import VToolbar from '@components/VToolbar' -test('VToolbar.vue', () => { +const scrollWindow = y => { + global.pageYOffset = y + global.dispatchEvent(new Event('scroll')) + + return new Promise(resolve => setTimeout(resolve, 200)) +} + +test('VToolbar.vue', ({ mount }) => { it('should render a colored toolbar', () => { const wrapper = mount(VToolbar, { propsData: { @@ -13,4 +21,173 @@ test('VToolbar.vue', () => { expect(wrapper.element.classList).toContain('blue') expect(wrapper.element.classList).toContain('lighten-1') }) + + it('should render an extended toolbar', () => { + const wrapper = mount(VToolbar, { + propsData: { + extended: true + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should render an extended toolbar with specific height', () => { + const wrapper = mount(VToolbar, { + propsData: { + extended: true, + extensionHeight: 42 + } + }) + + expect(wrapper.html()).toMatchSnapshot() + }) + + it('should calculate paddings ', () => { + const wrapper = mount(VToolbar) + + wrapper.vm.$vuetify.application.left = 42 + wrapper.vm.$vuetify.application.right = 84 + + wrapper.setProps({ app: false, clippedLeft: false, clippedRight: false }) + expect(wrapper.vm.computedPaddingLeft).toBe(0) + expect(wrapper.vm.computedPaddingRight).toBe(0) + wrapper.setProps({ app: false, clippedLeft: true, clippedRight: true }) + expect(wrapper.vm.computedPaddingLeft).toBe(0) + expect(wrapper.vm.computedPaddingRight).toBe(0) + wrapper.setProps({ app: true, clippedLeft: false, clippedRight: false }) + expect(wrapper.vm.computedPaddingLeft).toBe(42) + expect(wrapper.vm.computedPaddingRight).toBe(84) + wrapper.setProps({ app: true, clippedLeft: true, clippedRight: true }) + expect(wrapper.vm.computedPaddingLeft).toBe(0) + expect(wrapper.vm.computedPaddingRight).toBe(0) + }) + + it('should calculate application top', async () => { + const wrapper = mount(VToolbar, { + propsData: { + app: true, + fixed: true, + height: 21 + } + }) + + expect(wrapper.vm.$vuetify.application.top).toBe(21) + wrapper.setProps({ + height: 42 + }) + await wrapper.vm.$nextTick() + expect(wrapper.vm.$vuetify.application.top).toBe(42) + + wrapper.setProps({ + invertedScroll: true + }) + await wrapper.vm.$nextTick() + expect(wrapper.vm.$vuetify.application.top).toBe(0) + + wrapper.setProps({ + invertedScroll: false + }) + await wrapper.vm.$nextTick() + expect(wrapper.vm.$vuetify.application.top).toBe(42) + + wrapper.setProps({ + manualScroll: true + }) + await wrapper.vm.$nextTick() + expect(wrapper.vm.$vuetify.application.top).toBe(0) + }) + + it('should properly calculate content height', () => { + const wrapper = mount(VToolbar) + + wrapper.setProps({ + height: 999 + }) + expect(wrapper.vm.computedContentHeight).toBe(999) + + wrapper.setProps({ + height: null, + dense: true + }) + expect(wrapper.vm.computedContentHeight).toBe(wrapper.vm.heights.dense) + + wrapper.setProps({ + height: null, + dense: false, + prominent: true + }) + expect(wrapper.vm.computedContentHeight).toBe(wrapper.vm.heights.desktop) + + wrapper.setProps({ + height: null, + dense: false, + prominent: false + }) + Vue.set(wrapper.vm.$vuetify.breakpoint, 'width', 200) + Vue.set(wrapper.vm.$vuetify.breakpoint, 'height', 100) + expect(wrapper.vm.computedContentHeight).toBe(wrapper.vm.heights.mobileLandscape) + Vue.set(wrapper.vm.$vuetify.breakpoint, 'width', 100) + Vue.set(wrapper.vm.$vuetify.breakpoint, 'height', 200) + expect(wrapper.vm.computedContentHeight).toBe(wrapper.vm.heights.mobile) + }) + + it('should set margin top', () => { + const wrapper = mount(VToolbar, { + propsData: { + app: true + } + }) + + Vue.set(wrapper.vm.$vuetify.application, 'bar', 24) + expect(wrapper.vm.computedMarginTop).toBe(24) + }) + + it('should set active based on manual scroll', async () => { + const wrapper = mount(VToolbar, { + propsData: { + scrollOffScreen: true + } + }) + + expect(wrapper.vm.isActive).toBe(true) + wrapper.setProps({ manualScroll: true }) + await wrapper.vm.$nextTick() + expect(wrapper.vm.isActive).toBe(false) + }) + + it.skip('should set a custom target', async () => { + const wrapper = mount(VToolbar, { + propsData: { + target: 'body' + } + }) + + wrapper.vm.onScroll() + expect(wrapper.vm.target).toBe('body') + }) + + it.skip('should set isScrollingUp', async () => { + const wrapper = mount(VToolbar) + + await scrollWindow(100) + expect(wrapper.vm.isScrollingUp).toBe(false) + await scrollWindow(0) + expect(wrapper.vm.isScrollingUp).toBe(true) + }) + + it('should update the application content height if screen size changes', async () => { + const app = mount(VApp) + const wrapper = mount(VToolbar, { + propsData: { + app: true + } + }) + + await resizeWindow(1920) + expect(wrapper.vm.$vuetify.application.top).toBe(64) + + await resizeWindow(200) + expect(wrapper.vm.$vuetify.application.top).toBe(56) + }) }) diff --git a/src/components/VToolbar/VToolbarSideIcon.spec.js b/src/components/VToolbar/VToolbarSideIcon.spec.js index 062c297e7a2f..1b003e7d84d5 100644 --- a/src/components/VToolbar/VToolbarSideIcon.spec.js +++ b/src/components/VToolbar/VToolbarSideIcon.spec.js @@ -1,6 +1,6 @@ -import { test } from '~util/testing' -import VIcon from '~components/VIcon' -import { VToolbarSideIcon } from '~components/VToolbar' +import { test } from '@util/testing' +import VIcon from '@components/VIcon' +import { VToolbarSideIcon } from '@components/VToolbar' test('VToolbarSideIcon.js', ({ mount, functionalContext }) => { it('should create default icon when no slot used', () => { diff --git a/src/components/VToolbar/__snapshots__/VToolbar.spec.js.snap b/src/components/VToolbar/__snapshots__/VToolbar.spec.js.snap new file mode 100755 index 000000000000..b577fa28b6da --- /dev/null +++ b/src/components/VToolbar/__snapshots__/VToolbar.spec.js.snap @@ -0,0 +1,35 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VToolbar.vue should render an extended toolbar 1`] = ` + + + +`; + +exports[`VToolbar.vue should render an extended toolbar with specific height 1`] = ` + + + +`; diff --git a/src/components/VToolbar/__snapshots__/VToolbarSideIcon.spec.js.snap b/src/components/VToolbar/__snapshots__/VToolbarSideIcon.spec.js.snap index e8522e4e8280..36df00d02548 100644 --- a/src/components/VToolbar/__snapshots__/VToolbarSideIcon.spec.js.snap +++ b/src/components/VToolbar/__snapshots__/VToolbarSideIcon.spec.js.snap @@ -4,11 +4,10 @@ exports[`VToolbarSideIcon.js should create default icon when no slot used 1`] =