├── .circleci
└── config.yml
├── .gitignore
├── LICENSE
├── README.md
├── deploy-docs.sh
├── docs
├── README.md
├── SUMMARY.md
├── babel.md
├── backend.md
├── commands.md
├── e2e.md
├── env.md
├── linter.md
├── pre-processors.md
├── prerender.md
├── proxy.md
├── static.md
├── structure.md
└── unit.md
├── meta.js
├── package-lock.json
├── package.json
├── scenarios
├── README.md
├── full-karma-airbnb.json
├── full.json
├── index.js
└── minimal.json
├── template
├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .postcssrc.js
├── README.md
├── build
│ ├── build.js
│ ├── check-versions.js
│ ├── logo.png
│ ├── utils.js
│ ├── vue-loader.conf.js
│ ├── webpack.base.conf.js
│ ├── webpack.dev.conf.js
│ ├── webpack.prod.conf.js
│ └── webpack.test.conf.js
├── config
│ ├── dev.env.js
│ ├── index.js
│ ├── prod.env.js
│ └── test.env.js
├── index.html
├── package.json
├── src
│ ├── App.vue
│ ├── assets
│ │ └── logo.png
│ ├── components
│ │ └── HelloWorld.vue
│ ├── main.js
│ └── router
│ │ └── index.js
├── static
│ └── .gitkeep
└── test
│ ├── e2e
│ ├── custom-assertions
│ │ └── elementCount.js
│ ├── nightwatch.conf.js
│ ├── runner.js
│ └── specs
│ │ └── test.js
│ └── unit
│ ├── .eslintrc
│ ├── index.js
│ ├── jest.conf.js
│ ├── karma.conf.js
│ ├── setup.js
│ └── specs
│ └── HelloWorld.spec.js
└── utils
└── index.js
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | vm_settings: &vm_settings
3 | docker:
4 | - image: circleci/node:6.12.3-browsers
5 |
6 | jobs:
7 | install_template_deps:
8 | <<: *vm_settings
9 | working_directory: ~/project/webpack-template
10 | steps:
11 | - checkout
12 | - restore_cache:
13 | key: template-cache-{{ checksum "package.json" }}
14 | - run:
15 | name: Install npm dependencies
16 | command: npm install
17 | - save_cache:
18 | key: template-cache-{{ checksum "package.json" }}
19 | paths:
20 | - node_modules
21 | - run:
22 | name: Rollout minimal scenario
23 | command: VUE_TEMPL_TEST=minimal node_modules/.bin/vue init . test-minimal
24 | - run:
25 | name: Rollout full scenario
26 | command: VUE_TEMPL_TEST=full node_modules/.bin/vue init . test-full
27 | - run:
28 | name: Rollout full-karma-airbnb scenario
29 | command: VUE_TEMPL_TEST=full-karma-airbnb node_modules/.bin/vue init . test-full-karma-airbnb
30 | - persist_to_workspace:
31 | root: ~/project/webpack-template
32 | paths:
33 | - node_modules
34 | - test-*
35 |
36 | scenario_minimal:
37 | <<: *vm_settings
38 | environment:
39 | - VUE_TEMPL_TEST: minimal
40 | working_directory: ~/project/webpack-template/test-minimal
41 | steps:
42 | - attach_workspace:
43 | at: '~/project/webpack-template'
44 | - restore_cache:
45 | key: template-cache-minimal-{{ checksum "package.json" }}
46 | - run:
47 | name: Install npm dependencies
48 | command: npm install
49 | - save_cache:
50 | key: template-cache-minimal-{{ checksum "package.json" }}
51 | paths:
52 | - node_modules
53 | - run:
54 | name: Test build
55 | command: npm run build
56 |
57 | scenario_full:
58 | <<: *vm_settings
59 | working_directory: ~/project/webpack-template/test-full
60 | environment:
61 | - VUE_TEMPL_TEST: full
62 | steps:
63 | - attach_workspace:
64 | at: '~/project/webpack-template'
65 | - restore_cache:
66 | key: template-cache-full-{{ checksum "package.json" }}
67 | - run:
68 | name: Install npm dependencies
69 | command: npm install
70 | - save_cache:
71 | key: template-cache-full-{{ checksum "package.json" }}
72 | paths:
73 | - node_modules
74 | - run:
75 | name: Run Lint
76 | command: npm run lint -- --fix
77 | - run:
78 | name: Run Unit tests
79 | command: npm run unit
80 | when: always
81 | - run:
82 | name: Run e2e tests
83 | command: npm run e2e
84 | when: always
85 | - run:
86 | name: Test build
87 | command: npm run build
88 | when: always
89 |
90 | scenario_full-karma-airbnb:
91 | <<: *vm_settings
92 | working_directory: ~/project/webpack-template/test-full-karma-airbnb
93 | environment:
94 | - VUE_TEMPL_TEST: full-karma-airbnb
95 | steps:
96 | - attach_workspace:
97 | at: '~/project/webpack-template'
98 | - restore_cache:
99 | key: template-cache-full-karma-airbnb-{{ checksum "package.json" }}
100 | - run:
101 | name: Install npm dependencies
102 | command: npm install
103 | - save_cache:
104 | key: template-cache-full-karma-airbnb-{{ checksum "package.json" }}
105 | paths:
106 | - node_modules
107 | - run:
108 | name: Run Lint
109 | command: npm run lint -- --fix
110 | - run:
111 | name: Run Unit tests
112 | command: npm run unit
113 | when: always
114 | - run:
115 | name: Run e2e tests
116 | command: npm run e2e
117 | when: always
118 | - run:
119 | name: Test build
120 | command: npm run build
121 | when: always
122 |
123 |
124 | workflows:
125 | version: 2
126 | build_and_test:
127 | jobs:
128 | - install_template_deps
129 | - scenario_minimal:
130 | requires:
131 | - install_template_deps
132 | - scenario_full:
133 | requires:
134 | - install_template_deps
135 | - scenario_full-karma-airbnb:
136 | requires:
137 | - install_template_deps
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | docs/_book
4 | test/
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2013-present, Yuxi (Evan) You
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue-webpack-boilerplate
2 |
3 | > A full-featured Webpack setup with hot-reload, lint-on-save, unit testing & css extraction.
4 |
5 | > This template is Vue 2.0 compatible. For Vue 1.x use this command: `vue init webpack#1.0 my-project`
6 |
7 |
8 | # Vue-cli 3 is here, so this template is now considered deprecated.
9 |
10 | This template was the main template for vue-cli verison 2.*.
11 |
12 | Now that we have released a [stable version of vue-cli 3](https://cli.vuejs.org), which incorporates all features that this template offers (and much more), we think that this template doesn't have any significant use for the future, so we won't put much resource in developing it further.
13 |
14 | We will try and fix major issues should they arise, but not much more.
15 |
16 | Feel free to fork this template if you want to keep it alive.
17 |
18 | ## Documentation
19 |
20 | - [For this template](http://vuejs-templates.github.io/webpack): common questions specific to this template are answered and each part is described in greater detail
21 | - [For Vue 2.0](http://vuejs.org/guide/): general information about how to work with Vue, not specific to this template
22 |
23 | ## Usage
24 |
25 | This is a project template for [vue-cli](https://github.com/vuejs/vue-cli). **It is recommended to use npm 3+ for a more efficient dependency tree.**
26 |
27 | ``` bash
28 | $ npm install -g vue-cli
29 | $ vue init webpack my-project
30 | $ cd my-project
31 | $ npm install
32 | $ npm run dev
33 | ```
34 |
35 | This will scaffold the project using the `master` branch. If you wish to use the latest version of the webpack template, do the following instead:
36 |
37 | ``` bash
38 | $ vue init webpack#develop my-project
39 | ```
40 |
41 | :warning: **The develop branch is not considered stable and can contain bugs or not build at all, so use at your own risk.**
42 |
43 | The development server will run on port 8080 by default. If that port is already in use on your machine, the next free port will be used.
44 |
45 | ## What's Included
46 |
47 | - `npm run dev`: first-in-class development experience.
48 | - Webpack + `vue-loader` for single file Vue components.
49 | - State preserving hot-reload
50 | - State preserving compilation error overlay
51 | - Lint-on-save with ESLint
52 | - Source maps
53 |
54 | - `npm run build`: Production ready build.
55 | - JavaScript minified with [UglifyJS v3](https://github.com/mishoo/UglifyJS2/tree/harmony).
56 | - HTML minified with [html-minifier](https://github.com/kangax/html-minifier).
57 | - CSS across all components extracted into a single file and minified with [cssnano](https://github.com/ben-eb/cssnano).
58 | - Static assets compiled with version hashes for efficient long-term caching, and an auto-generated production `index.html` with proper URLs to these generated assets.
59 | - Use `npm run build --report`to build with bundle size analytics.
60 |
61 | - `npm run unit`: Unit tests run in [JSDOM](https://github.com/tmpvar/jsdom) with [Jest](https://facebook.github.io/jest/), or in PhantomJS with Karma + Mocha + karma-webpack.
62 | - Supports ES2015+ in test files.
63 | - Easy mocking.
64 |
65 | - `npm run e2e`: End-to-end tests with [Nightwatch](http://nightwatchjs.org/).
66 | - Run tests in multiple browsers in parallel.
67 | - Works with one command out of the box:
68 | - Selenium and chromedriver dependencies automatically handled.
69 | - Automatically spawns the Selenium server.
70 |
71 | ### Fork It And Make Your Own
72 |
73 | You can fork this repo to create your own boilerplate, and use it with `vue-cli`:
74 |
75 | ``` bash
76 | vue init username/repo my-project
77 | ```
78 |
--------------------------------------------------------------------------------
/deploy-docs.sh:
--------------------------------------------------------------------------------
1 | cd docs
2 | rm -rf _book
3 | gitbook build
4 | cd _book
5 | git init
6 | git add -A
7 | git commit -m 'update book'
8 | git push -f git@github.com:vuejs-templates/webpack.git master:gh-pages
9 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | # Introduction
2 |
3 | This boilerplate is targeted towards large, serious projects and assumes you are somewhat familiar with Webpack and `vue-loader`. Make sure to also read [`vue-loader`'s documentation](https://vue-loader.vuejs.org/) for common workflow recipes.
4 |
5 | If you just want to try out `vue-loader` or whip out a quick prototype, use the [webpack-simple](https://github.com/vuejs-templates/webpack-simple) template instead.
6 |
7 | ## Quickstart
8 |
9 | To use this template, scaffold a project with [vue-cli](https://github.com/vuejs/vue-cli). **It is recommended to use npm 3+ for a more efficient dependency tree.**
10 |
11 | ``` bash
12 | $ npm install -g vue-cli
13 | $ vue init webpack my-project
14 | $ cd my-project
15 | $ npm install
16 | $ npm run dev
17 | ```
18 |
--------------------------------------------------------------------------------
/docs/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Summary
2 |
3 | - [Project Structure](structure.md)
4 | - [Build Commands](commands.md)
5 | - [Babel Configuration](babel.md)
6 | - [Linter Configuration](linter.md)
7 | - [Pre-Processors](pre-processors.md)
8 | - [Handling Static Assets](static.md)
9 | - [Environment Variables](env.md)
10 | - [Integrate with Backend Framework](backend.md)
11 | - [API Proxying During Development](proxy.md)
12 | - [Unit Testing](unit.md)
13 | - [End-to-end Testing](e2e.md)
14 | - [Prerendering for SEO](prerender.md)
15 |
--------------------------------------------------------------------------------
/docs/babel.md:
--------------------------------------------------------------------------------
1 | # Babel Configuration
2 |
3 | This boilerplate uses [`babel-preset-env`](https://www.npmjs.com/package/babel-preset-env) for configuring babel. You can read more about it here - http://2ality.com/2017/02/babel-preset-env.html.
4 |
5 | > A Babel preset that compiles ES2015+ down to ES5 by automatically determining the Babel plugins and polyfills you need based on your targeted browser or runtime environments.
6 |
7 | It uses [`browserslist`](https://github.com/ai/browserslist) to parse this information, so we can use any [valid query format supported by `browserslist`](https://github.com/ai/browserslist#queries).
8 |
9 | However there is a caveat. `browserslist` recommends defining the target in a common place like `package.json` or in a `.browserslistrc` config file. This allows tools like [`autoprefixer`](https://github.com/postcss/autoprefixer) and [`eslint-plugin-compat`](https://github.com/amilajack/eslint-plugin-compat) to share the config. For this template, `browserslist` is configured in the `package.json`:
10 |
11 | ```json
12 | {
13 | "...": "...",
14 | "browserslist": [
15 | "> 1%",
16 | "last 2 versions",
17 | "not ie <= 8"
18 | ]
19 | }
20 | ```
21 |
22 | But the latest stable release of `babel-preset-env`, `v1.6.1` does not support loading the config from `package.json`. So the target environment is repeated in `.babelrc`. If you wish to change your target environment, please be sure to update both `package.json` and `.babelrc`. Note that this has been fixed in the beta version([`@babel/preset-env@7.0.0-beta.34`](https://github.com/babel/babel/tree/master/packages/babel-preset-env)) and the template will be updated once it is out of beta.
23 |
--------------------------------------------------------------------------------
/docs/backend.md:
--------------------------------------------------------------------------------
1 | # Integrating with Backend Framework
2 |
3 | If you are building a purely-static app (one that is deployed separately from the backend API), then you probably don't even need to edit `config/index.js`. However, if you want to integrate this template with an existing backend framework, e.g. Rails/Django/Laravel, which comes with their own project structures, you can edit `config/index.js` to directly generate front-end assets into your backend project.
4 |
5 | Let's take a look at the default `config/index.js`:
6 |
7 | ``` js
8 | // config/index.js
9 | 'use strict'
10 | const path = require('path')
11 |
12 | module.exports = {
13 | dev: {
14 | // Paths
15 | assetsSubDirectory: 'static',
16 | assetsPublicPath: '/',
17 | proxyTable: {},
18 |
19 | // Various Dev Server settings
20 | host: 'localhost',
21 | port: 8080,
22 |
23 | // skipping other options as they are only convenience features
24 | },
25 | build: {
26 | // Template for index.html
27 | index: path.resolve(__dirname, '../dist/index.html'),
28 |
29 | // Paths
30 | assetsRoot: path.resolve(__dirname, '../dist'),
31 | assetsSubDirectory: 'static',
32 | assetsPublicPath: '/',
33 |
34 | productionSourceMap: true,
35 |
36 | // skipping the rest ...
37 | },
38 | }
39 | ```
40 |
41 | Inside the `build` section, we have the following options:
42 |
43 | ### `build.index`
44 |
45 | > Must be an absolute path on your local file system.
46 |
47 | This is where the `index.html` (with injected asset URLs) will be generated.
48 |
49 | If you are using this template with a backend-framework, you can edit `index.html` accordingly and point this path to a view file rendered by your backend app, e.g. `app/views/layouts/application.html.erb` for a Rails app, or `resources/views/index.blade.php` for a Laravel app.
50 |
51 | ### `build.assetsRoot`
52 |
53 | > Must be an absolute path on your local file system.
54 |
55 | This should point to the root directory that contains all the static assets for your app. For example, `public/` for both Rails/Laravel.
56 |
57 | ### `build.assetsSubDirectory`
58 |
59 | Nest webpack-generated assets under this directory in `build.assetsRoot`, so that they are not mixed with other files you may have in `build.assetsRoot`. For example, if `build.assetsRoot` is `/path/to/dist`, and `build.assetsSubDirectory` is `static`, then all Webpack assets will be generated in `path/to/dist/static`.
60 |
61 | This directory will be cleaned before each build, so it should only contain assets generated by the build.
62 |
63 | Files inside `static/` will be copied into this directory as-is during build. This means if you change this prefix, all your absolute URLs referencing files in `static/` will also need to be changed. See [Handling Static Assets](static.md) for more details.
64 |
65 | ### `build.assetsPublicPath`
66 |
67 | This should be the URL path where your `build.assetsRoot` will be served from over HTTP. In most cases, this will be root (`/`). Only change this if your backend framework serves static assets with a path prefix. Internally, this is passed to Webpack as `output.publicPath`.
68 |
69 | ### `build.productionSourceMap`
70 |
71 | Whether to generate source maps for production build.
72 |
73 | ### `dev.port`
74 |
75 | Specify the port for the dev server to listen to.
76 |
77 | ### `dev.proxyTable`
78 |
79 | Define proxy rules for the dev server. See [API Proxying During Development](proxy.md) for more details.
80 |
--------------------------------------------------------------------------------
/docs/commands.md:
--------------------------------------------------------------------------------
1 | # Build Commands
2 |
3 | All build commands are executed via [NPM Scripts](https://docs.npmjs.com/misc/scripts).
4 |
5 | ### `npm run dev`
6 |
7 | > Starts a Node.js local development server. See [API Proxying During Development](proxy.md) for more details.
8 |
9 | - Webpack + `vue-loader` for single file Vue components.
10 | - State preserving hot-reload
11 | - State preserving compilation error overlay
12 | - Lint-on-save with ESLint
13 | - Source maps
14 |
15 | ### `npm run build`
16 |
17 | > Build assets for production. See [Integrating with Backend Framework](backend.md) for more details.
18 |
19 | - JavaScript minified with [UglifyJS v3](https://github.com/mishoo/UglifyJS2/tree/harmony).
20 | - HTML minified with [html-minifier](https://github.com/kangax/html-minifier).
21 | - CSS across all components extracted into a single file and minified with [cssnano](https://github.com/ben-eb/cssnano).
22 | - All static assets compiled with version hashes for efficient long-term caching, and a production `index.html` is auto-generated with proper URLs to these generated assets.
23 |
24 | ### `npm run unit`
25 |
26 | > Run unit tests in JSDOM with [Jest](https://facebook.github.io/jest/docs/getting-started.html). See [Unit Testing](unit.md) for more details.
27 |
28 | - Supports ES2015+ in test files.
29 | - Easy [mocking](https://facebook.github.io/jest/docs/mock-functions.html).
30 |
31 | ### `npm run e2e`
32 |
33 | > Run end-to-end tests with [Nightwatch](http://nightwatchjs.org/). See [End-to-end Testing](e2e.md) for more details.
34 |
35 | - Run tests in multiple browsers in parallel.
36 | - Works with one command out of the box:
37 | - Selenium and chromedriver dependencies automatically handled.
38 | - Automatically spawns the Selenium server.
39 |
40 | ### `npm run lint`
41 |
42 | > Runs eslint and reports any linting errors in your code. See [Linter Configuration](linter.md)
43 |
--------------------------------------------------------------------------------
/docs/e2e.md:
--------------------------------------------------------------------------------
1 | # End-to-end Testing
2 |
3 | This boilerplate uses [Nightwatch.js](http://nightwatchjs.org) for e2e tests. Nightwatch.js is a highly integrated e2e test runner built on top of Selenium. This boilerplate comes with Selenium server and chromedriver binaries pre-configured for you, so you don't have to mess with these yourself.
4 |
5 | Let's take a look at the files in the `test/e2e` directory:
6 |
7 | - `runner.js`
8 |
9 | A Node.js script that starts the dev server, and then launches Nightwatch to run tests against it. This is the script that will run when you run `npm run e2e`.
10 |
11 | - `nightwatch.conf.js`
12 |
13 | Nightwatch configuration file. See [Nightwatch's docs on configuration](http://nightwatchjs.org/gettingstarted#settings-file) for more details.
14 |
15 | - `custom-assertions/`
16 |
17 | Custom assertions that can be used in Nightwatch tests. See [Nightwatch's docs on writing custom assertions](http://nightwatchjs.org/guide#writing-custom-assertions) for more details.
18 |
19 | - `specs/`
20 |
21 | Your actual tests! See [Nightwatch's docs on writing tests](http://nightwatchjs.org/guide#writing-tests) and [API reference](http://nightwatchjs.org/api) for more details.
22 |
23 | ### Running Tests in More Browsers
24 |
25 | To configure which browsers to run the tests in, add an entry under "test_settings" in [`test/e2e/nightwatch.conf.js`](https://github.com/vuejs-templates/webpack/blob/master/template/test/e2e/nightwatch.conf.js#L17-L39) , and also the `--env` flag in [`test/e2e/runner.js`](https://github.com/vuejs-templates/webpack/blob/master/template/test/e2e/runner.js#L15). If you wish to configure remote testing on services like SauceLabs, you can either make the Nightwatch config conditional based on environment variables, or use a separate config file altogether. Consult [Nightwatch's docs on Selenium](http://nightwatchjs.org/guide#selenium-settings) for more details.
26 |
--------------------------------------------------------------------------------
/docs/env.md:
--------------------------------------------------------------------------------
1 | # Environment Variables
2 |
3 | Sometimes it is practical to have different config values according to the environment that the application is running in.
4 |
5 | As an example:
6 |
7 | ```js
8 | // config/prod.env.js
9 | module.exports = {
10 | NODE_ENV: '"production"',
11 | DEBUG_MODE: false,
12 | API_KEY: '"..."' // this is shared between all environments
13 | }
14 |
15 | // config/dev.env.js
16 | module.exports = merge(prodEnv, {
17 | NODE_ENV: '"development"',
18 | DEBUG_MODE: true // this overrides the DEBUG_MODE value of prod.env
19 | })
20 |
21 | // config/test.env.js
22 | module.exports = merge(devEnv, {
23 | NODE_ENV: '"testing"'
24 | })
25 | ```
26 |
27 | > **Note:** string variables need to be wrapped into single and double quotes `'"..."'`
28 |
29 | So, the environment variables are:
30 | - Production
31 | - NODE_ENV = 'production',
32 | - DEBUG_MODE = false,
33 | - API_KEY = '...'
34 | - Development
35 | - NODE_ENV = 'development',
36 | - DEBUG_MODE = true,
37 | - API_KEY = '...'
38 | - Testing
39 | - NODE_ENV = 'testing',
40 | - DEBUG_MODE = true,
41 | - API_KEY = '...'
42 |
43 | As we can see, `test.env` inherits the `dev.env` and the `dev.env` inherits the `prod.env`.
44 |
45 | ### Usage
46 |
47 | It is simple to use the environment variables in your code. For example:
48 |
49 | ```js
50 | Vue.config.productionTip = process.env.NODE_ENV === 'production'
51 | ```
52 |
--------------------------------------------------------------------------------
/docs/linter.md:
--------------------------------------------------------------------------------
1 | # Linter Configuration
2 |
3 | This boilerplate uses [ESLint](https://eslint.org/) as the linter, and uses the [Standard](https://github.com/feross/standard/blob/master/RULES.md) preset with some small customizations.
4 |
5 | ## eslint-plugin-vue
6 |
7 | We always add [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) as well, which comes with a whole bunch of helpful rules to write consistent Vue components - it can also lint templates!
8 |
9 | You can find an overview of all the available rules on [github](https://github.com/vuejs/eslint-plugin-vue#gear-configs). We chose to add the `essential` configs, but we recommend to switch to the bigger `strongly-recommended` or `recommended` rulesets once you are familiar with them.
10 |
11 | ## Customizing
12 |
13 | If you are not happy with the default linting rules, you have several options:
14 |
15 | 1. Overwrite individual rules in `.eslintrc.js`. For example, you can add the following rule to enforce semicolons instead of omitting them:
16 |
17 | ``` js
18 | // .eslintrc.js
19 | "semi": [2, "always"]
20 | ```
21 |
22 | 2. Pick a different ESLint preset when generating the project, for example [eslint-config-airbnb](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb).
23 |
24 | 3. Pick "none" for ESLint preset when generating the project and define your own rules. See [ESLint documentation](https://eslint.org/docs/rules/) for more details.
25 |
26 | ## Fixing Linting Errors
27 |
28 | You can run the following command to let eslint fix any errors it finds (if it can - not all errors are fixable like this):
29 |
30 | ```
31 | npm run lint -- --fix
32 | ```
33 |
34 | *(The `--` in the middle is necessary to ensure the `--fix` option is passed to `eslint`, not to `npm`. It can be omitted when using yarn)*
35 |
36 |
37 |
--------------------------------------------------------------------------------
/docs/pre-processors.md:
--------------------------------------------------------------------------------
1 | # Pre-Processors
2 |
3 | This boilerplate has pre-configured CSS extraction for most popular CSS pre-processors including LESS, Sass, Stylus, and PostCSS. To use a pre-processor, all you need to do is install the appropriate webpack loader for it. For example, to use Sass:
4 |
5 | ``` bash
6 | npm install sass-loader node-sass --save-dev
7 | ```
8 |
9 | Note you also need to install `node-sass` because `sass-loader` depends on it as a peer dependency.
10 |
11 | ### Using Pre-Processors inside Components
12 |
13 | Once installed, you can use the pre-processors inside your `*.vue` components using the `lang` attribute on `
19 | ```
20 |
21 | ### A note on Sass syntax
22 |
23 | - `lang="scss"` corresponds to the CSS-superset syntax (with curly braces and semicolons).
24 | - `lang="sass"` corresponds to the indentation-based syntax.
25 |
26 | ### PostCSS
27 |
28 | Styles in `*.vue` files and style files (`*.css`, `*.scss` etc) are piped through PostCSS by default, so you don't need to use a specific loader for it.
29 |
30 | You can simply add PostCSS plugins you want to use to the `.postcssrc.js` file in your project's root directory:
31 |
32 | ``` js
33 | // https://github.com/michael-ciniawsky/postcss-load-config
34 |
35 | module.exports = {
36 | "plugins": {
37 | // to edit target browsers: use "browserslist" field in package.json
38 | "postcss-import": {},
39 | "autoprefixer": {}
40 | }
41 | }
42 | ```
43 |
44 | See [vue-loader's related documentation](http://vuejs.github.io/vue-loader/en/features/postcss.html) for more details.
45 |
46 | ### Standalone CSS Files
47 |
48 | To ensure consistent extraction and processing, it is recommended to import global, standalone style files from your root `App.vue` component, for example:
49 |
50 | ``` html
51 |
52 |
53 | ```
54 |
55 | Note you should probably only do this for the styles written by yourself for your application. For existing libraries e.g. Bootstrap or Semantic UI, you can place them inside `/static` and reference them directly in `index.html`. This avoids extra build time and also is better for browser caching. (See [Static Asset Handling](static.md))
56 |
--------------------------------------------------------------------------------
/docs/prerender.md:
--------------------------------------------------------------------------------
1 | # Prerendering for SEO
2 |
3 | If you want to prerender routes that will not significantly change once pushed to production, use this Webpack plugin: [prerender-spa-plugin](https://www.npmjs.com/package/prerender-spa-plugin), which has been tested for use with Vue. For pages that _do_ frequently change, [Prerender.io](https://prerender.io/) and [Netlify](https://www.netlify.com/pricing) both offer plans for regularly re-prerendering your content for search engines.
4 |
5 | ## Using `prerender-spa-plugin`
6 |
7 | 1. Install it as a dev dependency:
8 |
9 | ```bash
10 | npm install --save-dev prerender-spa-plugin
11 | ```
12 |
13 | 2. Require it in **build/webpack.prod.conf.js**:
14 |
15 | ```js
16 | // This line should go at the top of the file where other 'imports' live in
17 | const PrerenderSpaPlugin = require('prerender-spa-plugin')
18 | ```
19 |
20 | 3. Configure it in the `plugins` array (also in **build/webpack.prod.conf.js**):
21 |
22 | ```js
23 | new PrerenderSpaPlugin(
24 | // Path to compiled app
25 | path.join(__dirname, '../dist'),
26 | // List of endpoints you wish to prerender
27 | [ '/' ]
28 | )
29 | ```
30 |
31 | If you also wanted to prerender `/about` and `/contact`, then that array would be `[ '/', '/about', '/contact' ]`.
32 |
33 | 4. Enable history mode for `vue-router`:
34 | ```js
35 | const router = new VueRouter({
36 | mode: 'history',
37 | routes: [...]
38 | })
39 | ```
40 |
--------------------------------------------------------------------------------
/docs/proxy.md:
--------------------------------------------------------------------------------
1 | # API Proxying During Development
2 |
3 | When integrating this boilerplate with an existing backend, a common need is to access the backend API when using the dev server. To achieve that, we can run the dev server and the API backend side-by-side (or remotely), and let the dev server proxy all API requests to the actual backend.
4 |
5 | To configure the proxy rules, edit `dev.proxyTable` option in `config/index.js`. The dev server is using [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) for proxying, so you should refer to its docs for detailed usage. But here's a simple example:
6 |
7 | ``` js
8 | // config/index.js
9 | module.exports = {
10 | // ...
11 | dev: {
12 | proxyTable: {
13 | // proxy all requests starting with /api to jsonplaceholder
14 | '/api': {
15 | target: 'http://jsonplaceholder.typicode.com',
16 | changeOrigin: true,
17 | pathRewrite: {
18 | '^/api': ''
19 | }
20 | }
21 | }
22 | }
23 | }
24 | ```
25 |
26 | The above example will proxy the request `/api/posts/1` to `http://jsonplaceholder.typicode.com/posts/1`.
27 |
28 | ## URL Matching
29 |
30 | In addition to static urls you can also use glob patterns to match URLs, e.g. `/api/**`. See [Context Matching](https://github.com/chimurai/http-proxy-middleware#context-matching) for more details. In addition, you can provide a `filter` option that can be a custom function to determine whether a request should be proxied:
31 |
32 | ``` js
33 | proxyTable: {
34 | '**': {
35 | target: 'http://jsonplaceholder.typicode.com',
36 | filter: function (pathname, req) {
37 | return pathname.match('^/api') && req.method === 'GET'
38 | }
39 | }
40 | }
41 | ```
42 |
--------------------------------------------------------------------------------
/docs/static.md:
--------------------------------------------------------------------------------
1 | # Handling Static Assets
2 |
3 | You will notice in the project structure we have two directories for static assets: `src/assets` and `static/`. What is the difference between them?
4 |
5 | ### Webpacked Assets
6 |
7 | To answer this question, we first need to understand how Webpack deals with static assets. In `*.vue` components, all your templates and CSS are parsed by `vue-html-loader` and `css-loader` to look for asset URLs. For example, in `` and `background: url(./logo.png)`, `"./logo.png"` is a relative asset path and will be **resolved by Webpack as a module dependency**.
8 |
9 | Because `logo.png` is not JavaScript, when treated as a module dependency, we need to use `url-loader` and `file-loader` to process it. This template has already configured these loaders for you, so you get features such as filename fingerprinting and conditional base64 inlining for free, while being able to use relative/module paths without worrying about deployment.
10 |
11 | Since these assets may be inlined/copied/renamed during build, they are essentially part of your source code. This is why it is recommended to place Webpack-processed static assets inside `/src`, alongside other source files. In fact, you don't even have to put them all in `/src/assets`: you can organize them based on the module/component using them. For example, you can put each component in its own directory, with its static assets right next to it.
12 |
13 | ### Asset Resolving Rules
14 |
15 | - **Relative URLs**, e.g. `./assets/logo.png` will be interpreted as a module dependency. They will be replaced with an auto-generated URL based on your Webpack output configuration.
16 |
17 | - **Non-prefixed URLs**, e.g. `assets/logo.png` will be treated the same as the relative URLs and translated into `./assets/logo.png`.
18 |
19 | - **URLs prefixed with `~`** are treated as a module request, similar to `require('some-module/image.png')`. You need to use this prefix if you want to leverage Webpack's module resolving configurations. For example if you have a resolve alias for `assets`, you need to use `
` to ensure that alias is respected.
20 |
21 | - **Root-relative URLs**, e.g. `/assets/logo.png` are not processed at all.
22 |
23 | ### Getting Asset Paths in JavaScript
24 |
25 | In order for Webpack to return the correct asset paths, you need to use `require('./relative/path/to/file.jpg')`, which will get processed by `file-loader` and returns the resolved URL. For example:
26 |
27 | ``` js
28 | computed: {
29 | background () {
30 | return require('./bgs/' + this.id + '.jpg')
31 | }
32 | }
33 | ```
34 |
35 | **Note the above example will include every image under `./bgs/` in the final build.** This is because Webpack cannot guess which of them will be used at runtime, so it includes them all.
36 |
37 | ### "Real" Static Assets
38 |
39 | In comparison, files in `static/` are not processed by Webpack at all: they are directly copied to their final destination as-is, with the same filename. You must reference these files using absolute paths, which is determined by joining `build.assetsPublicPath` and `build.assetsSubDirectory` in `config.js`.
40 |
41 | As an example, with the following default values:
42 |
43 | ``` js
44 | // config/index.js
45 | module.exports = {
46 | // ...
47 | build: {
48 | assetsPublicPath: '/',
49 | assetsSubDirectory: 'static'
50 | }
51 | }
52 | ```
53 |
54 | Any file placed in `static/` should be referenced using the absolute URL `/static/[filename]`. If you change `assetSubDirectory` to `assets`, then these URLs will need to be changed to `/assets/[filename]`.
55 |
56 | We will learn more about the config file in the section about [backend integration](backend.md).
57 |
--------------------------------------------------------------------------------
/docs/structure.md:
--------------------------------------------------------------------------------
1 | # Project Structure
2 |
3 | ``` bash
4 | .
5 | ├── build/ # webpack config files
6 | │ └── ...
7 | ├── config/
8 | │ ├── index.js # main project config
9 | │ └── ...
10 | ├── src/
11 | │ ├── main.js # app entry file
12 | │ ├── App.vue # main app component
13 | │ ├── components/ # ui components
14 | │ │ └── ...
15 | │ └── assets/ # module assets (processed by webpack)
16 | │ └── ...
17 | ├── static/ # pure static assets (directly copied)
18 | ├── test/
19 | │ └── unit/ # unit tests
20 | │ │ ├── specs/ # test spec files
21 | │ │ ├── eslintrc # config file for eslint with extra settings only for unit tests
22 | │ │ ├── index.js # test build entry file
23 | │ │ ├── jest.conf.js # Config file when using Jest for unit tests
24 | │ │ ├── karma.conf.js # test runner config file when using Karma for unit tests
25 | │ │ └── setup.js # file that runs before Jest runs your unit tests
26 | │ └── e2e/ # e2e tests
27 | │ │ ├── specs/ # test spec files
28 | │ │ ├── custom-assertions/ # custom assertions for e2e tests
29 | │ │ ├── runner.js # test runner script
30 | │ │ └── nightwatch.conf.js # test runner config file
31 | ├── .babelrc # babel config
32 | ├── .editorconfig # indentation, spaces/tabs and similar settings for your editor
33 | ├── .eslintrc.js # eslint config
34 | ├── .eslintignore # eslint ignore rules
35 | ├── .gitignore # sensible defaults for gitignore
36 | ├── .postcssrc.js # postcss config
37 | ├── index.html # index.html template
38 | ├── package.json # build scripts and dependencies
39 | └── README.md # Default README file
40 | ```
41 |
42 | ### `build/`
43 |
44 | This directory holds the actual configurations for both the development server and the production webpack build. Normally you don't need to touch these files unless you want to customize Webpack loaders, in which case you should probably look at `build/webpack.base.conf.js`.
45 |
46 | ### `config/index.js`
47 |
48 | This is the main configuration file that exposes some of the most common configuration options for the build setup. See [API Proxying During Development](proxy.md) and [Integrating with Backend Framework](backend.md) for more details.
49 |
50 | ### `src/`
51 |
52 | This is where most of your application code will live in. How to structure everything inside this directory is largely up to you; if you are using Vuex, you can consult the [recommendations for Vuex applications](http://vuex.vuejs.org/en/structure.html).
53 |
54 | ### `static/`
55 |
56 | This directory is an escape hatch for static assets that you do not want to process with Webpack. They will be directly copied into the same directory where webpack-built assets are generated.
57 |
58 | See [Handling Static Assets](static.md) for more details.
59 |
60 | ### `test/unit`
61 |
62 | Contains unit test related files. See [Unit Testing](unit.md) for more details.
63 |
64 | ### `test/e2e`
65 |
66 | Contains e2e test related files. See [End-to-end Testing](e2e.md) for more details.
67 |
68 | ### `index.html`
69 |
70 | This is the **template** `index.html` for our single page application. During development and builds, Webpack will generate assets, and the URLs for those generated assets will be automatically injected into this template to render the final HTML.
71 |
72 | ### `package.json`
73 |
74 | The NPM package meta file that contains all the build dependencies and [build commands](commands.md).
75 |
--------------------------------------------------------------------------------
/docs/unit.md:
--------------------------------------------------------------------------------
1 | # Unit Testing
2 |
3 | This project offers two options for unit testing:
4 |
5 | 1. Jest
6 | 2. Karma and Mocha.
7 |
8 |
9 | ## Jest
10 |
11 | - [Jest](https://facebook.github.io/jest/): the test runner that launches JSDOM runs the tests and reports the results to us.
12 |
13 | ### Files
14 |
15 | - `setup.js`
16 |
17 | Jest runs this file before it runs the unit tests. It sets the Vue production tip to false.
18 |
19 | ### Mocking Dependencies
20 |
21 | The Jest boilerplate comes with the ability to mock dependencies. See the [mock functions guide](https://facebook.github.io/jest/docs/mock-functions.html) for more details.
22 |
23 | ## Karma and Mocha
24 |
25 | - [Karma](https://karma-runner.github.io/): the test runner that launches browsers, runs the tests and reports the results to us.
26 | - [karma-webpack](https://github.com/webpack/karma-webpack): the plugin for Karma that bundles our tests using Webpack.
27 | - [Mocha](https://mochajs.org/): the test framework that we write test specs with.
28 | - [Chai](http://chaijs.com/): test assertion library that provides better assertion syntax.
29 | - [Sinon](http://sinonjs.org/): test utility library that provides spies, stubs and mocks.
30 |
31 | Chai and Sinon are integrated using [karma-sinon-chai](https://github.com/kmees/karma-sinon-chai), so all Chai interfaces (`should`, `expect`, `assert`) and `sinon` are globally available in test files.
32 |
33 | ### Files
34 |
35 | - `index.js`
36 |
37 | This is the entry file used by `karma-webpack` to bundle all the test code and source code (for coverage purposes). You can ignore it for the most part.
38 |
39 | - `specs/`
40 |
41 | This directory is where you write your actual tests. You can use full ES2015+ and all supported Webpack loaders in your tests.
42 |
43 | - `karma.conf.js`
44 |
45 | This is the Karma configuration file. See [Karma docs](https://karma-runner.github.io/) for more details.
46 |
47 | ### Running Tests in More Browsers
48 |
49 | You can run the tests in multiple real browsers by installing more [karma launchers](https://karma-runner.github.io/1.0/config/browsers.html) and adjusting the `browsers` field in `test/unit/karma.conf.js`.
50 |
51 | ### Mocking Dependencies
52 |
53 | The Karma unit test boilerplate comes with [inject-loader](https://github.com/plasticine/inject-loader) installed by default. For usage with `*.vue` components, see [vue-loader docs on testing with mocks](http://vue-loader.vuejs.org/en/workflow/testing-with-mocks.html).
54 |
--------------------------------------------------------------------------------
/meta.js:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 | const fs = require('fs')
3 |
4 | const {
5 | sortDependencies,
6 | installDependencies,
7 | runLintFix,
8 | printMessage,
9 | } = require('./utils')
10 | const pkg = require('./package.json')
11 |
12 | const templateVersion = pkg.version
13 |
14 | const { addTestAnswers } = require('./scenarios')
15 |
16 | module.exports = {
17 | metalsmith: {
18 | // When running tests for the template, this adds answers for the selected scenario
19 | before: addTestAnswers
20 | },
21 | helpers: {
22 | if_or(v1, v2, options) {
23 |
24 | if (v1 || v2) {
25 | return options.fn(this)
26 | }
27 |
28 | return options.inverse(this)
29 | },
30 | template_version() {
31 | return templateVersion
32 | },
33 | },
34 |
35 | prompts: {
36 | name: {
37 | when: 'isNotTest',
38 | type: 'string',
39 | required: true,
40 | message: 'Project name',
41 | },
42 | description: {
43 | when: 'isNotTest',
44 | type: 'string',
45 | required: false,
46 | message: 'Project description',
47 | default: 'A Vue.js project',
48 | },
49 | author: {
50 | when: 'isNotTest',
51 | type: 'string',
52 | message: 'Author',
53 | },
54 | build: {
55 | when: 'isNotTest',
56 | type: 'list',
57 | message: 'Vue build',
58 | choices: [
59 | {
60 | name: 'Runtime + Compiler: recommended for most users',
61 | value: 'standalone',
62 | short: 'standalone',
63 | },
64 | {
65 | name:
66 | 'Runtime-only: about 6KB lighter min+gzip, but templates (or any Vue-specific HTML) are ONLY allowed in .vue files - render functions are required elsewhere',
67 | value: 'runtime',
68 | short: 'runtime',
69 | },
70 | ],
71 | },
72 | router: {
73 | when: 'isNotTest',
74 | type: 'confirm',
75 | message: 'Install vue-router?',
76 | },
77 | lint: {
78 | when: 'isNotTest',
79 | type: 'confirm',
80 | message: 'Use ESLint to lint your code?',
81 | },
82 | lintConfig: {
83 | when: 'isNotTest && lint',
84 | type: 'list',
85 | message: 'Pick an ESLint preset',
86 | choices: [
87 | {
88 | name: 'Standard (https://github.com/standard/standard)',
89 | value: 'standard',
90 | short: 'Standard',
91 | },
92 | {
93 | name: 'Airbnb (https://github.com/airbnb/javascript)',
94 | value: 'airbnb',
95 | short: 'Airbnb',
96 | },
97 | {
98 | name: 'none (configure it yourself)',
99 | value: 'none',
100 | short: 'none',
101 | },
102 | ],
103 | },
104 | unit: {
105 | when: 'isNotTest',
106 | type: 'confirm',
107 | message: 'Set up unit tests',
108 | },
109 | runner: {
110 | when: 'isNotTest && unit',
111 | type: 'list',
112 | message: 'Pick a test runner',
113 | choices: [
114 | {
115 | name: 'Jest',
116 | value: 'jest',
117 | short: 'jest',
118 | },
119 | {
120 | name: 'Karma and Mocha',
121 | value: 'karma',
122 | short: 'karma',
123 | },
124 | {
125 | name: 'none (configure it yourself)',
126 | value: 'noTest',
127 | short: 'noTest',
128 | },
129 | ],
130 | },
131 | e2e: {
132 | when: 'isNotTest',
133 | type: 'confirm',
134 | message: 'Setup e2e tests with Nightwatch?',
135 | },
136 | autoInstall: {
137 | when: 'isNotTest',
138 | type: 'list',
139 | message:
140 | 'Should we run `npm install` for you after the project has been created? (recommended)',
141 | choices: [
142 | {
143 | name: 'Yes, use NPM',
144 | value: 'npm',
145 | short: 'npm',
146 | },
147 | {
148 | name: 'Yes, use Yarn',
149 | value: 'yarn',
150 | short: 'yarn',
151 | },
152 | {
153 | name: 'No, I will handle that myself',
154 | value: false,
155 | short: 'no',
156 | },
157 | ],
158 | },
159 | },
160 | filters: {
161 | '.eslintrc.js': 'lint',
162 | '.eslintignore': 'lint',
163 | 'config/test.env.js': 'unit || e2e',
164 | 'build/webpack.test.conf.js': "unit && runner === 'karma'",
165 | 'test/unit/**/*': 'unit',
166 | 'test/unit/index.js': "unit && runner === 'karma'",
167 | 'test/unit/jest.conf.js': "unit && runner === 'jest'",
168 | 'test/unit/karma.conf.js': "unit && runner === 'karma'",
169 | 'test/unit/specs/index.js': "unit && runner === 'karma'",
170 | 'test/unit/setup.js': "unit && runner === 'jest'",
171 | 'test/e2e/**/*': 'e2e',
172 | 'src/router/**/*': 'router',
173 | },
174 | complete: function(data, { chalk }) {
175 | const green = chalk.green
176 |
177 | sortDependencies(data, green)
178 |
179 | const cwd = path.join(process.cwd(), data.inPlace ? '' : data.destDirName)
180 |
181 | if (data.autoInstall) {
182 | installDependencies(cwd, data.autoInstall, green)
183 | .then(() => {
184 | return runLintFix(cwd, data, green)
185 | })
186 | .then(() => {
187 | printMessage(data, green)
188 | })
189 | .catch(e => {
190 | console.log(chalk.red('Error:'), e)
191 | })
192 | } else {
193 | printMessage(data, chalk)
194 | }
195 | },
196 | }
197 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-cli-template-webpack",
3 | "version": "1.2.8",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "absolute": {
8 | "version": "0.0.1",
9 | "resolved": "https://registry.npmjs.org/absolute/-/absolute-0.0.1.tgz",
10 | "integrity": "sha1-wigi+H4ck59XmIdQTZwQnEFzgp0=",
11 | "dev": true
12 | },
13 | "ajv": {
14 | "version": "5.5.2",
15 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
16 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
17 | "dev": true,
18 | "requires": {
19 | "co": "4.6.0",
20 | "fast-deep-equal": "1.0.0",
21 | "fast-json-stable-stringify": "2.0.0",
22 | "json-schema-traverse": "0.3.1"
23 | },
24 | "dependencies": {
25 | "co": {
26 | "version": "4.6.0",
27 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
28 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
29 | "dev": true
30 | }
31 | }
32 | },
33 | "align-text": {
34 | "version": "0.1.4",
35 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
36 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
37 | "dev": true,
38 | "requires": {
39 | "kind-of": "3.2.2",
40 | "longest": "1.0.1",
41 | "repeat-string": "1.6.1"
42 | }
43 | },
44 | "amdefine": {
45 | "version": "1.0.1",
46 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
47 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
48 | "dev": true
49 | },
50 | "ansi-escapes": {
51 | "version": "3.0.0",
52 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
53 | "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==",
54 | "dev": true
55 | },
56 | "ansi-red": {
57 | "version": "0.1.1",
58 | "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
59 | "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
60 | "dev": true,
61 | "requires": {
62 | "ansi-wrap": "0.1.0"
63 | }
64 | },
65 | "ansi-regex": {
66 | "version": "3.0.0",
67 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
68 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
69 | "dev": true
70 | },
71 | "ansi-styles": {
72 | "version": "3.2.0",
73 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
74 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
75 | "dev": true,
76 | "requires": {
77 | "color-convert": "1.9.1"
78 | }
79 | },
80 | "ansi-wrap": {
81 | "version": "0.1.0",
82 | "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
83 | "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
84 | "dev": true
85 | },
86 | "argparse": {
87 | "version": "1.0.9",
88 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
89 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
90 | "dev": true,
91 | "requires": {
92 | "sprintf-js": "1.0.3"
93 | }
94 | },
95 | "array-differ": {
96 | "version": "1.0.0",
97 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
98 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
99 | "dev": true
100 | },
101 | "array-union": {
102 | "version": "1.0.2",
103 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
104 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
105 | "dev": true,
106 | "requires": {
107 | "array-uniq": "1.0.3"
108 | }
109 | },
110 | "array-uniq": {
111 | "version": "1.0.3",
112 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
113 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
114 | "dev": true
115 | },
116 | "arrify": {
117 | "version": "1.0.1",
118 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
119 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
120 | "dev": true
121 | },
122 | "asn1": {
123 | "version": "0.2.3",
124 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
125 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
126 | "dev": true
127 | },
128 | "assert-plus": {
129 | "version": "1.0.0",
130 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
131 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
132 | "dev": true
133 | },
134 | "async": {
135 | "version": "2.6.0",
136 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
137 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
138 | "dev": true,
139 | "requires": {
140 | "lodash": "4.17.4"
141 | }
142 | },
143 | "asynckit": {
144 | "version": "0.4.0",
145 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
146 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
147 | "dev": true
148 | },
149 | "aws-sign2": {
150 | "version": "0.7.0",
151 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
152 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
153 | "dev": true
154 | },
155 | "aws4": {
156 | "version": "1.6.0",
157 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
158 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
159 | "dev": true
160 | },
161 | "balanced-match": {
162 | "version": "1.0.0",
163 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
164 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
165 | "dev": true
166 | },
167 | "base64-js": {
168 | "version": "0.0.8",
169 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
170 | "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=",
171 | "dev": true
172 | },
173 | "bcrypt-pbkdf": {
174 | "version": "1.0.1",
175 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
176 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
177 | "dev": true,
178 | "optional": true,
179 | "requires": {
180 | "tweetnacl": "0.14.5"
181 | }
182 | },
183 | "bl": {
184 | "version": "1.2.1",
185 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
186 | "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
187 | "dev": true,
188 | "requires": {
189 | "readable-stream": "2.3.3"
190 | }
191 | },
192 | "bluebird": {
193 | "version": "3.5.1",
194 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
195 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
196 | "dev": true
197 | },
198 | "boom": {
199 | "version": "4.3.1",
200 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
201 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
202 | "dev": true,
203 | "requires": {
204 | "hoek": "4.2.0"
205 | }
206 | },
207 | "brace-expansion": {
208 | "version": "1.1.8",
209 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
210 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
211 | "dev": true,
212 | "requires": {
213 | "balanced-match": "1.0.0",
214 | "concat-map": "0.0.1"
215 | }
216 | },
217 | "buffer": {
218 | "version": "3.6.0",
219 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz",
220 | "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=",
221 | "dev": true,
222 | "requires": {
223 | "base64-js": "0.0.8",
224 | "ieee754": "1.1.8",
225 | "isarray": "1.0.0"
226 | }
227 | },
228 | "buffer-crc32": {
229 | "version": "0.2.13",
230 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
231 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
232 | "dev": true
233 | },
234 | "builtins": {
235 | "version": "1.0.3",
236 | "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
237 | "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
238 | "dev": true
239 | },
240 | "camelcase": {
241 | "version": "1.2.1",
242 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
243 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
244 | "dev": true,
245 | "optional": true
246 | },
247 | "capture-stack-trace": {
248 | "version": "1.0.0",
249 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
250 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
251 | "dev": true
252 | },
253 | "caseless": {
254 | "version": "0.12.0",
255 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
256 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
257 | "dev": true
258 | },
259 | "caw": {
260 | "version": "2.0.1",
261 | "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
262 | "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
263 | "dev": true,
264 | "requires": {
265 | "get-proxy": "2.1.0",
266 | "isurl": "1.0.0",
267 | "tunnel-agent": "0.6.0",
268 | "url-to-options": "1.0.1"
269 | }
270 | },
271 | "center-align": {
272 | "version": "0.1.3",
273 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
274 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
275 | "dev": true,
276 | "optional": true,
277 | "requires": {
278 | "align-text": "0.1.4",
279 | "lazy-cache": "1.0.4"
280 | }
281 | },
282 | "chalk": {
283 | "version": "2.3.0",
284 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
285 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
286 | "dev": true,
287 | "requires": {
288 | "ansi-styles": "3.2.0",
289 | "escape-string-regexp": "1.0.5",
290 | "supports-color": "4.5.0"
291 | }
292 | },
293 | "chardet": {
294 | "version": "0.4.2",
295 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
296 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
297 | "dev": true
298 | },
299 | "cli-cursor": {
300 | "version": "2.1.0",
301 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
302 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
303 | "dev": true,
304 | "requires": {
305 | "restore-cursor": "2.0.0"
306 | }
307 | },
308 | "cli-spinners": {
309 | "version": "1.1.0",
310 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz",
311 | "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=",
312 | "dev": true
313 | },
314 | "cli-width": {
315 | "version": "2.2.0",
316 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
317 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
318 | "dev": true
319 | },
320 | "cliui": {
321 | "version": "2.1.0",
322 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
323 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
324 | "dev": true,
325 | "optional": true,
326 | "requires": {
327 | "center-align": "0.1.3",
328 | "right-align": "0.1.3",
329 | "wordwrap": "0.0.2"
330 | },
331 | "dependencies": {
332 | "wordwrap": {
333 | "version": "0.0.2",
334 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
335 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
336 | "dev": true,
337 | "optional": true
338 | }
339 | }
340 | },
341 | "clone": {
342 | "version": "1.0.3",
343 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
344 | "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
345 | "dev": true
346 | },
347 | "co": {
348 | "version": "3.1.0",
349 | "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz",
350 | "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=",
351 | "dev": true
352 | },
353 | "co-from-stream": {
354 | "version": "0.0.0",
355 | "resolved": "https://registry.npmjs.org/co-from-stream/-/co-from-stream-0.0.0.tgz",
356 | "integrity": "sha1-GlzYztdyY5RglPo58kmaYyl7yvk=",
357 | "dev": true,
358 | "requires": {
359 | "co-read": "0.0.1"
360 | }
361 | },
362 | "co-fs-extra": {
363 | "version": "1.2.1",
364 | "resolved": "https://registry.npmjs.org/co-fs-extra/-/co-fs-extra-1.2.1.tgz",
365 | "integrity": "sha1-O2rXfPJhRTD2d7HPYmZPW6dWtyI=",
366 | "dev": true,
367 | "requires": {
368 | "co-from-stream": "0.0.0",
369 | "fs-extra": "0.26.7",
370 | "thunkify-wrap": "1.0.4"
371 | }
372 | },
373 | "co-read": {
374 | "version": "0.0.1",
375 | "resolved": "https://registry.npmjs.org/co-read/-/co-read-0.0.1.tgz",
376 | "integrity": "sha1-+Bs+uKhmdf7FHj2IOn9WToc8k4k=",
377 | "dev": true
378 | },
379 | "coffee-script": {
380 | "version": "1.12.7",
381 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
382 | "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
383 | "dev": true
384 | },
385 | "color-convert": {
386 | "version": "1.9.1",
387 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
388 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
389 | "dev": true,
390 | "requires": {
391 | "color-name": "1.1.3"
392 | }
393 | },
394 | "color-name": {
395 | "version": "1.1.3",
396 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
397 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
398 | "dev": true
399 | },
400 | "combined-stream": {
401 | "version": "1.0.5",
402 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
403 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
404 | "dev": true,
405 | "requires": {
406 | "delayed-stream": "1.0.0"
407 | }
408 | },
409 | "commander": {
410 | "version": "2.12.2",
411 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
412 | "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
413 | "dev": true
414 | },
415 | "concat-map": {
416 | "version": "0.0.1",
417 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
418 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
419 | "dev": true
420 | },
421 | "config-chain": {
422 | "version": "1.1.11",
423 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
424 | "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=",
425 | "dev": true,
426 | "requires": {
427 | "ini": "1.3.5",
428 | "proto-list": "1.2.4"
429 | }
430 | },
431 | "consolidate": {
432 | "version": "0.14.5",
433 | "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz",
434 | "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=",
435 | "dev": true,
436 | "requires": {
437 | "bluebird": "3.5.1"
438 | }
439 | },
440 | "core-util-is": {
441 | "version": "1.0.2",
442 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
443 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
444 | "dev": true
445 | },
446 | "create-error-class": {
447 | "version": "3.0.2",
448 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
449 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
450 | "dev": true,
451 | "requires": {
452 | "capture-stack-trace": "1.0.0"
453 | }
454 | },
455 | "cryptiles": {
456 | "version": "3.1.2",
457 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
458 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
459 | "dev": true,
460 | "requires": {
461 | "boom": "5.2.0"
462 | },
463 | "dependencies": {
464 | "boom": {
465 | "version": "5.2.0",
466 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
467 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
468 | "dev": true,
469 | "requires": {
470 | "hoek": "4.2.0"
471 | }
472 | }
473 | }
474 | },
475 | "dashdash": {
476 | "version": "1.14.1",
477 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
478 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
479 | "dev": true,
480 | "requires": {
481 | "assert-plus": "1.0.0"
482 | }
483 | },
484 | "decamelize": {
485 | "version": "1.2.0",
486 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
487 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
488 | "dev": true,
489 | "optional": true
490 | },
491 | "decompress": {
492 | "version": "4.2.0",
493 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz",
494 | "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=",
495 | "dev": true,
496 | "requires": {
497 | "decompress-tar": "4.1.1",
498 | "decompress-tarbz2": "4.1.1",
499 | "decompress-targz": "4.1.1",
500 | "decompress-unzip": "4.0.1",
501 | "graceful-fs": "4.1.11",
502 | "make-dir": "1.1.0",
503 | "pify": "2.3.0",
504 | "strip-dirs": "2.1.0"
505 | }
506 | },
507 | "decompress-tar": {
508 | "version": "4.1.1",
509 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
510 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
511 | "dev": true,
512 | "requires": {
513 | "file-type": "5.2.0",
514 | "is-stream": "1.1.0",
515 | "tar-stream": "1.5.5"
516 | }
517 | },
518 | "decompress-tarbz2": {
519 | "version": "4.1.1",
520 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
521 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
522 | "dev": true,
523 | "requires": {
524 | "decompress-tar": "4.1.1",
525 | "file-type": "6.2.0",
526 | "is-stream": "1.1.0",
527 | "seek-bzip": "1.0.5",
528 | "unbzip2-stream": "1.2.5"
529 | },
530 | "dependencies": {
531 | "file-type": {
532 | "version": "6.2.0",
533 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
534 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
535 | "dev": true
536 | }
537 | }
538 | },
539 | "decompress-targz": {
540 | "version": "4.1.1",
541 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
542 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
543 | "dev": true,
544 | "requires": {
545 | "decompress-tar": "4.1.1",
546 | "file-type": "5.2.0",
547 | "is-stream": "1.1.0"
548 | }
549 | },
550 | "decompress-unzip": {
551 | "version": "4.0.1",
552 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
553 | "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
554 | "dev": true,
555 | "requires": {
556 | "file-type": "3.9.0",
557 | "get-stream": "2.3.1",
558 | "pify": "2.3.0",
559 | "yauzl": "2.9.1"
560 | },
561 | "dependencies": {
562 | "file-type": {
563 | "version": "3.9.0",
564 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
565 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
566 | "dev": true
567 | },
568 | "get-stream": {
569 | "version": "2.3.1",
570 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
571 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
572 | "dev": true,
573 | "requires": {
574 | "object-assign": "4.1.1",
575 | "pinkie-promise": "2.0.1"
576 | }
577 | }
578 | }
579 | },
580 | "delayed-stream": {
581 | "version": "1.0.0",
582 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
583 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
584 | "dev": true
585 | },
586 | "download": {
587 | "version": "5.0.3",
588 | "resolved": "https://registry.npmjs.org/download/-/download-5.0.3.tgz",
589 | "integrity": "sha1-Y1N/l3+ZJmow64oqL70fILgAD3o=",
590 | "dev": true,
591 | "requires": {
592 | "caw": "2.0.1",
593 | "decompress": "4.2.0",
594 | "filenamify": "2.0.0",
595 | "get-stream": "3.0.0",
596 | "got": "6.7.1",
597 | "mkdirp": "0.5.1",
598 | "pify": "2.3.0"
599 | }
600 | },
601 | "download-git-repo": {
602 | "version": "1.0.1",
603 | "resolved": "https://registry.npmjs.org/download-git-repo/-/download-git-repo-1.0.1.tgz",
604 | "integrity": "sha1-1isHq+gpQx6f7JDVVDWXZkIo8wU=",
605 | "dev": true,
606 | "requires": {
607 | "download": "5.0.3",
608 | "git-clone": "0.1.0",
609 | "rimraf": "2.6.2"
610 | }
611 | },
612 | "duplexer3": {
613 | "version": "0.1.4",
614 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
615 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
616 | "dev": true
617 | },
618 | "ecc-jsbn": {
619 | "version": "0.1.1",
620 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
621 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
622 | "dev": true,
623 | "optional": true,
624 | "requires": {
625 | "jsbn": "0.1.1"
626 | }
627 | },
628 | "enable": {
629 | "version": "1.3.2",
630 | "resolved": "https://registry.npmjs.org/enable/-/enable-1.3.2.tgz",
631 | "integrity": "sha1-nrpoN9FtCYK1n4fYib91REPVKTE=",
632 | "dev": true
633 | },
634 | "end-of-stream": {
635 | "version": "1.4.0",
636 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
637 | "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=",
638 | "dev": true,
639 | "requires": {
640 | "once": "1.4.0"
641 | }
642 | },
643 | "escape-string-regexp": {
644 | "version": "1.0.5",
645 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
646 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
647 | "dev": true
648 | },
649 | "esprima": {
650 | "version": "4.0.0",
651 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
652 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
653 | "dev": true
654 | },
655 | "extend": {
656 | "version": "3.0.1",
657 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
658 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
659 | "dev": true
660 | },
661 | "extend-shallow": {
662 | "version": "2.0.1",
663 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
664 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
665 | "dev": true,
666 | "requires": {
667 | "is-extendable": "0.1.1"
668 | }
669 | },
670 | "external-editor": {
671 | "version": "2.1.0",
672 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
673 | "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
674 | "dev": true,
675 | "requires": {
676 | "chardet": "0.4.2",
677 | "iconv-lite": "0.4.19",
678 | "tmp": "0.0.33"
679 | }
680 | },
681 | "extsprintf": {
682 | "version": "1.3.0",
683 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
684 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
685 | "dev": true
686 | },
687 | "fast-deep-equal": {
688 | "version": "1.0.0",
689 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
690 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
691 | "dev": true
692 | },
693 | "fast-json-stable-stringify": {
694 | "version": "2.0.0",
695 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
696 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
697 | "dev": true
698 | },
699 | "fd-slicer": {
700 | "version": "1.0.1",
701 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
702 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
703 | "dev": true,
704 | "requires": {
705 | "pend": "1.2.0"
706 | }
707 | },
708 | "figures": {
709 | "version": "2.0.0",
710 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
711 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
712 | "dev": true,
713 | "requires": {
714 | "escape-string-regexp": "1.0.5"
715 | }
716 | },
717 | "file-type": {
718 | "version": "5.2.0",
719 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
720 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
721 | "dev": true
722 | },
723 | "filename-reserved-regex": {
724 | "version": "2.0.0",
725 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
726 | "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
727 | "dev": true
728 | },
729 | "filenamify": {
730 | "version": "2.0.0",
731 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.0.0.tgz",
732 | "integrity": "sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU=",
733 | "dev": true,
734 | "requires": {
735 | "filename-reserved-regex": "2.0.0",
736 | "strip-outer": "1.0.0",
737 | "trim-repeated": "1.0.0"
738 | }
739 | },
740 | "forever-agent": {
741 | "version": "0.6.1",
742 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
743 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
744 | "dev": true
745 | },
746 | "form-data": {
747 | "version": "2.3.1",
748 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
749 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
750 | "dev": true,
751 | "requires": {
752 | "asynckit": "0.4.0",
753 | "combined-stream": "1.0.5",
754 | "mime-types": "2.1.17"
755 | }
756 | },
757 | "fs-extra": {
758 | "version": "0.26.7",
759 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
760 | "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=",
761 | "dev": true,
762 | "requires": {
763 | "graceful-fs": "4.1.11",
764 | "jsonfile": "2.4.0",
765 | "klaw": "1.3.1",
766 | "path-is-absolute": "1.0.1",
767 | "rimraf": "2.6.2"
768 | }
769 | },
770 | "fs.realpath": {
771 | "version": "1.0.0",
772 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
773 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
774 | "dev": true
775 | },
776 | "get-proxy": {
777 | "version": "2.1.0",
778 | "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
779 | "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
780 | "dev": true,
781 | "requires": {
782 | "npm-conf": "1.1.3"
783 | }
784 | },
785 | "get-stream": {
786 | "version": "3.0.0",
787 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
788 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
789 | "dev": true
790 | },
791 | "getpass": {
792 | "version": "0.1.7",
793 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
794 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
795 | "dev": true,
796 | "requires": {
797 | "assert-plus": "1.0.0"
798 | }
799 | },
800 | "git-clone": {
801 | "version": "0.1.0",
802 | "resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz",
803 | "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=",
804 | "dev": true
805 | },
806 | "glob": {
807 | "version": "7.1.2",
808 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
809 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
810 | "dev": true,
811 | "requires": {
812 | "fs.realpath": "1.0.0",
813 | "inflight": "1.0.6",
814 | "inherits": "2.0.3",
815 | "minimatch": "3.0.4",
816 | "once": "1.4.0",
817 | "path-is-absolute": "1.0.1"
818 | }
819 | },
820 | "got": {
821 | "version": "6.7.1",
822 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
823 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
824 | "dev": true,
825 | "requires": {
826 | "create-error-class": "3.0.2",
827 | "duplexer3": "0.1.4",
828 | "get-stream": "3.0.0",
829 | "is-redirect": "1.0.0",
830 | "is-retry-allowed": "1.1.0",
831 | "is-stream": "1.1.0",
832 | "lowercase-keys": "1.0.0",
833 | "safe-buffer": "5.1.1",
834 | "timed-out": "4.0.1",
835 | "unzip-response": "2.0.1",
836 | "url-parse-lax": "1.0.0"
837 | }
838 | },
839 | "graceful-fs": {
840 | "version": "4.1.11",
841 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
842 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
843 | "dev": true
844 | },
845 | "graceful-readlink": {
846 | "version": "1.0.1",
847 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
848 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
849 | "dev": true
850 | },
851 | "gray-matter": {
852 | "version": "2.1.1",
853 | "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz",
854 | "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=",
855 | "dev": true,
856 | "requires": {
857 | "ansi-red": "0.1.1",
858 | "coffee-script": "1.12.7",
859 | "extend-shallow": "2.0.1",
860 | "js-yaml": "3.10.0",
861 | "toml": "2.3.3"
862 | }
863 | },
864 | "handlebars": {
865 | "version": "4.0.11",
866 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
867 | "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
868 | "dev": true,
869 | "requires": {
870 | "async": "1.5.2",
871 | "optimist": "0.6.1",
872 | "source-map": "0.4.4",
873 | "uglify-js": "2.8.29"
874 | },
875 | "dependencies": {
876 | "async": {
877 | "version": "1.5.2",
878 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
879 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
880 | "dev": true
881 | }
882 | }
883 | },
884 | "har-schema": {
885 | "version": "2.0.0",
886 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
887 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
888 | "dev": true
889 | },
890 | "har-validator": {
891 | "version": "5.0.3",
892 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
893 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
894 | "dev": true,
895 | "requires": {
896 | "ajv": "5.5.2",
897 | "har-schema": "2.0.0"
898 | }
899 | },
900 | "has-ansi": {
901 | "version": "2.0.0",
902 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
903 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
904 | "dev": true,
905 | "requires": {
906 | "ansi-regex": "2.1.1"
907 | },
908 | "dependencies": {
909 | "ansi-regex": {
910 | "version": "2.1.1",
911 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
912 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
913 | "dev": true
914 | }
915 | }
916 | },
917 | "has-flag": {
918 | "version": "2.0.0",
919 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
920 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
921 | "dev": true
922 | },
923 | "has-generators": {
924 | "version": "1.0.1",
925 | "resolved": "https://registry.npmjs.org/has-generators/-/has-generators-1.0.1.tgz",
926 | "integrity": "sha1-pqLlVIYBGUBILhPiyTeRxEms9Ek=",
927 | "dev": true
928 | },
929 | "has-symbol-support-x": {
930 | "version": "1.4.1",
931 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz",
932 | "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==",
933 | "dev": true
934 | },
935 | "has-to-string-tag-x": {
936 | "version": "1.4.1",
937 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
938 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
939 | "dev": true,
940 | "requires": {
941 | "has-symbol-support-x": "1.4.1"
942 | }
943 | },
944 | "hawk": {
945 | "version": "6.0.2",
946 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
947 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
948 | "dev": true,
949 | "requires": {
950 | "boom": "4.3.1",
951 | "cryptiles": "3.1.2",
952 | "hoek": "4.2.0",
953 | "sntp": "2.1.0"
954 | }
955 | },
956 | "hoek": {
957 | "version": "4.2.0",
958 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
959 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==",
960 | "dev": true
961 | },
962 | "http-signature": {
963 | "version": "1.2.0",
964 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
965 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
966 | "dev": true,
967 | "requires": {
968 | "assert-plus": "1.0.0",
969 | "jsprim": "1.4.1",
970 | "sshpk": "1.13.1"
971 | }
972 | },
973 | "iconv-lite": {
974 | "version": "0.4.19",
975 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
976 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
977 | "dev": true
978 | },
979 | "ieee754": {
980 | "version": "1.1.8",
981 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
982 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
983 | "dev": true
984 | },
985 | "inflight": {
986 | "version": "1.0.6",
987 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
988 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
989 | "dev": true,
990 | "requires": {
991 | "once": "1.4.0",
992 | "wrappy": "1.0.2"
993 | }
994 | },
995 | "inherits": {
996 | "version": "2.0.3",
997 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
998 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
999 | "dev": true
1000 | },
1001 | "ini": {
1002 | "version": "1.3.5",
1003 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
1004 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
1005 | "dev": true
1006 | },
1007 | "inquirer": {
1008 | "version": "3.3.0",
1009 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
1010 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
1011 | "dev": true,
1012 | "requires": {
1013 | "ansi-escapes": "3.0.0",
1014 | "chalk": "2.3.0",
1015 | "cli-cursor": "2.1.0",
1016 | "cli-width": "2.2.0",
1017 | "external-editor": "2.1.0",
1018 | "figures": "2.0.0",
1019 | "lodash": "4.17.4",
1020 | "mute-stream": "0.0.7",
1021 | "run-async": "2.3.0",
1022 | "rx-lite": "4.0.8",
1023 | "rx-lite-aggregates": "4.0.8",
1024 | "string-width": "2.1.1",
1025 | "strip-ansi": "4.0.0",
1026 | "through": "2.3.8"
1027 | }
1028 | },
1029 | "is": {
1030 | "version": "3.2.1",
1031 | "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz",
1032 | "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=",
1033 | "dev": true
1034 | },
1035 | "is-buffer": {
1036 | "version": "1.1.6",
1037 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1038 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1039 | "dev": true
1040 | },
1041 | "is-extendable": {
1042 | "version": "0.1.1",
1043 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
1044 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
1045 | "dev": true
1046 | },
1047 | "is-fullwidth-code-point": {
1048 | "version": "2.0.0",
1049 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1050 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1051 | "dev": true
1052 | },
1053 | "is-natural-number": {
1054 | "version": "4.0.1",
1055 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
1056 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=",
1057 | "dev": true
1058 | },
1059 | "is-object": {
1060 | "version": "1.0.1",
1061 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
1062 | "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=",
1063 | "dev": true
1064 | },
1065 | "is-promise": {
1066 | "version": "2.1.0",
1067 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1068 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
1069 | "dev": true
1070 | },
1071 | "is-redirect": {
1072 | "version": "1.0.0",
1073 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
1074 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
1075 | "dev": true
1076 | },
1077 | "is-retry-allowed": {
1078 | "version": "1.1.0",
1079 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
1080 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
1081 | "dev": true
1082 | },
1083 | "is-stream": {
1084 | "version": "1.1.0",
1085 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1086 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
1087 | "dev": true
1088 | },
1089 | "is-typedarray": {
1090 | "version": "1.0.0",
1091 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1092 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1093 | "dev": true
1094 | },
1095 | "is-utf8": {
1096 | "version": "0.2.1",
1097 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1098 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1099 | "dev": true
1100 | },
1101 | "isarray": {
1102 | "version": "1.0.0",
1103 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1104 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1105 | "dev": true
1106 | },
1107 | "isstream": {
1108 | "version": "0.1.2",
1109 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1110 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
1111 | "dev": true
1112 | },
1113 | "isurl": {
1114 | "version": "1.0.0",
1115 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
1116 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
1117 | "dev": true,
1118 | "requires": {
1119 | "has-to-string-tag-x": "1.4.1",
1120 | "is-object": "1.0.1"
1121 | }
1122 | },
1123 | "js-yaml": {
1124 | "version": "3.10.0",
1125 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
1126 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
1127 | "dev": true,
1128 | "requires": {
1129 | "argparse": "1.0.9",
1130 | "esprima": "4.0.0"
1131 | }
1132 | },
1133 | "jsbn": {
1134 | "version": "0.1.1",
1135 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1136 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
1137 | "dev": true,
1138 | "optional": true
1139 | },
1140 | "json-schema": {
1141 | "version": "0.2.3",
1142 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1143 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
1144 | "dev": true
1145 | },
1146 | "json-schema-traverse": {
1147 | "version": "0.3.1",
1148 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
1149 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
1150 | "dev": true
1151 | },
1152 | "json-stringify-safe": {
1153 | "version": "5.0.1",
1154 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1155 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1156 | "dev": true
1157 | },
1158 | "jsonfile": {
1159 | "version": "2.4.0",
1160 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
1161 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
1162 | "dev": true,
1163 | "requires": {
1164 | "graceful-fs": "4.1.11"
1165 | }
1166 | },
1167 | "jsprim": {
1168 | "version": "1.4.1",
1169 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1170 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1171 | "dev": true,
1172 | "requires": {
1173 | "assert-plus": "1.0.0",
1174 | "extsprintf": "1.3.0",
1175 | "json-schema": "0.2.3",
1176 | "verror": "1.10.0"
1177 | }
1178 | },
1179 | "kind-of": {
1180 | "version": "3.2.2",
1181 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1182 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1183 | "dev": true,
1184 | "requires": {
1185 | "is-buffer": "1.1.6"
1186 | }
1187 | },
1188 | "klaw": {
1189 | "version": "1.3.1",
1190 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
1191 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
1192 | "dev": true,
1193 | "requires": {
1194 | "graceful-fs": "4.1.11"
1195 | }
1196 | },
1197 | "lazy-cache": {
1198 | "version": "1.0.4",
1199 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
1200 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
1201 | "dev": true,
1202 | "optional": true
1203 | },
1204 | "lodash": {
1205 | "version": "4.17.4",
1206 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
1207 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
1208 | "dev": true
1209 | },
1210 | "log-symbols": {
1211 | "version": "1.0.2",
1212 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
1213 | "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
1214 | "dev": true,
1215 | "requires": {
1216 | "chalk": "1.1.3"
1217 | },
1218 | "dependencies": {
1219 | "ansi-regex": {
1220 | "version": "2.1.1",
1221 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1222 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1223 | "dev": true
1224 | },
1225 | "ansi-styles": {
1226 | "version": "2.2.1",
1227 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1228 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1229 | "dev": true
1230 | },
1231 | "chalk": {
1232 | "version": "1.1.3",
1233 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1234 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1235 | "dev": true,
1236 | "requires": {
1237 | "ansi-styles": "2.2.1",
1238 | "escape-string-regexp": "1.0.5",
1239 | "has-ansi": "2.0.0",
1240 | "strip-ansi": "3.0.1",
1241 | "supports-color": "2.0.0"
1242 | }
1243 | },
1244 | "strip-ansi": {
1245 | "version": "3.0.1",
1246 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1247 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1248 | "dev": true,
1249 | "requires": {
1250 | "ansi-regex": "2.1.1"
1251 | }
1252 | },
1253 | "supports-color": {
1254 | "version": "2.0.0",
1255 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1256 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1257 | "dev": true
1258 | }
1259 | }
1260 | },
1261 | "longest": {
1262 | "version": "1.0.1",
1263 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
1264 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
1265 | "dev": true
1266 | },
1267 | "lowercase-keys": {
1268 | "version": "1.0.0",
1269 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
1270 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
1271 | "dev": true
1272 | },
1273 | "make-dir": {
1274 | "version": "1.1.0",
1275 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz",
1276 | "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==",
1277 | "dev": true,
1278 | "requires": {
1279 | "pify": "3.0.0"
1280 | },
1281 | "dependencies": {
1282 | "pify": {
1283 | "version": "3.0.0",
1284 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1285 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1286 | "dev": true
1287 | }
1288 | }
1289 | },
1290 | "metalsmith": {
1291 | "version": "2.3.0",
1292 | "resolved": "https://registry.npmjs.org/metalsmith/-/metalsmith-2.3.0.tgz",
1293 | "integrity": "sha1-gzr7taKmOF4tmuPZNeOeM+rqUjE=",
1294 | "dev": true,
1295 | "requires": {
1296 | "absolute": "0.0.1",
1297 | "chalk": "1.1.3",
1298 | "clone": "1.0.3",
1299 | "co-fs-extra": "1.2.1",
1300 | "commander": "2.12.2",
1301 | "gray-matter": "2.1.1",
1302 | "has-generators": "1.0.1",
1303 | "is": "3.2.1",
1304 | "is-utf8": "0.2.1",
1305 | "recursive-readdir": "2.2.1",
1306 | "rimraf": "2.6.2",
1307 | "stat-mode": "0.2.2",
1308 | "thunkify": "2.1.2",
1309 | "unyield": "0.0.1",
1310 | "ware": "1.3.0",
1311 | "win-fork": "1.1.1"
1312 | },
1313 | "dependencies": {
1314 | "ansi-regex": {
1315 | "version": "2.1.1",
1316 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1317 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1318 | "dev": true
1319 | },
1320 | "ansi-styles": {
1321 | "version": "2.2.1",
1322 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1323 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1324 | "dev": true
1325 | },
1326 | "chalk": {
1327 | "version": "1.1.3",
1328 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1329 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1330 | "dev": true,
1331 | "requires": {
1332 | "ansi-styles": "2.2.1",
1333 | "escape-string-regexp": "1.0.5",
1334 | "has-ansi": "2.0.0",
1335 | "strip-ansi": "3.0.1",
1336 | "supports-color": "2.0.0"
1337 | }
1338 | },
1339 | "strip-ansi": {
1340 | "version": "3.0.1",
1341 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1342 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1343 | "dev": true,
1344 | "requires": {
1345 | "ansi-regex": "2.1.1"
1346 | }
1347 | },
1348 | "supports-color": {
1349 | "version": "2.0.0",
1350 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1351 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1352 | "dev": true
1353 | }
1354 | }
1355 | },
1356 | "mime-db": {
1357 | "version": "1.30.0",
1358 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
1359 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
1360 | "dev": true
1361 | },
1362 | "mime-types": {
1363 | "version": "2.1.17",
1364 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
1365 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
1366 | "dev": true,
1367 | "requires": {
1368 | "mime-db": "1.30.0"
1369 | }
1370 | },
1371 | "mimic-fn": {
1372 | "version": "1.1.0",
1373 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
1374 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
1375 | "dev": true
1376 | },
1377 | "minimatch": {
1378 | "version": "3.0.4",
1379 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1380 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1381 | "dev": true,
1382 | "requires": {
1383 | "brace-expansion": "1.1.8"
1384 | }
1385 | },
1386 | "minimist": {
1387 | "version": "0.0.8",
1388 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1389 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1390 | "dev": true
1391 | },
1392 | "mkdirp": {
1393 | "version": "0.5.1",
1394 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1395 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1396 | "dev": true,
1397 | "requires": {
1398 | "minimist": "0.0.8"
1399 | }
1400 | },
1401 | "multimatch": {
1402 | "version": "2.1.0",
1403 | "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
1404 | "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
1405 | "dev": true,
1406 | "requires": {
1407 | "array-differ": "1.0.0",
1408 | "array-union": "1.0.2",
1409 | "arrify": "1.0.1",
1410 | "minimatch": "3.0.4"
1411 | }
1412 | },
1413 | "mute-stream": {
1414 | "version": "0.0.7",
1415 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
1416 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
1417 | "dev": true
1418 | },
1419 | "npm-conf": {
1420 | "version": "1.1.3",
1421 | "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
1422 | "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
1423 | "dev": true,
1424 | "requires": {
1425 | "config-chain": "1.1.11",
1426 | "pify": "3.0.0"
1427 | },
1428 | "dependencies": {
1429 | "pify": {
1430 | "version": "3.0.0",
1431 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1432 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1433 | "dev": true
1434 | }
1435 | }
1436 | },
1437 | "oauth-sign": {
1438 | "version": "0.8.2",
1439 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
1440 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
1441 | "dev": true
1442 | },
1443 | "object-assign": {
1444 | "version": "4.1.1",
1445 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1446 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1447 | "dev": true
1448 | },
1449 | "once": {
1450 | "version": "1.4.0",
1451 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1452 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1453 | "dev": true,
1454 | "requires": {
1455 | "wrappy": "1.0.2"
1456 | }
1457 | },
1458 | "onetime": {
1459 | "version": "2.0.1",
1460 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1461 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1462 | "dev": true,
1463 | "requires": {
1464 | "mimic-fn": "1.1.0"
1465 | }
1466 | },
1467 | "optimist": {
1468 | "version": "0.6.1",
1469 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1470 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
1471 | "dev": true,
1472 | "requires": {
1473 | "minimist": "0.0.8",
1474 | "wordwrap": "0.0.3"
1475 | }
1476 | },
1477 | "ora": {
1478 | "version": "1.3.0",
1479 | "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz",
1480 | "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=",
1481 | "dev": true,
1482 | "requires": {
1483 | "chalk": "1.1.3",
1484 | "cli-cursor": "2.1.0",
1485 | "cli-spinners": "1.1.0",
1486 | "log-symbols": "1.0.2"
1487 | },
1488 | "dependencies": {
1489 | "ansi-regex": {
1490 | "version": "2.1.1",
1491 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1492 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1493 | "dev": true
1494 | },
1495 | "ansi-styles": {
1496 | "version": "2.2.1",
1497 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1498 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1499 | "dev": true
1500 | },
1501 | "chalk": {
1502 | "version": "1.1.3",
1503 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1504 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1505 | "dev": true,
1506 | "requires": {
1507 | "ansi-styles": "2.2.1",
1508 | "escape-string-regexp": "1.0.5",
1509 | "has-ansi": "2.0.0",
1510 | "strip-ansi": "3.0.1",
1511 | "supports-color": "2.0.0"
1512 | }
1513 | },
1514 | "strip-ansi": {
1515 | "version": "3.0.1",
1516 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1517 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1518 | "dev": true,
1519 | "requires": {
1520 | "ansi-regex": "2.1.1"
1521 | }
1522 | },
1523 | "supports-color": {
1524 | "version": "2.0.0",
1525 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1526 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1527 | "dev": true
1528 | }
1529 | }
1530 | },
1531 | "os-homedir": {
1532 | "version": "1.0.2",
1533 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1534 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1535 | "dev": true
1536 | },
1537 | "os-tmpdir": {
1538 | "version": "1.0.2",
1539 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1540 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1541 | "dev": true
1542 | },
1543 | "path-is-absolute": {
1544 | "version": "1.0.1",
1545 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1546 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1547 | "dev": true
1548 | },
1549 | "pend": {
1550 | "version": "1.2.0",
1551 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
1552 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
1553 | "dev": true
1554 | },
1555 | "performance-now": {
1556 | "version": "2.1.0",
1557 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1558 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1559 | "dev": true
1560 | },
1561 | "pify": {
1562 | "version": "2.3.0",
1563 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1564 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1565 | "dev": true
1566 | },
1567 | "pinkie": {
1568 | "version": "2.0.4",
1569 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1570 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
1571 | "dev": true
1572 | },
1573 | "pinkie-promise": {
1574 | "version": "2.0.1",
1575 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1576 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1577 | "dev": true,
1578 | "requires": {
1579 | "pinkie": "2.0.4"
1580 | }
1581 | },
1582 | "prepend-http": {
1583 | "version": "1.0.4",
1584 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
1585 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
1586 | "dev": true
1587 | },
1588 | "process-nextick-args": {
1589 | "version": "1.0.7",
1590 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
1591 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
1592 | "dev": true
1593 | },
1594 | "proto-list": {
1595 | "version": "1.2.4",
1596 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
1597 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
1598 | "dev": true
1599 | },
1600 | "punycode": {
1601 | "version": "1.4.1",
1602 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1603 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
1604 | "dev": true
1605 | },
1606 | "qs": {
1607 | "version": "6.5.1",
1608 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
1609 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
1610 | "dev": true
1611 | },
1612 | "read-metadata": {
1613 | "version": "1.0.0",
1614 | "resolved": "https://registry.npmjs.org/read-metadata/-/read-metadata-1.0.0.tgz",
1615 | "integrity": "sha1-bfnL5RGE6M630GaLQO5Rkebz2sY=",
1616 | "dev": true,
1617 | "requires": {
1618 | "yaml-js": "0.0.8"
1619 | }
1620 | },
1621 | "readable-stream": {
1622 | "version": "2.3.3",
1623 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
1624 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
1625 | "dev": true,
1626 | "requires": {
1627 | "core-util-is": "1.0.2",
1628 | "inherits": "2.0.3",
1629 | "isarray": "1.0.0",
1630 | "process-nextick-args": "1.0.7",
1631 | "safe-buffer": "5.1.1",
1632 | "string_decoder": "1.0.3",
1633 | "util-deprecate": "1.0.2"
1634 | }
1635 | },
1636 | "recursive-readdir": {
1637 | "version": "2.2.1",
1638 | "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz",
1639 | "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=",
1640 | "dev": true,
1641 | "requires": {
1642 | "minimatch": "3.0.3"
1643 | },
1644 | "dependencies": {
1645 | "minimatch": {
1646 | "version": "3.0.3",
1647 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
1648 | "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
1649 | "dev": true,
1650 | "requires": {
1651 | "brace-expansion": "1.1.8"
1652 | }
1653 | }
1654 | }
1655 | },
1656 | "repeat-string": {
1657 | "version": "1.6.1",
1658 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1659 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
1660 | "dev": true
1661 | },
1662 | "request": {
1663 | "version": "2.83.0",
1664 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
1665 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
1666 | "dev": true,
1667 | "requires": {
1668 | "aws-sign2": "0.7.0",
1669 | "aws4": "1.6.0",
1670 | "caseless": "0.12.0",
1671 | "combined-stream": "1.0.5",
1672 | "extend": "3.0.1",
1673 | "forever-agent": "0.6.1",
1674 | "form-data": "2.3.1",
1675 | "har-validator": "5.0.3",
1676 | "hawk": "6.0.2",
1677 | "http-signature": "1.2.0",
1678 | "is-typedarray": "1.0.0",
1679 | "isstream": "0.1.2",
1680 | "json-stringify-safe": "5.0.1",
1681 | "mime-types": "2.1.17",
1682 | "oauth-sign": "0.8.2",
1683 | "performance-now": "2.1.0",
1684 | "qs": "6.5.1",
1685 | "safe-buffer": "5.1.1",
1686 | "stringstream": "0.0.5",
1687 | "tough-cookie": "2.3.3",
1688 | "tunnel-agent": "0.6.0",
1689 | "uuid": "3.1.0"
1690 | }
1691 | },
1692 | "restore-cursor": {
1693 | "version": "2.0.0",
1694 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1695 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1696 | "dev": true,
1697 | "requires": {
1698 | "onetime": "2.0.1",
1699 | "signal-exit": "3.0.2"
1700 | }
1701 | },
1702 | "right-align": {
1703 | "version": "0.1.3",
1704 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
1705 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
1706 | "dev": true,
1707 | "optional": true,
1708 | "requires": {
1709 | "align-text": "0.1.4"
1710 | }
1711 | },
1712 | "rimraf": {
1713 | "version": "2.6.2",
1714 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
1715 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1716 | "dev": true,
1717 | "requires": {
1718 | "glob": "7.1.2"
1719 | }
1720 | },
1721 | "run-async": {
1722 | "version": "2.3.0",
1723 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
1724 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
1725 | "dev": true,
1726 | "requires": {
1727 | "is-promise": "2.1.0"
1728 | }
1729 | },
1730 | "rx-lite": {
1731 | "version": "4.0.8",
1732 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
1733 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
1734 | "dev": true
1735 | },
1736 | "rx-lite-aggregates": {
1737 | "version": "4.0.8",
1738 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
1739 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
1740 | "dev": true,
1741 | "requires": {
1742 | "rx-lite": "4.0.8"
1743 | }
1744 | },
1745 | "safe-buffer": {
1746 | "version": "5.1.1",
1747 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
1748 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
1749 | "dev": true
1750 | },
1751 | "seek-bzip": {
1752 | "version": "1.0.5",
1753 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
1754 | "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
1755 | "dev": true,
1756 | "requires": {
1757 | "commander": "2.8.1"
1758 | },
1759 | "dependencies": {
1760 | "commander": {
1761 | "version": "2.8.1",
1762 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
1763 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
1764 | "dev": true,
1765 | "requires": {
1766 | "graceful-readlink": "1.0.1"
1767 | }
1768 | }
1769 | }
1770 | },
1771 | "semver": {
1772 | "version": "5.4.1",
1773 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
1774 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
1775 | "dev": true
1776 | },
1777 | "signal-exit": {
1778 | "version": "3.0.2",
1779 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1780 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1781 | "dev": true
1782 | },
1783 | "sntp": {
1784 | "version": "2.1.0",
1785 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
1786 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
1787 | "dev": true,
1788 | "requires": {
1789 | "hoek": "4.2.0"
1790 | }
1791 | },
1792 | "source-map": {
1793 | "version": "0.4.4",
1794 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
1795 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
1796 | "dev": true,
1797 | "requires": {
1798 | "amdefine": "1.0.1"
1799 | }
1800 | },
1801 | "sprintf-js": {
1802 | "version": "1.0.3",
1803 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1804 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1805 | "dev": true
1806 | },
1807 | "sshpk": {
1808 | "version": "1.13.1",
1809 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
1810 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
1811 | "dev": true,
1812 | "requires": {
1813 | "asn1": "0.2.3",
1814 | "assert-plus": "1.0.0",
1815 | "bcrypt-pbkdf": "1.0.1",
1816 | "dashdash": "1.14.1",
1817 | "ecc-jsbn": "0.1.1",
1818 | "getpass": "0.1.7",
1819 | "jsbn": "0.1.1",
1820 | "tweetnacl": "0.14.5"
1821 | }
1822 | },
1823 | "stat-mode": {
1824 | "version": "0.2.2",
1825 | "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
1826 | "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
1827 | "dev": true
1828 | },
1829 | "string-width": {
1830 | "version": "2.1.1",
1831 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1832 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1833 | "dev": true,
1834 | "requires": {
1835 | "is-fullwidth-code-point": "2.0.0",
1836 | "strip-ansi": "4.0.0"
1837 | }
1838 | },
1839 | "string_decoder": {
1840 | "version": "1.0.3",
1841 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
1842 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
1843 | "dev": true,
1844 | "requires": {
1845 | "safe-buffer": "5.1.1"
1846 | }
1847 | },
1848 | "stringstream": {
1849 | "version": "0.0.5",
1850 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
1851 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
1852 | "dev": true
1853 | },
1854 | "strip-ansi": {
1855 | "version": "4.0.0",
1856 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1857 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1858 | "dev": true,
1859 | "requires": {
1860 | "ansi-regex": "3.0.0"
1861 | }
1862 | },
1863 | "strip-dirs": {
1864 | "version": "2.1.0",
1865 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
1866 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
1867 | "dev": true,
1868 | "requires": {
1869 | "is-natural-number": "4.0.1"
1870 | }
1871 | },
1872 | "strip-outer": {
1873 | "version": "1.0.0",
1874 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz",
1875 | "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=",
1876 | "dev": true,
1877 | "requires": {
1878 | "escape-string-regexp": "1.0.5"
1879 | }
1880 | },
1881 | "supports-color": {
1882 | "version": "4.5.0",
1883 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
1884 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
1885 | "dev": true,
1886 | "requires": {
1887 | "has-flag": "2.0.0"
1888 | }
1889 | },
1890 | "tar-stream": {
1891 | "version": "1.5.5",
1892 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz",
1893 | "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==",
1894 | "dev": true,
1895 | "requires": {
1896 | "bl": "1.2.1",
1897 | "end-of-stream": "1.4.0",
1898 | "readable-stream": "2.3.3",
1899 | "xtend": "4.0.1"
1900 | }
1901 | },
1902 | "through": {
1903 | "version": "2.3.8",
1904 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1905 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1906 | "dev": true
1907 | },
1908 | "thunkify": {
1909 | "version": "2.1.2",
1910 | "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
1911 | "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=",
1912 | "dev": true
1913 | },
1914 | "thunkify-wrap": {
1915 | "version": "1.0.4",
1916 | "resolved": "https://registry.npmjs.org/thunkify-wrap/-/thunkify-wrap-1.0.4.tgz",
1917 | "integrity": "sha1-tSvlSN3+/aIOALWMYJZ2K0PdaIA=",
1918 | "dev": true,
1919 | "requires": {
1920 | "enable": "1.3.2"
1921 | }
1922 | },
1923 | "tildify": {
1924 | "version": "1.2.0",
1925 | "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
1926 | "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
1927 | "dev": true,
1928 | "requires": {
1929 | "os-homedir": "1.0.2"
1930 | }
1931 | },
1932 | "timed-out": {
1933 | "version": "4.0.1",
1934 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
1935 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
1936 | "dev": true
1937 | },
1938 | "tmp": {
1939 | "version": "0.0.33",
1940 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1941 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1942 | "dev": true,
1943 | "requires": {
1944 | "os-tmpdir": "1.0.2"
1945 | }
1946 | },
1947 | "toml": {
1948 | "version": "2.3.3",
1949 | "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz",
1950 | "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==",
1951 | "dev": true
1952 | },
1953 | "tough-cookie": {
1954 | "version": "2.3.3",
1955 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
1956 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
1957 | "dev": true,
1958 | "requires": {
1959 | "punycode": "1.4.1"
1960 | }
1961 | },
1962 | "trim-repeated": {
1963 | "version": "1.0.0",
1964 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
1965 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
1966 | "dev": true,
1967 | "requires": {
1968 | "escape-string-regexp": "1.0.5"
1969 | }
1970 | },
1971 | "tunnel-agent": {
1972 | "version": "0.6.0",
1973 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1974 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1975 | "dev": true,
1976 | "requires": {
1977 | "safe-buffer": "5.1.1"
1978 | }
1979 | },
1980 | "tweetnacl": {
1981 | "version": "0.14.5",
1982 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1983 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1984 | "dev": true,
1985 | "optional": true
1986 | },
1987 | "uglify-js": {
1988 | "version": "2.8.29",
1989 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
1990 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
1991 | "dev": true,
1992 | "optional": true,
1993 | "requires": {
1994 | "source-map": "0.5.7",
1995 | "uglify-to-browserify": "1.0.2",
1996 | "yargs": "3.10.0"
1997 | },
1998 | "dependencies": {
1999 | "source-map": {
2000 | "version": "0.5.7",
2001 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2002 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
2003 | "dev": true,
2004 | "optional": true
2005 | }
2006 | }
2007 | },
2008 | "uglify-to-browserify": {
2009 | "version": "1.0.2",
2010 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
2011 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
2012 | "dev": true,
2013 | "optional": true
2014 | },
2015 | "uid": {
2016 | "version": "0.0.2",
2017 | "resolved": "https://registry.npmjs.org/uid/-/uid-0.0.2.tgz",
2018 | "integrity": "sha1-XkpdS3gTi09w+J/Tx2/FmqnS8QM=",
2019 | "dev": true
2020 | },
2021 | "unbzip2-stream": {
2022 | "version": "1.2.5",
2023 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz",
2024 | "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==",
2025 | "dev": true,
2026 | "requires": {
2027 | "buffer": "3.6.0",
2028 | "through": "2.3.8"
2029 | }
2030 | },
2031 | "unyield": {
2032 | "version": "0.0.1",
2033 | "resolved": "https://registry.npmjs.org/unyield/-/unyield-0.0.1.tgz",
2034 | "integrity": "sha1-FQ5l2kK/d0JEW5WKZOubhdHSsYA=",
2035 | "dev": true,
2036 | "requires": {
2037 | "co": "3.1.0"
2038 | }
2039 | },
2040 | "unzip-response": {
2041 | "version": "2.0.1",
2042 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
2043 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
2044 | "dev": true
2045 | },
2046 | "url-parse-lax": {
2047 | "version": "1.0.0",
2048 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
2049 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
2050 | "dev": true,
2051 | "requires": {
2052 | "prepend-http": "1.0.4"
2053 | }
2054 | },
2055 | "url-to-options": {
2056 | "version": "1.0.1",
2057 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
2058 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
2059 | "dev": true
2060 | },
2061 | "user-home": {
2062 | "version": "2.0.0",
2063 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
2064 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
2065 | "dev": true,
2066 | "requires": {
2067 | "os-homedir": "1.0.2"
2068 | }
2069 | },
2070 | "util-deprecate": {
2071 | "version": "1.0.2",
2072 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2073 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2074 | "dev": true
2075 | },
2076 | "uuid": {
2077 | "version": "3.1.0",
2078 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
2079 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
2080 | "dev": true
2081 | },
2082 | "validate-npm-package-name": {
2083 | "version": "3.0.0",
2084 | "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
2085 | "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
2086 | "dev": true,
2087 | "requires": {
2088 | "builtins": "1.0.3"
2089 | }
2090 | },
2091 | "verror": {
2092 | "version": "1.10.0",
2093 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2094 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2095 | "dev": true,
2096 | "requires": {
2097 | "assert-plus": "1.0.0",
2098 | "core-util-is": "1.0.2",
2099 | "extsprintf": "1.3.0"
2100 | }
2101 | },
2102 | "vue-cli": {
2103 | "version": "2.9.2",
2104 | "resolved": "https://registry.npmjs.org/vue-cli/-/vue-cli-2.9.2.tgz",
2105 | "integrity": "sha512-p0SP7fJKBSpA9BlgCSlJfKFjq0uGt7OJW0P7TVujQAr7kAgP9+rg8rNsF7U5TP/E+RjAe9LliCNf7M2O5G2USg==",
2106 | "dev": true,
2107 | "requires": {
2108 | "async": "2.6.0",
2109 | "chalk": "2.3.0",
2110 | "coffee-script": "1.12.7",
2111 | "commander": "2.12.2",
2112 | "consolidate": "0.14.5",
2113 | "download-git-repo": "1.0.1",
2114 | "handlebars": "4.0.11",
2115 | "inquirer": "3.3.0",
2116 | "metalsmith": "2.3.0",
2117 | "minimatch": "3.0.4",
2118 | "multimatch": "2.1.0",
2119 | "ora": "1.3.0",
2120 | "read-metadata": "1.0.0",
2121 | "request": "2.83.0",
2122 | "rimraf": "2.6.2",
2123 | "semver": "5.4.1",
2124 | "tildify": "1.2.0",
2125 | "uid": "0.0.2",
2126 | "user-home": "2.0.0",
2127 | "validate-npm-package-name": "3.0.0"
2128 | }
2129 | },
2130 | "ware": {
2131 | "version": "1.3.0",
2132 | "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz",
2133 | "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=",
2134 | "dev": true,
2135 | "requires": {
2136 | "wrap-fn": "0.1.5"
2137 | }
2138 | },
2139 | "win-fork": {
2140 | "version": "1.1.1",
2141 | "resolved": "https://registry.npmjs.org/win-fork/-/win-fork-1.1.1.tgz",
2142 | "integrity": "sha1-j1jgZW/KAK3IyGoriePNLWotXl4=",
2143 | "dev": true
2144 | },
2145 | "window-size": {
2146 | "version": "0.1.0",
2147 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
2148 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
2149 | "dev": true,
2150 | "optional": true
2151 | },
2152 | "wordwrap": {
2153 | "version": "0.0.3",
2154 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
2155 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
2156 | "dev": true
2157 | },
2158 | "wrap-fn": {
2159 | "version": "0.1.5",
2160 | "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz",
2161 | "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=",
2162 | "dev": true,
2163 | "requires": {
2164 | "co": "3.1.0"
2165 | }
2166 | },
2167 | "wrappy": {
2168 | "version": "1.0.2",
2169 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2170 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2171 | "dev": true
2172 | },
2173 | "xtend": {
2174 | "version": "4.0.1",
2175 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
2176 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
2177 | "dev": true
2178 | },
2179 | "yaml-js": {
2180 | "version": "0.0.8",
2181 | "resolved": "https://registry.npmjs.org/yaml-js/-/yaml-js-0.0.8.tgz",
2182 | "integrity": "sha1-h8+lqWE/SOJgBUINao7g2m/o2uw=",
2183 | "dev": true
2184 | },
2185 | "yargs": {
2186 | "version": "3.10.0",
2187 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
2188 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
2189 | "dev": true,
2190 | "optional": true,
2191 | "requires": {
2192 | "camelcase": "1.2.1",
2193 | "cliui": "2.1.0",
2194 | "decamelize": "1.2.0",
2195 | "window-size": "0.1.0"
2196 | }
2197 | },
2198 | "yauzl": {
2199 | "version": "2.9.1",
2200 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
2201 | "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
2202 | "dev": true,
2203 | "requires": {
2204 | "buffer-crc32": "0.2.13",
2205 | "fd-slicer": "1.0.1"
2206 | }
2207 | }
2208 | }
2209 | }
2210 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-cli-template-webpack",
3 | "version": "1.3.1",
4 | "license": "MIT",
5 | "description": "A full-featured Webpack setup with hot-reload, lint-on-save, unit testing & css extraction.",
6 | "scripts": {
7 | "docs": "cd docs && gitbook serve",
8 | "docs:deploy": "bash ./deploy-docs.sh"
9 | },
10 | "devDependencies": {
11 | "vue-cli": "^2.8.1"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/scenarios/README.md:
--------------------------------------------------------------------------------
1 | ## What is this folder?
2 |
3 | This folder contains test scenarios for the automated tests of the template on CircleCI.
4 |
5 | Each `.json`file contains an object that represents a set of answers to the questions that vue-cli asks the user when installing the template.
6 |
7 | With the code from `index.js`, we insert those answers into the metalsmith metadata and skip the inquirer questions, thus allowing us to run different test scenarios in CI without having to actually provide any answers to inquirer or to mock it.
8 |
9 | ## The scenarios
10 |
11 | We currently have 3 scenarios set up:
12 |
13 | 1. 'minimal': it basically answers "no" to ever choice, so no router, no eslint, no tests
14 | 2. 'full': It answers "yes" to every choice. With router, with linting (standard), with full tests (jest & e2e)
15 | 3. 'full-airbnb-karma': like 'full', but using airbnb eslint config instead of standard and karma instead of jest for unit tests.
16 |
17 | Other permutations might be worth testing to secure against edge cases, but this gives us a decent level of security over common combinations.
18 |
19 | ## How to use it?
20 |
21 | Choosing a scenario is done through setting an ENV variable named `VUE_TEMPL_TEST`.
22 |
23 | You can run a scenario yourself by running this in your terminal:
24 |
25 | ````
26 | VUE_TEMPL_TEST=minimal vue init webpack your-directory
27 | ```
28 |
--------------------------------------------------------------------------------
/scenarios/full-karma-airbnb.json:
--------------------------------------------------------------------------------
1 | {
2 | "noEscape": true,
3 | "name": "test",
4 | "description": "A Vue.js project",
5 | "author": "CircleCI",
6 | "build": "standalone",
7 | "router": false,
8 | "lint": true,
9 | "lintConfig": "airbnb",
10 | "unit": true,
11 | "runner": "karma",
12 | "e2e": true,
13 | "autoInstall": false
14 | }
15 |
--------------------------------------------------------------------------------
/scenarios/full.json:
--------------------------------------------------------------------------------
1 | {
2 | "noEscape": true,
3 | "name": "test",
4 | "description": "A Vue.js project",
5 | "author": "CircleCI",
6 | "build": "runtime",
7 | "router": false,
8 | "lint": true,
9 | "lintConfig": "standard",
10 | "unit": true,
11 | "runner": "jest",
12 | "e2e": true,
13 | "autoInstall": false
14 | }
15 |
--------------------------------------------------------------------------------
/scenarios/index.js:
--------------------------------------------------------------------------------
1 | const scenarios = [
2 | 'full',
3 | 'full-karma-airbnb',
4 | 'minimal'
5 | ]
6 |
7 | const index = scenarios.indexOf(process.env.VUE_TEMPL_TEST)
8 |
9 | const isTest = exports.isTest = index !== -1
10 |
11 | const scenario = isTest && require(`./${scenarios[index]}.json`)
12 |
13 | exports.addTestAnswers = (metalsmith, options, helpers) => {
14 | Object.assign(
15 | metalsmith.metadata(),
16 | { isNotTest: !isTest },
17 | isTest ? scenario : {}
18 | )
19 | }
--------------------------------------------------------------------------------
/scenarios/minimal.json:
--------------------------------------------------------------------------------
1 | {
2 | "noEscape": true,
3 | "name": "test-minimal",
4 | "description": "Testing the minimal template setup",
5 | "author": "CircleCI",
6 | "build": "standalone",
7 | "router": false,
8 | "lint": false,
9 | "lintConfig": "standard",
10 | "unit": false,
11 | "runner": "jest",
12 | "e2e": false,
13 | "autoInstall": false
14 | }
15 |
--------------------------------------------------------------------------------
/template/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7 | }
8 | }],
9 | "stage-2"
10 | ],
11 | "plugins": ["transform-vue-jsx", "transform-runtime"]{{#if_or unit e2e}},
12 | "env": {
13 | "test": {
14 | "presets": ["env", "stage-2"]{{#if_eq runner "karma"}},
15 | "plugins": ["transform-vue-jsx", "istanbul"]{{/if_eq}}{{#if_eq runner "jest"}},
16 | "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"]{{/if_eq}}
17 | }
18 | }{{/if_or}}
19 | }
20 |
--------------------------------------------------------------------------------
/template/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/template/.eslintignore:
--------------------------------------------------------------------------------
1 | /build/
2 | /config/
3 | /dist/
4 | /*.js
5 | {{#unit}}
6 | /test/unit/coverage/
7 | {{/unit}}
8 |
--------------------------------------------------------------------------------
/template/.eslintrc.js:
--------------------------------------------------------------------------------
1 | // https://eslint.org/docs/user-guide/configuring
2 |
3 | module.exports = {
4 | root: true,
5 | parserOptions: {
6 | parser: 'babel-eslint'
7 | },
8 | env: {
9 | browser: true,
10 | },
11 | {{#if_eq lintConfig "standard"}}
12 | extends: [
13 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
14 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
15 | 'plugin:vue/essential',
16 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md
17 | 'standard'
18 | ],
19 | {{/if_eq}}
20 | {{#if_eq lintConfig "airbnb"}}
21 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
22 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
23 | extends: ['plugin:vue/essential', 'airbnb-base'],
24 | {{/if_eq}}
25 | {{#if_eq lintConfig "none"}}
26 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
27 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
28 | extends: ['plugin:vue/essential'],
29 | {{/if_eq}}
30 | // required to lint *.vue files
31 | plugins: [
32 | 'vue'
33 | ],
34 | {{#if_eq lintConfig "airbnb"}}
35 | // check if imports actually resolve
36 | settings: {
37 | 'import/resolver': {
38 | webpack: {
39 | config: 'build/webpack.base.conf.js'
40 | }
41 | }
42 | },
43 | {{/if_eq}}
44 | // add your custom rules here
45 | rules: {
46 | {{#if_eq lintConfig "standard"}}
47 | // allow async-await
48 | 'generator-star-spacing': 'off',
49 | {{/if_eq}}
50 | {{#if_eq lintConfig "airbnb"}}
51 | // don't require .vue extension when importing
52 | 'import/extensions': ['error', 'always', {
53 | js: 'never',
54 | vue: 'never'
55 | }],
56 | // disallow reassignment of function parameters
57 | // disallow parameter object manipulation except for specific exclusions
58 | 'no-param-reassign': ['error', {
59 | props: true,
60 | ignorePropertyModificationsFor: [
61 | 'state', // for vuex state
62 | 'acc', // for reduce accumulators
63 | 'e' // for e.returnvalue
64 | ]
65 | }],
66 | // allow optionalDependencies
67 | 'import/no-extraneous-dependencies': ['error', {
68 | optionalDependencies: ['test/unit/index.js']
69 | }],
70 | {{/if_eq}}
71 | // allow debugger during development
72 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/template/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | /dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | {{#unit}}
8 | /test/unit/coverage/
9 | {{/unit}}
10 | {{#e2e}}
11 | /test/e2e/reports/
12 | selenium-debug.log
13 | {{/e2e}}
14 |
15 | # Editor directories and files
16 | .idea
17 | .vscode
18 | *.suo
19 | *.ntvs*
20 | *.njsproj
21 | *.sln
22 |
--------------------------------------------------------------------------------
/template/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {}
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/template/README.md:
--------------------------------------------------------------------------------
1 | # {{ name }}
2 |
3 | > {{ description }}
4 |
5 | ## Build Setup
6 |
7 | ``` bash
8 | # install dependencies
9 | npm install
10 |
11 | # serve with hot reload at localhost:8080
12 | npm run dev
13 |
14 | # build for production with minification
15 | npm run build
16 |
17 | # build for production and view the bundle analyzer report
18 | npm run build --report
19 | {{#unit}}
20 |
21 | # run unit tests
22 | npm run unit
23 | {{/unit}}
24 | {{#e2e}}
25 |
26 | # run e2e tests
27 | npm run e2e
28 | {{/e2e}}
29 | {{#if_or unit e2e}}
30 |
31 | # run all tests
32 | npm test
33 | {{/if_or}}
34 | ```
35 |
36 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
37 |
--------------------------------------------------------------------------------
/template/build/build.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | require('./check-versions')()
3 |
4 | process.env.NODE_ENV = 'production'
5 |
6 | const ora = require('ora')
7 | const rm = require('rimraf')
8 | const path = require('path')
9 | const chalk = require('chalk')
10 | const webpack = require('webpack')
11 | const config = require('../config')
12 | const webpackConfig = require('./webpack.prod.conf')
13 |
14 | const spinner = ora('building for production...')
15 | spinner.start()
16 |
17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
18 | if (err) throw err
19 | webpack(webpackConfig, (err, stats) => {
20 | spinner.stop()
21 | if (err) throw err
22 | process.stdout.write(stats.toString({
23 | colors: true,
24 | modules: false,
25 | children: false, // if you are using ts-loader, setting this to true will make typescript errors show up during build
26 | chunks: false,
27 | chunkModules: false
28 | }) + '\n\n')
29 |
30 | if (stats.hasErrors()) {
31 | console.log(chalk.red(' Build failed with errors.\n'))
32 | process.exit(1)
33 | }
34 |
35 | console.log(chalk.cyan(' Build complete.\n'))
36 | console.log(chalk.yellow(
37 | ' Tip: built files are meant to be served over an HTTP server.\n' +
38 | ' Opening index.html over file:// won\'t work.\n'
39 | ))
40 | })
41 | })
42 |
--------------------------------------------------------------------------------
/template/build/check-versions.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const chalk = require('chalk')
3 | const semver = require('semver')
4 | const packageConfig = require('../package.json')
5 | const shell = require('shelljs')
6 |
7 | function exec (cmd) {
8 | return require('child_process').execSync(cmd).toString().trim()
9 | }
10 |
11 | const versionRequirements = [
12 | {
13 | name: 'node',
14 | currentVersion: semver.clean(process.version),
15 | versionRequirement: packageConfig.engines.node
16 | }
17 | ]
18 |
19 | if (shell.which('npm')) {
20 | versionRequirements.push({
21 | name: 'npm',
22 | currentVersion: exec('npm --version'),
23 | versionRequirement: packageConfig.engines.npm
24 | })
25 | }
26 |
27 | module.exports = function () {
28 | const warnings = []
29 |
30 | for (let i = 0; i < versionRequirements.length; i++) {
31 | const mod = versionRequirements[i]
32 |
33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
34 | warnings.push(mod.name + ': ' +
35 | chalk.red(mod.currentVersion) + ' should be ' +
36 | chalk.green(mod.versionRequirement)
37 | )
38 | }
39 | }
40 |
41 | if (warnings.length) {
42 | console.log('')
43 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
44 | console.log()
45 |
46 | for (let i = 0; i < warnings.length; i++) {
47 | const warning = warnings[i]
48 | console.log(' ' + warning)
49 | }
50 |
51 | console.log()
52 | process.exit(1)
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/template/build/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-templates/webpack/298503082f1ff758ef8ec5dbf5f91f5d8bdd0333/template/build/logo.png
--------------------------------------------------------------------------------
/template/build/utils.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const config = require('../config')
4 | const ExtractTextPlugin = require('extract-text-webpack-plugin')
5 | const packageConfig = require('../package.json')
6 |
7 | exports.assetsPath = function (_path) {
8 | const assetsSubDirectory = process.env.NODE_ENV === 'production'
9 | ? config.build.assetsSubDirectory
10 | : config.dev.assetsSubDirectory
11 |
12 | return path.posix.join(assetsSubDirectory, _path)
13 | }
14 |
15 | exports.cssLoaders = function (options) {
16 | options = options || {}
17 |
18 | const cssLoader = {
19 | loader: 'css-loader',
20 | options: {
21 | sourceMap: options.sourceMap
22 | }
23 | }
24 |
25 | const postcssLoader = {
26 | loader: 'postcss-loader',
27 | options: {
28 | sourceMap: options.sourceMap
29 | }
30 | }
31 |
32 | // generate loader string to be used with extract text plugin
33 | function generateLoaders (loader, loaderOptions) {
34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
35 |
36 | if (loader) {
37 | loaders.push({
38 | loader: loader + '-loader',
39 | options: Object.assign({}, loaderOptions, {
40 | sourceMap: options.sourceMap
41 | })
42 | })
43 | }
44 |
45 | // Extract CSS when that option is specified
46 | // (which is the case during production build)
47 | if (options.extract) {
48 | return ExtractTextPlugin.extract({
49 | use: loaders,
50 | fallback: 'vue-style-loader'
51 | })
52 | } else {
53 | return ['vue-style-loader'].concat(loaders)
54 | }
55 | }
56 |
57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html
58 | return {
59 | css: generateLoaders(),
60 | postcss: generateLoaders(),
61 | less: generateLoaders('less'),
62 | sass: generateLoaders('sass', { indentedSyntax: true }),
63 | scss: generateLoaders('sass'),
64 | stylus: generateLoaders('stylus'),
65 | styl: generateLoaders('stylus')
66 | }
67 | }
68 |
69 | // Generate loaders for standalone style files (outside of .vue)
70 | exports.styleLoaders = function (options) {
71 | const output = []
72 | const loaders = exports.cssLoaders(options)
73 |
74 | for (const extension in loaders) {
75 | const loader = loaders[extension]
76 | output.push({
77 | test: new RegExp('\\.' + extension + '$'),
78 | use: loader
79 | })
80 | }
81 |
82 | return output
83 | }
84 |
85 | exports.createNotifierCallback = () => {
86 | const notifier = require('node-notifier')
87 |
88 | return (severity, errors) => {
89 | if (severity !== 'error') return
90 |
91 | const error = errors[0]
92 | const filename = error.file && error.file.split('!').pop()
93 |
94 | notifier.notify({
95 | title: packageConfig.name,
96 | message: severity + ': ' + error.name,
97 | subtitle: filename || '',
98 | icon: path.join(__dirname, 'logo.png')
99 | })
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/template/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const utils = require('./utils')
3 | const config = require('../config')
4 | const isProduction = process.env.NODE_ENV === 'production'
5 | const sourceMapEnabled = isProduction
6 | ? config.build.productionSourceMap
7 | : config.dev.cssSourceMap
8 |
9 | module.exports = {
10 | loaders: utils.cssLoaders({
11 | sourceMap: sourceMapEnabled,
12 | extract: isProduction
13 | }),
14 | cssSourceMap: sourceMapEnabled,
15 | cacheBusting: config.dev.cacheBusting,
16 | transformToRequire: {
17 | video: ['src', 'poster'],
18 | source: 'src',
19 | img: 'src',
20 | image: 'xlink:href'
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/template/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const utils = require('./utils')
4 | const config = require('../config')
5 | const vueLoaderConfig = require('./vue-loader.conf')
6 |
7 | function resolve (dir) {
8 | return path.join(__dirname, '..', dir)
9 | }
10 |
11 | {{#lint}}const createLintingRule = () => ({
12 | test: /\.(js|vue)$/,
13 | loader: 'eslint-loader',
14 | enforce: 'pre',
15 | include: [resolve('src'), resolve('test')],
16 | options: {
17 | formatter: require('eslint-friendly-formatter'),
18 | emitWarning: !config.dev.showEslintErrorsInOverlay
19 | }
20 | }){{/lint}}
21 |
22 | module.exports = {
23 | context: path.resolve(__dirname, '../'),
24 | entry: {
25 | app: './src/main.js'
26 | },
27 | output: {
28 | path: config.build.assetsRoot,
29 | filename: '[name].js',
30 | publicPath: process.env.NODE_ENV === 'production'
31 | ? config.build.assetsPublicPath
32 | : config.dev.assetsPublicPath
33 | },
34 | resolve: {
35 | extensions: ['.js', '.vue', '.json'],
36 | alias: {
37 | {{#if_eq build "standalone"}}
38 | 'vue$': 'vue/dist/vue.esm.js',
39 | {{/if_eq}}
40 | '@': resolve('src'),
41 | }
42 | },
43 | module: {
44 | rules: [
45 | {{#lint}}
46 | ...(config.dev.useEslint ? [createLintingRule()] : []),
47 | {{/lint}}
48 | {
49 | test: /\.vue$/,
50 | loader: 'vue-loader',
51 | options: vueLoaderConfig
52 | },
53 | {
54 | test: /\.js$/,
55 | loader: 'babel-loader',
56 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
57 | },
58 | {
59 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
60 | loader: 'url-loader',
61 | options: {
62 | limit: 10000,
63 | name: utils.assetsPath('img/[name].[hash:7].[ext]')
64 | }
65 | },
66 | {
67 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
68 | loader: 'url-loader',
69 | options: {
70 | limit: 10000,
71 | name: utils.assetsPath('media/[name].[hash:7].[ext]')
72 | }
73 | },
74 | {
75 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
76 | loader: 'url-loader',
77 | options: {
78 | limit: 10000,
79 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
80 | }
81 | }
82 | ]
83 | },
84 | node: {
85 | // prevent webpack from injecting useless setImmediate polyfill because Vue
86 | // source contains it (although only uses it if it's native).
87 | setImmediate: false,
88 | // prevent webpack from injecting mocks to Node native modules
89 | // that does not make sense for the client
90 | dgram: 'empty',
91 | fs: 'empty',
92 | net: 'empty',
93 | tls: 'empty',
94 | child_process: 'empty'
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/template/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const utils = require('./utils')
3 | const webpack = require('webpack')
4 | const config = require('../config')
5 | const merge = require('webpack-merge')
6 | const path = require('path')
7 | const baseWebpackConfig = require('./webpack.base.conf')
8 | const CopyWebpackPlugin = require('copy-webpack-plugin')
9 | const HtmlWebpackPlugin = require('html-webpack-plugin')
10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
11 | const portfinder = require('portfinder')
12 |
13 | const HOST = process.env.HOST
14 | const PORT = process.env.PORT && Number(process.env.PORT)
15 |
16 | const devWebpackConfig = merge(baseWebpackConfig, {
17 | module: {
18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
19 | },
20 | // cheap-module-eval-source-map is faster for development
21 | devtool: config.dev.devtool,
22 |
23 | // these devServer options should be customized in /config/index.js
24 | devServer: {
25 | clientLogLevel: 'warning',
26 | historyApiFallback: {
27 | rewrites: [
28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
29 | ],
30 | },
31 | hot: true,
32 | contentBase: false, // since we use CopyWebpackPlugin.
33 | compress: true,
34 | host: HOST || config.dev.host,
35 | port: PORT || config.dev.port,
36 | open: config.dev.autoOpenBrowser,
37 | overlay: config.dev.errorOverlay
38 | ? { warnings: false, errors: true }
39 | : false,
40 | publicPath: config.dev.assetsPublicPath,
41 | proxy: config.dev.proxyTable,
42 | quiet: true, // necessary for FriendlyErrorsPlugin
43 | watchOptions: {
44 | poll: config.dev.poll,
45 | }
46 | },
47 | plugins: [
48 | new webpack.DefinePlugin({
49 | 'process.env': require('../config/dev.env')
50 | }),
51 | new webpack.HotModuleReplacementPlugin(),
52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
53 | new webpack.NoEmitOnErrorsPlugin(),
54 | // https://github.com/ampedandwired/html-webpack-plugin
55 | new HtmlWebpackPlugin({
56 | filename: 'index.html',
57 | template: 'index.html',
58 | inject: true
59 | }),
60 | // copy custom static assets
61 | new CopyWebpackPlugin([
62 | {
63 | from: path.resolve(__dirname, '../static'),
64 | to: config.dev.assetsSubDirectory,
65 | ignore: ['.*']
66 | }
67 | ])
68 | ]
69 | })
70 |
71 | module.exports = new Promise((resolve, reject) => {
72 | portfinder.basePort = process.env.PORT || config.dev.port
73 | portfinder.getPort((err, port) => {
74 | if (err) {
75 | reject(err)
76 | } else {
77 | // publish the new Port, necessary for e2e tests
78 | process.env.PORT = port
79 | // add port to devServer config
80 | devWebpackConfig.devServer.port = port
81 |
82 | // Add FriendlyErrorsPlugin
83 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
84 | compilationSuccessInfo: {
85 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
86 | },
87 | onErrors: config.dev.notifyOnErrors
88 | ? utils.createNotifierCallback()
89 | : undefined
90 | }))
91 |
92 | resolve(devWebpackConfig)
93 | }
94 | })
95 | })
96 |
--------------------------------------------------------------------------------
/template/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const utils = require('./utils')
4 | const webpack = require('webpack')
5 | const config = require('../config')
6 | const merge = require('webpack-merge')
7 | const baseWebpackConfig = require('./webpack.base.conf')
8 | const CopyWebpackPlugin = require('copy-webpack-plugin')
9 | const HtmlWebpackPlugin = require('html-webpack-plugin')
10 | const ExtractTextPlugin = require('extract-text-webpack-plugin')
11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
13 |
14 | const env = {{#if_or unit e2e}}process.env.NODE_ENV === 'testing'
15 | ? require('../config/test.env')
16 | : {{/if_or}}require('../config/prod.env')
17 |
18 | const webpackConfig = merge(baseWebpackConfig, {
19 | module: {
20 | rules: utils.styleLoaders({
21 | sourceMap: config.build.productionSourceMap,
22 | extract: true,
23 | usePostCSS: true
24 | })
25 | },
26 | devtool: config.build.productionSourceMap ? config.build.devtool : false,
27 | output: {
28 | path: config.build.assetsRoot,
29 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
30 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
31 | },
32 | plugins: [
33 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
34 | new webpack.DefinePlugin({
35 | 'process.env': env
36 | }),
37 | new UglifyJsPlugin({
38 | uglifyOptions: {
39 | compress: {
40 | warnings: false
41 | }
42 | },
43 | sourceMap: config.build.productionSourceMap,
44 | parallel: true
45 | }),
46 | // extract css into its own file
47 | new ExtractTextPlugin({
48 | filename: utils.assetsPath('css/[name].[contenthash].css'),
49 | // Setting the following option to `false` will not extract CSS from codesplit chunks.
50 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
51 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
52 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
53 | allChunks: true,
54 | }),
55 | // Compress extracted CSS. We are using this plugin so that possible
56 | // duplicated CSS from different components can be deduped.
57 | new OptimizeCSSPlugin({
58 | cssProcessorOptions: config.build.productionSourceMap
59 | ? { safe: true, map: { inline: false } }
60 | : { safe: true }
61 | }),
62 | // generate dist index.html with correct asset hash for caching.
63 | // you can customize output by editing /index.html
64 | // see https://github.com/ampedandwired/html-webpack-plugin
65 | new HtmlWebpackPlugin({
66 | filename: {{#if_or unit e2e}}process.env.NODE_ENV === 'testing'
67 | ? 'index.html'
68 | : {{/if_or}}config.build.index,
69 | template: 'index.html',
70 | inject: true,
71 | minify: {
72 | removeComments: true,
73 | collapseWhitespace: true,
74 | removeAttributeQuotes: true
75 | // more options:
76 | // https://github.com/kangax/html-minifier#options-quick-reference
77 | },
78 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
79 | chunksSortMode: 'dependency'
80 | }),
81 | // keep module.id stable when vendor modules does not change
82 | new webpack.HashedModuleIdsPlugin(),
83 | // enable scope hoisting
84 | new webpack.optimize.ModuleConcatenationPlugin(),
85 | // split vendor js into its own file
86 | new webpack.optimize.CommonsChunkPlugin({
87 | name: 'vendor',
88 | minChunks (module) {
89 | // any required modules inside node_modules are extracted to vendor
90 | return (
91 | module.resource &&
92 | /\.js$/.test(module.resource) &&
93 | module.resource.indexOf(
94 | path.join(__dirname, '../node_modules')
95 | ) === 0
96 | )
97 | }
98 | }),
99 | // extract webpack runtime and module manifest to its own file in order to
100 | // prevent vendor hash from being updated whenever app bundle is updated
101 | new webpack.optimize.CommonsChunkPlugin({
102 | name: 'manifest',
103 | minChunks: Infinity
104 | }),
105 | // This instance extracts shared chunks from code splitted chunks and bundles them
106 | // in a separate chunk, similar to the vendor chunk
107 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
108 | new webpack.optimize.CommonsChunkPlugin({
109 | name: 'app',
110 | async: 'vendor-async',
111 | children: true,
112 | minChunks: 3
113 | }),
114 |
115 | // copy custom static assets
116 | new CopyWebpackPlugin([
117 | {
118 | from: path.resolve(__dirname, '../static'),
119 | to: config.build.assetsSubDirectory,
120 | ignore: ['.*']
121 | }
122 | ])
123 | ]
124 | })
125 |
126 | if (config.build.productionGzip) {
127 | const CompressionWebpackPlugin = require('compression-webpack-plugin')
128 |
129 | webpackConfig.plugins.push(
130 | new CompressionWebpackPlugin({
131 | asset: '[path].gz[query]',
132 | algorithm: 'gzip',
133 | test: new RegExp(
134 | '\\.(' +
135 | config.build.productionGzipExtensions.join('|') +
136 | ')$'
137 | ),
138 | threshold: 10240,
139 | minRatio: 0.8
140 | })
141 | )
142 | }
143 |
144 | if (config.build.bundleAnalyzerReport) {
145 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
146 | webpackConfig.plugins.push(new BundleAnalyzerPlugin())
147 | }
148 |
149 | module.exports = webpackConfig
150 |
--------------------------------------------------------------------------------
/template/build/webpack.test.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | // This is the webpack config used for unit tests.
3 |
4 | const utils = require('./utils')
5 | const webpack = require('webpack')
6 | const merge = require('webpack-merge')
7 | const baseWebpackConfig = require('./webpack.base.conf')
8 |
9 | const webpackConfig = merge(baseWebpackConfig, {
10 | // use inline sourcemap for karma-sourcemap-loader
11 | module: {
12 | rules: utils.styleLoaders()
13 | },
14 | devtool: '#inline-source-map',
15 | resolveLoader: {
16 | alias: {
17 | // necessary to to make lang="scss" work in test when using vue-loader's ?inject option
18 | // see discussion at https://github.com/vuejs/vue-loader/issues/724
19 | 'scss-loader': 'sass-loader'
20 | }
21 | },
22 | plugins: [
23 | new webpack.DefinePlugin({
24 | 'process.env': require('../config/test.env')
25 | })
26 | ]
27 | })
28 |
29 | // no need for app entry during tests
30 | delete webpackConfig.entry
31 |
32 | module.exports = webpackConfig
33 |
--------------------------------------------------------------------------------
/template/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"'
7 | })
8 |
--------------------------------------------------------------------------------
/template/config/index.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | // Template version: {{ template_version }}
3 | // see http://vuejs-templates.github.io/webpack for documentation.
4 |
5 | const path = require('path')
6 |
7 | module.exports = {
8 | dev: {
9 |
10 | // Paths
11 | assetsSubDirectory: 'static',
12 | assetsPublicPath: '/',
13 | proxyTable: {},
14 |
15 | // Various Dev Server settings
16 | host: 'localhost', // can be overwritten by process.env.HOST
17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
18 | autoOpenBrowser: false,
19 | errorOverlay: true,
20 | notifyOnErrors: true,
21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
22 |
23 | {{#lint}}// Use Eslint Loader?
24 | // If true, your code will be linted during bundling and
25 | // linting errors and warnings will be shown in the console.
26 | useEslint: true,
27 | // If true, eslint errors and warnings will also be shown in the error overlay
28 | // in the browser.
29 | showEslintErrorsInOverlay: false,
30 | {{/lint}}
31 |
32 | /**
33 | * Source Maps
34 | */
35 |
36 | // https://webpack.js.org/configuration/devtool/#development
37 | devtool: 'cheap-module-eval-source-map',
38 |
39 | // If you have problems debugging vue-files in devtools,
40 | // set this to false - it *may* help
41 | // https://vue-loader.vuejs.org/en/options.html#cachebusting
42 | cacheBusting: true,
43 |
44 | cssSourceMap: true
45 | },
46 |
47 | build: {
48 | // Template for index.html
49 | index: path.resolve(__dirname, '../dist/index.html'),
50 |
51 | // Paths
52 | assetsRoot: path.resolve(__dirname, '../dist'),
53 | assetsSubDirectory: 'static',
54 | assetsPublicPath: '/',
55 |
56 | /**
57 | * Source Maps
58 | */
59 |
60 | productionSourceMap: true,
61 | // https://webpack.js.org/configuration/devtool/#production
62 | devtool: '#source-map',
63 |
64 | // Gzip off by default as many popular static hosts such as
65 | // Surge or Netlify already gzip all static assets for you.
66 | // Before setting to `true`, make sure to:
67 | // npm install --save-dev compression-webpack-plugin
68 | productionGzip: false,
69 | productionGzipExtensions: ['js', 'css'],
70 |
71 | // Run the build command with an extra argument to
72 | // View the bundle analyzer report after build finishes:
73 | // `npm run build --report`
74 | // Set to `true` or `false` to always turn it on or off
75 | bundleAnalyzerReport: process.env.npm_config_report
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/template/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/template/config/test.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const devEnv = require('./dev.env')
4 |
5 | module.exports = merge(devEnv, {
6 | NODE_ENV: '"testing"'
7 | })
8 |
--------------------------------------------------------------------------------
/template/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |