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`] =