diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..e5b53e7 --- /dev/null +++ b/.npmignore @@ -0,0 +1,26 @@ +test +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Deployed apps should consider commenting this line out: +# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git +node_modules \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 5b7815d..342de8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ language: node_js node_js: - - "5.0" - - "4.0" - - "0.12" - - "0.11" - - "0.10" + - "8" + - "7" + - "6" + - "5" + - "4" after_success: - npm run coveralls \ No newline at end of file diff --git a/README.md b/README.md index 2668765..a1f95e5 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,12 @@ check-source-formatting ### Jump to Section - [Description](#description) +- [What's new](#whats-new) - [Installation](#installation) - [Usage](#usage) - [Options](#options) - [Sublime Text Integration](#sublime-text-integration) +- [Custom configuration](#custom-configuration) - [Known issues](#known-issues) @@ -54,6 +56,19 @@ This will scan through HTML(-like) files, JS files, and CSS files and detect man - Variable names starting with `is` (it ignores methods, which is valid, but properties and variables should not have a prefix of `is`) - **Experimental** Will try to parse JavaScript inside of blocks +## What's new +As of v2, there are a few new features: + +- [Custom configuration](#custom-configuration) +- Custom configuration on a per file basis or using globs +- New, [shorter command](#v2-deprecation-notice): `csf` +- Now able to check on both ES6+ and JSX syntaxes +- Uses stylelint for CSS checking, which should reduce false positives +- Now requires Node 4+ + +### API Changes +For any consumers of the API, there was previously no way to know when the CLI object had finished reading the files and reporting the errors, whereas now, `cli.init()` returns a promise so you can run anything you want to after everything has been processed. + ## Installation ``` @@ -62,33 +77,39 @@ This will scan through HTML(-like) files, JS files, and CSS files and detect man ## Usage +### V2 Deprecation notice: +> The `check_sf` command is now deprecated in favor of the new `csf` command. +> They're identical (though `check_sf` will periodically warn you that it's deprecated), but `check_sf` will be removed in the next major version. + The simplest way to run it is: ``` -check_sf path/to/file +csf path/to/file ``` However, you can also check multiple files at once: ``` -find . -name '*.css' | xargs check_sf +find . -name '*.css' | xargs csf ``` I find it easier to use it with pull requests and check the files that were changed on the branch. In my .gitconfig I have: ``` -sfm = "!f() { git diff --stat --name-only master.. | grep -E '.(jsp.?|vm|ftl|tag|tpl|tmpl|js|soy|hbs|(s)?css)$' | tr \"\\n\" \"\\0\" | xargs -0 -J{} check_sf {} $@; }; f" +sfm = "!f() { git diff --stat --name-only master.. | tr \"\\n\" \"\\0\" | xargs -0 -J{} csf {} $@; }; f" ``` -(You could get rid of the grep portion, but I find it easier to just filter them out on this level). - When someone sends me a pull request, I check out the branch and run `git sfm` and it scans the changed files and reports any issues. ## Options There are some options that you can pass to the command: +`--config` If you pass this flag with a path to a configuration file, it will use that one instead of looking up one. + +If you pass `--no-config`, it will disable any custom configuration look ups, and only use the defaults. + `-q, --quiet` will set it so that it only shows files that have errors. By default it will log out all files and report 'clear' if there are no errors. `-o, --open` If you have an editor specified in your gitconfig (under user.editor), this will open all of the files that have errors in your editor. @@ -112,7 +133,7 @@ If you pass `--no-lint` it will overwrite the default and disable linting. This is mainly useful when you want to show the file name relative to your current working directory. I use it mainly when I'm running this on a git branch. In order for it to work from your alias, you would need to change the above alias to be: ``` -sfm = "!f() { export GIT_PWD=\"$GIT_PREFIX\"; git diff --stat --name-only master.. | grep -E '.(jsp.?|vm|ftl|tag|tpl|tmpl|js|(s)?css)$' | xargs check_sf $@; }; f" +sfm = "!f() { export GIT_PWD=\"$GIT_PREFIX\"; git diff --stat --name-only master.. | tr \"\\n\" \"\\0\" | xargs csf $@; }; f" ``` `-v, --verbose` This will log out any possible error, even ones that are probably a false positive. @@ -128,7 +149,7 @@ However, passing -v will show these errors (marked with a **). If you pass `--no-color` it will overwrite the default and give you plain text. -`--lint-ids` Previously, all errors that were generated by ESLint included their rule ID in the error message. This is no longer true by default (as it adds a lot of noise), but you can turn it on by adding this option. +`--lint-ids` Previously, all errors that were generated by ESLint or stylelint included their rule ID in the error message. This is no longer true by default (as it adds a lot of noise), but you can turn it on by adding this option. `-m`, `--check-metadata` If we're inside of a portal repository, and one of the files is in the /html/js/liferay/ directory, check all of the modules in that directory, and see if the requires metadata in the files matches the metadata in the modules.js file. @@ -142,11 +163,12 @@ There are now two ways you can integrate this module with Sublime Text: ### As a build system You can setup a build system in Sublime Text to run the formatter on the file you are working in, and this is the simplest of the options. You can set up your build system using the following steps: + - Go to the menu labeled Tools > Build System > New Build System -- Use the following code for the new build system and save the file +- Use the following code for the new build system and save the file
``` { - "shell_cmd": "check_sf $file" + "shell_cmd": "csf $file" } ``` - Go to Tools > Build System and select the system you created @@ -159,6 +181,7 @@ You can also use [Sublime Linter](http://www.sublimelinter.com/en/latest/) to vi [![Sublime Linter](/../screenshots/images/sublime_linter.png?raw=true "Sublime Linter")](https://packagecontrol.io/packages/SublimeLinter-contrib-check-source-formatting) You can install it via a couple of steps: + - Install [Sublime Linter](http://www.sublimelinter.com/en/latest/) via Package Control - Install the [SublimeLinter-contrib-check-source-formatting](https://packagecontrol.io/packages/SublimeLinter-contrib-check-source-formatting) package via Package Control - In order to get it to lint, you may need to either manually lint it (in the Command Palette, type "Lint this view" and select it), or you may wish to change when it lints (in the Command Palette again, type "Choose Lint Mode", and select when you want it to lint the file). @@ -166,6 +189,133 @@ You can install it via a couple of steps: You can read more on [the project page](https://packagecontrol.io/packages/SublimeLinter-contrib-check-source-formatting). Thanks to [Drew Brokke](https://github.com/drewbrokke) for writing the plugin and publishing it. +### As an Atom Linter plugin + +- Install [liferay-linter](https://atom.io/packages/linter-liferay) via `apm install linter linter-liferay` + +You can read more on [the github page](https://github.com/mthadley/linter-liferay). +Thanks to [Michael Hadley](https://github.com/mthadley) for writing the plugin and publishing it. + +## Custom configuration +Starting in version 2, you can now customize the configuration of the engine in a few different ways. +Here are the items you can currently customize: + + - ESLint rules + - stylelint rules + +I'm planning on expanding this into more areas, but currently those are the two sections that can be modified. + +How do you define a custom configuration? + +We are currently using [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) to look for configuration files, which means you can define custom configuration by adding any one of the following files somewhere in the current working directory or one of the parent directories: + +- Inside of `package.json`, using a custom key of `csfConfig` +- `csf.config.js` +- `.csfrc` in JSON or YAML format + +What does the structure of the configuration look like? + +Let's say we create a `.csf.config.js` file, our configuration, at the very least, should export a JSON object like so: + +``` + module.exports = {}; +``` + +Here is an example of a config with all keys defined: + +``` + module.exports = { + css: { + lint: {} + }, + js: { + lint: {} + }, + html: { + css: { + lint: {} + }, + js: { + lint: {} + } + }, + 'path:**/*.something.js': { + js: { + lint: {} + } + } + }; +``` + +(please note, if using one of the JSON files, you'll need to quote the Object keys, however, there are some benefits to using a plain JS file, which I'll mention below). + +And here are the descriptions of what they do: + +- `css.lint` - These accept any option that can be passed to [stylelint](https://stylelint.io/user-guide/configuration/#rules), which is really just the rule configuration.
+This means anywhere the lint object is called, you can set the rules. +- `lint` - These accept any option that can be passed to [ESLint](http://eslint.org/docs/user-guide/configuring), you can set here. This includes any environment or globals you wish to define, rules you wish to define, etc.
+This means anywhere the lint object is called, you can set the rules.
+The `html.css.lint` property is only applied for style blocks inside of HTML-like files that go through the HTML formatter. This property is merged on top of anything specified in `css.lint`.
+The `html.js.lint` property is only applied for script blocks inside of HTML-like files that go through the HTML formatter. This property is merged on top of anything specified in `js.lint`. + +You'll also notice that a key there of `path:**/*.something.js`. This allows you to specify a configuration to a specific file path, or a glob referencing a file path.
+Any files matching that glob will apply those rules on top of the ones inside of `css.lint`, `js.lint`, `html.css.lint`, and `html.js.lint`. + +#### Benefits to using `.js` over `.json`? +As I mentioned before, there are some benefits to using a `.js` file, but mainly is that it's less strict about what can go inside of the file, so you can use comments, and unquoted keys. +But also, any configuration you define with a function as the value, that function will be executed, and anything you return from there will be used as the value. +This means you can dynamically configure the script at runtime. + +### Using ESlint plugins +You can configure ESLint to leverage specific plugins for your project. +The way you would do this is slightly hokey, but it's because ESLint only looks for plugins next to where eslint itself is installed. Because of this limitation, we need a path to the plugin you wish to use. + +Here's how you would set it up to use, let's say the [Lodash eslint plugin](https://www.npmjs.com/package/eslint-plugin-lodash): + +1. In your project, run the following command:
+``` + npm install --save-dev eslint-plugin-lodash +``` +2. In your configuration file, add the following: +``` +{ + "js": { + "lint": { + "plugins": ["./node_modules/eslint-plugin-lodash"] + } + } +} +``` +3. Then, in the same block, you can configure any rules from the plugin by adding a `rules` object, and configuring it like so: +``` +{ + "js": { + "lint": { + "plugins": ["./node_modules/eslint-plugin-lodash"], + "rules": { + "lodash/prefer-noop": 2 + } + } + } +} +``` + +Right now, it's not possible to use stylelint plugins, but I'll be adding support for that soon. +You can still, however, configure the rules included with stylelint. + +### JSX and ES6/7 +We include the [eslint-plugin-react](https://www.npmjs.com/package/eslint-plugin-react) by default, but we only turn it on for projects that are using JSX syntax (whether it's React or [MetalJS](http://metaljs.com)), but you need to explicitly opt into ES6 or above in your configuration. +We currently handle es7 code, but we don't enable any of the future focused rules such as [prefer-template](http://eslint.org/docs/rules/prefer-template), unless you set your lint.parserOptions.ecmaVersion to 7 in your config file. +This is how you would do it: +``` + "lint": { + "parserOptions": { + "ecmaVersion": 7 + } + } +``` +Once you have that set, it will enable the react plugin rules for JSX syntax checking, and for upgrading your code to more future focused syntax. + ## Known issues The following are known issues where it will say there's an error, but there's not (or where there should be an error but there's not) diff --git a/bin/index.js b/bin/index.js index dac419c..d05bf39 100755 --- a/bin/index.js +++ b/bin/index.js @@ -1,15 +1,39 @@ -#!/usr/bin/env node +#!/bin/sh +":" //# http://sambal.org/?p=1014 ; exec /usr/bin/env node --harmony "$0" "$@" +var ConfigStore = require('configstore'); var updateNotifier = require('update-notifier'); -var notifier = updateNotifier( - { - pkg: require('../package.json') - } -); +var deprecationCheck = require('../lib/deprecation'); + +var pkg = require('../package.json'); + +var notifier = updateNotifier({pkg}); if (notifier.update) { notifier.notify(); } -require('../lib/cli').init(); \ No newline at end of file +var config = new ConfigStore( + pkg.name, + { + lastPackageVersion: pkg.version, + lastUpdateCheck: Date.now() + } +); + +var cli = require('../lib/cli').init().then( + function() { + var deprecated = deprecationCheck( + { + config, + pkg, + scriptName: process.argv[1] + } + ); + + if (deprecated) { + console.log(deprecated); + } + } +); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 9c4d5aa..c2146ea 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,38 +1,57 @@ +require('harmonize')(); + +var _ = require('lodash'); var gulp = require('gulp'); var plugins = require('gulp-load-plugins')(); var runSequence = require('run-sequence'); +var inquirer = require('inquirer'); -gulp.task('coveralls', function () { +gulp.task('coveralls', () => { gulp.src('coverage/**/lcov.info') .pipe(plugins.coveralls()); }); -gulp.task('test', function(done) { - return runSequence('test-unit', done); -}); +gulp.task('test', done => runSequence('test-unit', done)); + +gulp.task('test-complexity', () => gulp.src(['lib/**/*.js']) + .pipe(plugins.complexity({ + cyclomatic: [4, 7, 12], + halstead: [15, 15, 20] + }))); + +gulp.task('test-file', () => { + var file = process.argv.slice(3).pop(); + + if (file) { + file = file.slice(2); + file = !_.startsWith(file, 'test/') ? `test/${file}` : file; + file = !_.endsWith(file, '.js') ? `${file}.js` : file; -gulp.task('test-complexity', function() { - return gulp.src(['lib/**/*.js']) - .pipe(plugins.complexity({ - cyclomatic: [4, 7, 12], - halstead: [15, 15, 20] - })); + file = [file]; + } + else { + file = ['test/**/*.js', '!test/fixture/*.js']; + } + + process.argv.push('--display-raw'); + + return gulp.src(file) + // .pipe(plugins.debug()) + .pipe(plugins.mocha()); }); -gulp.task('test-unit', function() { +gulp.task('test-unit', () => { process.argv.push('--display-raw'); return gulp.src(['test/**/*.js', '!test/fixture/*.js']) .pipe(plugins.mocha()); }); -gulp.task('test-cover', function() { - return gulp.src(['lib/**/*.js']) - .pipe(plugins.istanbul()) - .pipe(plugins.istanbul.hookRequire()); -}); +gulp.task('test-cover', () => gulp.src(['lib/**/*.js']) + .pipe(plugins.istanbul()) + .pipe(plugins.istanbul.hookRequire())); -gulp.task('test-coverage', ['test-cover'], function() { +gulp.task('test-coverage', ['test-cover'], () => { process.argv.push('--display-raw'); return gulp.src(['test/**/*.js', '!test/fixture/*.js']) @@ -40,7 +59,7 @@ gulp.task('test-coverage', ['test-cover'], function() { .pipe(plugins.istanbul.writeReports()); }); -gulp.task('toc', function(done) { +gulp.task('toc', done => { gulp.src('./README.md') .pipe( plugins.doctoc( @@ -51,4 +70,62 @@ gulp.task('toc', function(done) { ) ) .pipe(gulp.dest('./')); -}); \ No newline at end of file +}); + +gulp.task( + 'new-rule', + done => { + inquirer.prompt( + [ + { + type: 'list', + choices: ['ESLint'/*, 'Stylelint'*/], + message: 'What kind of linting rule do you wish to create?', + name: 'type' + }, + { + type: 'input', + default: 'my-new-rule', + filter: _.snakeCase, + message: 'What do you want to name it?', + name: 'name' + }, + { + type: 'input', + default: 'Checks for this issue.', + message: 'Type a short description', + name: 'description' + } + ] + ) + .then( + res => { + var srcDir = 'js'; + var destDir = 'lint_js_rules'; + + if (res.type !== 'ESLint') { + srcDir = 'css'; + destDir = 'lint_css_rules'; + } + + gulp.src(`./lib/tpl/lint_rules/${srcDir}/*.js`) + // .pipe(plugins.debug()) + .pipe( + plugins.rename( + path => { + var baseDir = path.basename === 'rule' ? 'lib' : 'test'; + + path.dirname = `./${baseDir}/lint_${srcDir}_rules`; + + path.basename = res.name; + } + ) + ) + .pipe(plugins.template(res)) + .pipe(gulp.dest('./')); + + done(); + } + ); + } +); \ No newline at end of file diff --git a/lib/argv.js b/lib/argv.js index 0debb54..bb1867b 100644 --- a/lib/argv.js +++ b/lib/argv.js @@ -1,80 +1,86 @@ var optimist = require('optimist') - .usage('Usage: $0 -qo') - .options( - { - 'display-raw': { - boolean: true, - default: false - }, - f: { - alias: 'force', - boolean: true, - default: false - }, - filenames: { - boolean: true, - default: false - }, - h: { - alias: 'help', - boolean: true, - default: false - }, - i: { - alias: 'inline-edit', - boolean: true, - default: false - }, - l: { - alias: 'lint', - boolean: true, - default: true - }, - 'lint-ids': { - boolean: true, - default: false - }, - m: { - alias: 'check-metadata', - boolean: true, - default: false - }, - o: { - alias: 'open', - boolean: true, - default: false - }, - q: { - alias: 'quiet', - boolean: true, - default: false - }, - r: { - alias: 'relative', - boolean: true, - default: false - }, - 'show-columns': { - boolean: true, - default: false - }, - v: { - alias: 'verbose', - boolean: true, - default: false - }, - V: { - alias: 'version', - boolean: true, - default: false - } - } - ); +.usage('Usage: $0 -qo') +.options( + { + config: { + default: true, + string: true + }, + 'display-raw': { + boolean: true, + default: false + }, + f: { + alias: 'force', + boolean: true, + default: false + }, + filenames: { + boolean: true, + default: false + }, + h: { + alias: 'help', + boolean: true, + default: false + }, + i: { + alias: 'inline-edit', + boolean: true, + default: false + }, + l: { + alias: 'lint', + boolean: true, + default: true + }, + 'lint-ids': { + boolean: true, + default: false + }, + m: { + alias: 'check-metadata', + boolean: true, + default: false + }, + o: { + alias: 'open', + boolean: true, + default: false + }, + q: { + alias: 'quiet', + boolean: true, + default: false + }, + r: { + alias: 'relative', + boolean: true, + default: false + }, + 'show-columns': { + boolean: true, + default: false + }, + v: { + alias: 'verbose', + boolean: true, + default: false + }, + V: { + alias: 'version', + boolean: true, + default: false + } + } +); var argv = optimist.argv; /* istanbul ignore next */ if (argv.h || argv.V) { + /* eslint-disable */ + if (argv.h) { optimist.showHelp(); } diff --git a/lib/base.js b/lib/base.js index 8c20774..c0df11b 100644 --- a/lib/base.js +++ b/lib/base.js @@ -5,7 +5,7 @@ require('lodash-bindright')(_); var REGEX_NEWLINE = /\r?\n/; -var iterateLines = function(contents, iterator) { +var iterateLines = (contents, iterator) => { var lines = contents.split(REGEX_NEWLINE); return lines.map(iterator).join('\n'); @@ -20,18 +20,17 @@ var jspLintStubs = { var stubs = _.transform( jspLintStubs, - function(result, item, index) { + (result, item, index) => { result[item] = true; }, {} ); module.exports = { - CWD: process.env.GIT_PWD || process.cwd(), INDENT: ' ', - REGEX_NEWLINE: REGEX_NEWLINE, + REGEX_NEWLINE, - iterateLines: iterateLines, - jspLintStubs: jspLintStubs, - stubs: stubs + iterateLines, + jspLintStubs, + stubs }; \ No newline at end of file diff --git a/lib/cli.js b/lib/cli.js index 2783baf..14dc60d 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -1,20 +1,25 @@ -var async = require('async'); +'use strict'; + var cli = require('cli'); -var fs = require('fs'); +var Promise = require('bluebird'); + +var fs = Promise.promisifyAll(require('fs')); var path = require('path'); var util = require('util'); var _ = require('lodash'); var argv = require('./argv'); -var base = require('./base'); + var colors = require('cli-color-keywords')(); var junit = require('./junit'); -var re = require('./re'); +var Config = require('./config'); var File = require('./file'); var Formatter = require('./formatter'); +var EventEmitter = require('drip').EnhancedEmitter; + var Logger = require('./logger'); var MAP_OMIT = { @@ -24,7 +29,7 @@ var MAP_OMIT = { var flags = _.reduce( argv, - function(res, item, index) { + (res, item, index) => { if (index.length > 1 && !MAP_OMIT[index]) { index = _.camelCase(index); @@ -36,87 +41,119 @@ var flags = _.reduce( {} ); -var CLI = function(config) { - config = config || {}; +var filterFileErrors = errors => _.reject(errors, ['type', 'ignored']); - this.flags = config.flags || flags; +class CLI extends EventEmitter { + constructor(config) { + super(); - this._args = config.args || argv._; - this._cwd = config.cwd || base.CWD; - this._async = config.async || async; - this._exec = config.exec || cli.exec.bind(cli); - this.junit = config.junit || junit; - this._log = config.log || console.log.bind(console); - this._logger = config.logger || Logger; - this._read = config.read || fs.readFile.bind(fs); - this._write = config.write || fs.writeFile.bind(fs); -}; + config = config || {}; + + this._configs = {}; + this._configFiles = {}; -CLI.prototype = { - constructor: CLI, + this.flags = _.defaults(config.flags, flags); - init: function() { + this._args = config.args || argv._; + this._cwd = config.cwd || process.cwd(); + this._exec = config.exec || cli.exec.bind(cli); + this.junit = config.junit || junit; + this._log = config.log || console.log.bind(console); + this._logger = config.logger || Logger; + this._read = config.read || fs.readFileAsync.bind(fs); + this._write = config.write || fs.writeFileAsync.bind(fs); + } + + init() { var instance = this; - var series = instance._args.map( - function(file) { - return instance.processFile.bind(instance, file); + this._config = new Config.Loader( + { + cwd: instance._cwd } ); - series.push(instance.checkMeta.bind(instance)); + return this._loadConfigs().then( + configs => { + instance._configs = configs; + + return configs; + } + ) + .bind(instance) + .then(instance._start); + } + + afterFormat(results) { + var instance = this; + + var series = []; - var flags = instance.flags; + if (instance.flags.inlineEdit) { + series = Promise.reduce( + results, + (prev, item, index) => { + if (item && !item.err && item.contents !== item.data) { + prev.push(instance.writeFile(item.file, item.contents)); + } - if (flags.junit) { - series.push(instance.createReport.bind(instance)); + return prev; + }, + series + ); } - instance._async.series(series, instance.onFinish.bind(instance)); - }, + return Promise.all(series) + .then(instance.onFinish.bind(instance)) + .catch(instance.logGeneralError.bind(instance)); + } - checkMeta: function(done) { + checkMeta(results) { if (this._CHECK_META) { require(this._metaCheckerPath).check( { - done: done, liferayModuleDir: this._liferayModuleDir } ); } - else { - done(); - } - }, - createReport: function(done) { - var instance = this; + return results; + } - var junit = new this.junit( - { - flags: this.flags, - logger: this._logger - } - ); + createReport(results) { + if (this.flags.junit) { + var junit = new this.junit( + { + flags: this.flags, + logger: this._logger + } + ); - junit.generate(done); - }, + results = junit.generate().return(results); + } - formatFile: function(file, data, done) { + return results; + } + + formatFile(contents, file) { var formatter = Formatter.get(file, this._logger, this.flags); if (formatter) { - this.processFileData(data, formatter, done); + formatter._config = this._configs[file]; + + contents = this.processFileData(contents, formatter); this.isMetaCheckNeeded(file); } - }, - hasModulesFile: function(fileDir) { + return contents; + } + + hasModulesFile(fileDir) { return fs.existsSync(path.join(fileDir, 'modules.js')); - }, + } - isMetaCheckNeeded: function(file) { + isMetaCheckNeeded(file) { if (!this._CHECK_META && this.flags.checkMetadata && path.extname(file) === '.js') { var fileDir = path.dirname(path.resolve(file)); @@ -125,21 +162,17 @@ CLI.prototype = { this._liferayModuleDir = fileDir; } } - }, + } - logGeneralError: function(err) { - var msg = ''; + logGeneralError(err) { + var msg = util.format(`${colors.error('Something went wrong.\nDetails below:')}\n%s`, err.stack); - if (err) { - msg = util.format(colors.error('Something went wrong.\nDetails below:') + '\n%s', err.stack); - - this._log(msg); - } + this._log(msg); return msg; - }, + } - logResults: function(out, file) { + logResults(out, file) { if (out) { this._log(out); } @@ -149,31 +182,21 @@ CLI.prototype = { if (verboseDetails) { this._log(verboseDetails); } - }, - - onFinish: function(err, results) { - this.logGeneralError(err); + } + onFinish(results) { if (this.flags.open) { - this.openFiles(err, results); + this.openFiles(results); } - }, - onRead: function(err, data, file, done) { - if (err) { - done = file; - file = data; + return results; + } - this.onReadError(err, file); - } - else { - this.formatFile(file, data, done); - } + onRead(contents, file) { + return this.formatFile(contents, file); + } - done(); - }, - - onReadError: function(err, file) { + onReadError(err, file) { var errMsg = File.handleFileReadError(err, file); if (errMsg) { @@ -181,26 +204,15 @@ CLI.prototype = { this._log(errMsg); this._log(''); } - }, - onWrite: function(err, file, done) { - var writeResults = ''; - - if (err) { - writeResults = File.handleFileWriteError(err, file); - } - else { - writeResults = util.format('Wrote file: %s', file); - } - - this._log(writeResults); - - if (_.isFunction(done)) { - done(); - } - }, + return { + contents: '', + err, + file + }; + } - openFiles: function(err, result) { + openFiles(result) { var instance = this; var errorFiles = Object.keys(instance._logger.getErrors()); @@ -208,32 +220,40 @@ CLI.prototype = { if (errorFiles.length) { instance._exec( 'git config --get user.editor', - function(res) { + res => { instance._exec( - 'open -a "' + res[0] + '" "' + errorFiles.join('" "') + '"' + `open -a "${res[0]}" "${errorFiles.join('" "')}"` ); } ); } - }, + } - processFile: function(file, done) { - this._read(file, 'utf-8', _.bindRight(this.onRead, this, file, done)); - }, + processFile(file) { + return this._read(file, 'utf-8') + .then(_.bindKeyRight(this, 'onRead', file)) + .error(_.bindKeyRight(this, 'onReadError', file)); + } - processFileData: function(data, formatter, done) { + processFileData(data, formatter) { var file = formatter.file; - var contents = formatter.format(data); + var res = Promise.resolve(formatter.format(data)); - this.logResults(this.renderOutput(file), file); + return res.bind(this).then( + function(contents) { + this.logResults(this.renderOutput(file), file); - if (contents !== data && this.flags.inlineEdit) { - this.writeFile(file, contents, done); - } - }, + return { + contents, + data, + file + }; + } + ); + } - renderOutput: function(file) { + renderOutput(file) { var flags = this.flags; var config = { @@ -243,7 +263,7 @@ CLI.prototype = { var out; if (flags.relative) { - config.relative = this._cwd; + config.relative = process.env.GIT_PWD || this._cwd; } if (flags.filenames) { @@ -253,18 +273,106 @@ CLI.prototype = { config.showBanner = flags.quiet; config.showLintIds = flags.lintIds; + if (flags.quiet) { + this._logger.filterFileErrors( + file, + filterFileErrors + ); + } + out = this._logger.render(file, config); } return out; - }, + } - writeFile: function(file, contents, done) { - this._write(file, contents, _.bindRight(this.onWrite, this, file, done)); - }, + writeFile(file, contents) { + return this._write(file, contents) + .then(_.bind(_.ary(util.format, 2), util, 'Wrote file: %s', file)) + .error(File.handleFileWriteError.bind(this, file)) + .then(_.unary(this._log).bind(this)); + } - _metaCheckerPath: './meta' -}; + _loadConfigs() { + var instance = this; + + return Promise.reduce( + instance._args, + (prev, item, index) => { + var filePath = path.resolve(instance._cwd, path.dirname(item)); + + var res; + + if (instance.flags.config) { + res = instance._config.load(filePath); + } + else { + var cfg = new Config({}); + + cfg._paths.cwd = instance._cwd; + + res = Promise.resolve(cfg); + } + + return res.then( + config => { + prev[item] = config; + + var obj = config._paths.obj; + + if (obj) { + instance._configFiles[obj.filepath] = true; + } + + return prev; + } + ); + }, + {} + ); + } + + _notifyConfig() { + if (this.flags.config && !this.flags.filenames) { + var configFiles = _.keys(this._configFiles); + + var configSize = configFiles.length; + + if (configSize) { + var msg; + + if (configSize === 1) { + msg = `Using local config from ${configFiles[0]}`; + } + else if (this.flags.verbose) { + msg = `Using local config from: \n${configFiles.join('\n')}`; + } + else { + msg = `Using local config from ${configSize} files. Pass -v to see all locations`; + } + + msg += '\n'; + + this._log(msg); + } + } + } + + _start() { + this.emit('init'); + + this._notifyConfig(); + + return Promise.all(this._args) + .bind(this) + .mapSeries(_.unary(this.processFile)) + .then(this.checkMeta) + .then(this.createReport) + .then(this.afterFormat); + } +} + +CLI.prototype._metaCheckerPath = './meta'; var cliInstance = new CLI(); diff --git a/lib/config.js b/lib/config.js new file mode 100644 index 0000000..2a32b25 --- /dev/null +++ b/lib/config.js @@ -0,0 +1,134 @@ +'use strict'; + +var _ = require('lodash'); +var cosmiconfig = require('cosmiconfig'); + +var CONFIG_DEFAULT = { + _paths: { + configs: [], + keys: [] + } +}; + +class Config { + constructor(obj) { + this._config = this._normalize(obj); + + return this._config; + } + + toJSON() { + return _.omit(this._config, '_paths'); + } + + _get(key) { + return key ? _.result(this._config, key) : this._config; + } + + _normalize(obj) { + const fn = this._get.bind(this); + + Object.defineProperty( + fn, + 'toJSON', + { + enumerable: false, + value: _.bindKey(this, 'toJSON') + } + ); + + Object.defineProperty( + fn, + 'toString', + { + enumerable: false, + value: JSON.stringify.bind(JSON, fn) + } + ); + + Object.defineProperty( + fn, + 'inspect', + { + enumerable: false, + value: fn.toString + } + ); + + Object.defineProperty( + fn, + '_paths', + { + enumerable: false, + value: {} + } + ); + + return _.merge(fn, CONFIG_DEFAULT, obj); + } +} + +class Loader { + constructor(options) { + options = _.defaults( + options, + { + cwd: process.cwd(), + packageProp: 'csfConfig' + } + ); + + this._config = cosmiconfig('csf', options); + } + + load(cwd) { + return this._config.load(cwd).then( + obj => { + const config = new Config(obj ? obj.config : {}); + + config._paths.cwd = cwd; + + if (obj) { + const STR_PATH = 'path:'; + + const paths = Object.keys(config).reduce( + (prev, item, index) => { + if (item.indexOf(STR_PATH) === 0) { + const pathKey = item.slice(STR_PATH.length); + + const pathConfig = config[item]; + + prev.configs.push(pathConfig); + + delete config[item]; + + prev.keys.push(pathKey); + } + + return prev; + }, + config._paths + ); + + paths.obj = obj; + } + + return config; + } + ).catch( + err => { + const config = new Config(); + + config._paths.cwd = cwd; + + config._paths.err = err; + + return config; + } + ); + } +} + +Config.Loader = Loader; + +module.exports = Config; \ No newline at end of file diff --git a/lib/eslint_config.js b/lib/config/eslint.js similarity index 57% rename from lib/eslint_config.js rename to lib/config/eslint.js index 0d0e8be..f58f500 100644 --- a/lib/eslint_config.js +++ b/lib/config/eslint.js @@ -2,10 +2,22 @@ module.exports = { 'env': { 'amd': false, 'browser': true, + 'es6': true, 'mocha': true, 'node': true }, + 'parser': 'babel-eslint', + + 'parserOptions': { + 'ecmaFeatures': { + 'experimentalObjectRestSpread': true, + 'jsx': true + }, + 'ecmaVersion': 7, + 'sourceType': 'module' + }, + 'globals': { 'alert': true, 'AUI': true, @@ -19,8 +31,7 @@ module.exports = { }, 'rules': { - 'csf-liferay-language-get': 2, - 'csf-liferay-provide-format': 2, + 'array-bracket-spacing': [2, 'never'], 'block-scoped-var': 2, 'brace-style': [2, 'stroustrup'], 'camelcase': 0, @@ -30,18 +41,33 @@ module.exports = { 'complexity': [0, 11], 'consistent-return': 2, 'consistent-this': [1, 'instance'], + + // 'csf-no-lonely-if': 2, + 'csf-array-spacing': 2, 'csf-array-spacing-chars': 2, 'csf-catch-arg-name': 2, 'csf-catch-format': 2, 'csf-format-args': 2, 'csf-format-constants': 2, + + 'csf-function-spacing': 2, 'csf-format-multiline-vars': 2, + 'csf-liferay-language-get': 2, + 'csf-liferay-provide-format': 2, 'csf-multiple-vars': 2, 'csf-no-extra-semi': 2, 'csf-no-is-prefix': 2, + 'csf-no-multiple-return': 2, 'csf-no-unused-vars': 2, - 'csf-no-use-before-define': [2, {'samescope': true}], + 'csf-no-use-before-define': [ + 2, + { + 'classes': true, + 'functions': true, + 'samescope': true + } + ], 'csf-sort-constants': 2, 'csf-sort-props': 2, 'csf-sort-requires': 2, @@ -59,6 +85,13 @@ module.exports = { 'handle-callback-err': 0, 'indent': [2, 'tab'], 'key-spacing': 2, + 'keyword-spacing': [ + 2, + { + after: true, + before: true + } + ], 'max-depth': [0, 4], 'max-len': [0, 80, 4], 'max-nested-callbacks': [0, 2], @@ -84,8 +117,7 @@ module.exports = { 'no-duplicate-case': 2, 'no-else-return': 2, 'no-empty': 0, - 'no-empty-class': 2, - 'no-empty-label': 2, + 'no-empty-character-class': 2, 'no-eq-null': 0, 'no-eval': 2, 'no-ex-assign': 2, @@ -112,7 +144,12 @@ module.exports = { 'no-mixed-spaces-and-tabs': [0, false], 'no-multi-spaces': 2, 'no-multi-str': 2, - 'no-multiple-empty-lines': [2, {max: 2}], + 'no-multiple-empty-lines': [ + 2, + { + max: 2 + } + ], 'no-native-reassign': 2, 'no-negated-in-lhs': 2, 'no-nested-ternary': 2, @@ -132,7 +169,6 @@ module.exports = { 'no-proto': 2, 'no-redeclare': 2, 'no-regex-spaces': 2, - 'no-reserved-keys': 0, 'no-restricted-modules': 0, 'no-return-assign': 2, 'no-script-url': 0, @@ -152,13 +188,27 @@ module.exports = { 'no-underscore-dangle': 0, 'no-unreachable': 2, 'no-unused-expressions': 2, - 'no-unused-vars': [2, {'vars': 'local', 'args': 'none'}], - 'no-use-before-define': 0, + 'no-unused-vars': [ + 2, + { + 'args': 'none', + 'vars': 'local' + } + ], + 'no-use-before-define': [0], 'no-var': 0, 'no-void': 0, - 'no-warning-comments': [0, { 'terms': ['todo', 'fixme', 'xxx'], 'location': 'start' }], + 'no-warning-comments': [ + 0, + { + 'location': 'start', + 'terms': ['todo', 'fixme', 'xxx'] + } + ], 'no-with': 2, - 'no-wrap-func': 2, + + // 'no-extra-parens': 2, + 'one-var': 0, 'operator-assignment': [2, 'always'], 'padded-blocks': 0, @@ -166,17 +216,33 @@ module.exports = { 'quotes': [2, 'single'], 'radix': 2, 'semi': [2, 'always'], - 'semi-spacing': [2, {before: false, after: true}], - 'sort-vars': [2, {ignoreCase: true}], - 'space-after-keywords': [2, 'always'], + 'semi-spacing': [ + 2, + { + after: true, + before: false + } + ], + 'sort-vars': [ + 2, + { + ignoreCase: true + } + ], 'space-before-blocks': [2, 'always'], 'space-before-function-paren': [2, 'never'], - 'space-in-brackets': [0, 'never'], 'space-in-parens': [2, 'never'], 'space-infix-ops': 2, - 'space-return-throw-case': 2, - 'space-unary-ops': [1, {'words': true, 'nonwords': false}], - 'spaced-line-comment': [2, 'always'], + 'space-unary-ops': [ + 1, + { + 'nonwords': false, + 'words': true + } + ], + 'spaced-comment': [2, 'always'], + 'template-curly-spacing': [2, 'never'], + 'no-self-assign': 2, 'strict': 0, 'use-isnan': 2, 'valid-jsdoc': 0, @@ -184,6 +250,85 @@ module.exports = { 'vars-on-top': 0, 'wrap-iife': 0, 'wrap-regex': 0, - 'yoda': 2 + 'yoda': 2, + + // Investigate + + 'jsx-quotes': 0, + 'no-continue': 0, + 'no-invalid-this': 0, + 'no-magic-numbers': 0, + 'no-implicit-globals': 0, + 'no-negated-condition': 0, + 'no-restricted-syntax': 0, + + 'accessor-pairs': 0, + 'array-callback-return': 2, + 'arrow-spacing': [ + 2, + { + after: true, + before: true + } + ], + 'block-spacing': 0, + 'callback-return': 0, + 'computed-property-spacing': [2, 'never'], + 'constructor-super': 2, + 'global-require': 2, + 'id-blacklist': 0, + 'id-length': 0, + 'id-match': 0, + 'init-declarations': 0, + 'linebreak-style': [2, 'unix'], + 'lines-around-comment': [ + 2, + { + 'afterBlockComment': true, + 'afterLineComment': true, + 'beforeBlockComment': true, + 'beforeLineComment': true + } + ], + 'newline-per-chained-call': 0, + 'no-case-declarations': 2, + 'no-class-assign': 2, + 'no-confusing-arrow': 2, + 'no-const-assign': 2, + 'no-dupe-class-members': 2, + 'no-empty-function': 0, + 'no-empty-pattern': 2, + 'no-extra-label': 2, + 'no-implicit-coercion': [ + 2, + { + allow: ['!!', '*', '+'] + } + ], + 'no-restricted-imports': 0, + 'no-this-before-super': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': 2, + 'no-unused-labels': 0, + 'no-useless-call': 2, + 'no-useless-concat': 2, + 'no-useless-constructor': 2, + 'no-whitespace-before-property': 2, + 'object-curly-spacing': [2, 'never'], + 'object-property-newline': 2, + 'one-var-declaration-per-line': 0, + 'operator-linebreak': [2, 'after'], + 'prefer-reflect': 0, + 'require-jsdoc': 0, + 'require-yield': 0, + 'sort-imports': [ + 0, + { + ignoreCase: true, + memberSyntaxSortOrder: ['none', 'all', 'single', 'multiple'] + } + ], + 'yield-star-spacing': 0 } }; \ No newline at end of file diff --git a/lib/config/eslint_es6.js b/lib/config/eslint_es6.js new file mode 100644 index 0000000..6ccf988 --- /dev/null +++ b/lib/config/eslint_es6.js @@ -0,0 +1,122 @@ +module.exports = { + 'plugins': [ + 'react' + ], + + 'rules': { + 'jsx-quotes': [2, 'prefer-double'], + 'jsx-uses-react': 2, + 'jsx-uses-vars': 2, + 'jsx-curly-spacing': [2, 'never'], + 'jsx-indent': [2, 'tab'], + 'jsx-indent-props': [2, 'tab'], + 'jsx-key': 2, + 'jsx-equals-spacing': [2, 'never'], + 'jsx-no-undef': 2, + 'jsx-no-duplicate-props': 2, + 'jsx-no-literals': 2, + 'jsx-closing-bracket-location': 2, + 'jsx-pascal-case': 2, + 'jsx-tag-spacing': [2], + 'jsx-sort-props': [ + 2, + { + 'ignoreCase': true + } + ], + 'no-multi-comp': [ + 0, + { + 'ignoreStateless': true + } + ], + 'jsx-wrap-multilines': [2/* , {'ignoreStateless': true} */], + 'no-unknown-property': 2, + 'sort-comp': [ + 0, + { + groups: { + lifecycle: [ + 'constructor', + 'displayName', + 'mixins', + 'propTypes', + 'statics', + 'defaultProps', + 'getDefaultProps', + 'getInitialState', + 'state', + 'componentWillMount', + 'componentDidMount', + 'componentWillReceiveProps', + 'componentWillUpdate', + 'componentDidUpdate', + 'componentWillUnmount', + 'shouldComponentUpdate', + 'getChildContext', + 'childContextTypes', + 'contextTypes' + ] + }, + order: [ + 'static-methods', + 'lifecycle', + 'everything-else', + 'render' + ] + } + ], + 'prop-types': 0, + 'display-name': 0, + 'no-danger': 0, + 'no-set-state': 0, + 'no-is-mounted': 0, + 'no-deprecated': 0, + 'no-did-mount-set-state': 0, + 'no-did-update-set-state': 0, + 'react-in-jsx-scope': 0, + 'jsx-handler-names': 0, + 'jsx-boolean-value': 0, + 'require-extension': 0, + 'jsx-max-props-per-line': 0, + 'no-string-refs': 0, + 'prefer-stateless-function': 0, + + 'require-render-return': 2, + 'jsx-first-prop-new-line': [2, 'multiline'], + 'self-closing-comp': 2, + 'sort-prop-types': [ + 2, + { + 'ignoreCase': true + } + ], + 'no-direct-mutation-state': 2, + + 'forbid-prop-types': 0, + 'jsx-no-bind': 2, + 'prefer-es6-class': 0, + + 'arrow-body-style': [0, 'as-needed'], + 'arrow-parens': [2, 'as-needed'], + 'object-property-newline': 0, + 'object-shorthand': [ + 2, + 'always', + { + 'ignoreConstructors': true + } + ], + 'prefer-arrow-callback': [ + 2, + { + 'allowNamedFunctions': true + } + ], + 'no-new-symbol': 2, + 'prefer-const': 2, + 'prefer-rest-params': 2, + 'prefer-spread': 2, + 'prefer-template': 2 + } +}; \ No newline at end of file diff --git a/lib/eslint_config_jsp.js b/lib/config/eslint_jsp.js similarity index 61% rename from lib/eslint_config_jsp.js rename to lib/config/eslint_jsp.js index 7b94ab8..c56595f 100644 --- a/lib/eslint_config_jsp.js +++ b/lib/config/eslint_jsp.js @@ -8,13 +8,22 @@ module.exports = { 'rules': { 'block-scoped-var': 0, 'csf-dot-notation': 2, - 'csf-no-undef': 2, - 'csf-no-unused-vars': [2, {'jsp': true}], + 'csf-no-undef': [ + 2, + {} + ], + 'csf-no-unused-vars': [ + 2, + { + 'jsp': true + } + ], 'indent': [0, 'tab'], 'dot-notation': 0, 'no-trailing-spaces': 0, 'no-undef': 0, 'no-unused-vars': 0, - 'no-use-before-define': 0 + 'no-use-before-define': 0, + 'lines-around-comment': 0 } }; \ No newline at end of file diff --git a/lib/config/stylelint.js b/lib/config/stylelint.js new file mode 100644 index 0000000..224ff17 --- /dev/null +++ b/lib/config/stylelint.js @@ -0,0 +1,208 @@ +module.exports = { + + 'plugins': [ + 'stylelint-order' + ], + + 'globals': { + + }, + + 'rules': { + // 'at-rule-blacklist': 'string|[]', + // 'at-rule-empty-line-before': 'alwaysd|never', + 'at-rule-name-case': 'lower', + // 'at-rule-name-newline-after': 'alwaysd|always-multi-line', + 'at-rule-name-space-after': 'always', + // 'at-rule-no-unknown': true, + 'at-rule-semicolon-newline-after': 'always', + 'at-rule-semicolon-space-before': 'never', + // 'at-rule-whitelist': 'string|[]', + 'block-closing-brace-empty-line-before': 'never', + 'comment-no-empty': true, + // 'comment-word-blacklist': 'string|[]', + // 'custom-property-empty-line-before': 'alwaysd|never', + 'declaration-block-no-redundant-longhand-properties': true, + // 'declaration-empty-line-before': 'alwaysd|never', + // 'declaration-property-unit-blacklist': {}, + // 'declaration-property-unit-whitelist': {}, + // 'declaration-property-value-blacklist': {}, + // 'declaration-property-value-whitelist': {}, + 'font-family-no-duplicate-names': true, + 'function-max-empty-lines': 0, + 'function-name-case': 'lower', + // 'function-url-data-uris': 'alwaysd|never', + // 'function-url-no-scheme-relative': true, + // 'function-url-scheme-whitelist': 'string|[]', + // 'keyframe-declaration-no-important': true, + // 'media-feature-name-blacklist': 'string|[]', + 'media-feature-name-case': 'lower', + // 'media-feature-name-no-unknown': true, + // 'media-feature-name-whitelist': 'string|[]', + 'no-empty-source': false, + 'no-extra-semicolons': true, + // 'no-missing-end-of-source-newline': true, + 'property-case': 'lower', + // 'property-no-unknown': true, + 'selector-attribute-brackets-space-inside': 'never', + // 'selector-attribute-operator-blacklist': 'string|[]', + 'selector-attribute-operator-space-after': 'never', + 'selector-attribute-operator-space-before': 'never', + // 'selector-attribute-operator-whitelist': 'string|[]', + // 'selector-attribute-quotes': 'alwaysd|never', + 'selector-descendant-combinator-no-non-space': true, + 'selector-max-empty-lines': 0, + // 'selector-max-compound-selectors': 'int', + // 'selector-nested-pattern': 'string', + // 'selector-no-qualifying-type': true, + // 'selector-pseudo-class-blacklist': 'string|[]', + 'selector-pseudo-class-case': 'lower', + 'selector-pseudo-class-no-unknown': true, + 'selector-pseudo-class-parentheses-space-inside': 'never', + // 'selector-pseudo-class-whitelist': 'string|[]', + 'selector-pseudo-element-case': 'lower', + 'selector-pseudo-element-no-unknown': true, + // 'selector-type-no-unknown': true, + 'shorthand-property-no-redundant-values': true, + // 'time-min-milliseconds': 'int', + 'unit-case': 'lower', + 'unit-no-unknown': true, + 'value-keyword-case': 'lower', + 'value-list-max-empty-lines': 0, + + 'csf-at-rule-empty-line': [ + 'always', + { + except: ['first-nested'] + } + ], + 'order/properties-alphabetical-order': true, + 'at-rule-no-vendor-prefix': true, + 'block-closing-brace-newline-after': 'always', + 'block-closing-brace-newline-before': 'always', + // 'block-closing-brace-space-after': 'never', + // 'block-closing-brace-space-before': 'never', + // 'block-no-empty': true, + // 'block-no-single-line': true, + 'block-opening-brace-newline-after': 'always', + // 'block-opening-brace-newline-before': 'always', + // 'block-opening-brace-space-after': 'never', + 'block-opening-brace-space-before': 'always', + 'color-hex-case': 'upper', + 'color-hex-length': 'short', + 'color-named': 'never', + // 'color-no-hex': true, + 'color-no-invalid-hex': true, + 'comment-empty-line-before': [ + 'always', + { + except: ['first-nested'] + } + ], + 'comment-whitespace-inside': 'always', + // 'custom-media-pattern': string, + // 'custom-property-pattern': string, + 'declaration-bang-space-after': 'never', + 'declaration-bang-space-before': 'always', + 'declaration-block-no-duplicate-properties': true, + 'declaration-block-no-shorthand-property-overrides': true, + 'declaration-block-semicolon-newline-after': 'always', + 'declaration-block-semicolon-newline-before': 'never', + // 'declaration-block-semicolon-space-after': 'always'|'never'|'always-single-line'|'never-single-line', + 'declaration-block-semicolon-space-before': 'never', + 'declaration-block-single-line-max-declarations': 1, + 'declaration-block-trailing-semicolon': 'always', + // 'declaration-colon-newline-after': 'always'|'always-multi-line', + 'declaration-colon-space-after': 'always', + 'declaration-colon-space-before': 'never', + // 'declaration-no-important': true, + 'font-family-name-quotes': 'single-where-recommended', + 'font-weight-notation': 'named-where-possible', + // 'function-blacklist': 'rgba', + 'function-calc-no-unspaced-operator': true, + 'function-comma-newline-after': 'never', + 'function-comma-newline-before': 'never', + 'function-comma-space-after': 'always', + 'function-comma-space-before': 'never', + // 'function-linear-gradient-no-nonstandard-direction': true, + // 'function-parentheses-newline-inside': 'always'|'always-multi-line'|'never-multi-line', + 'function-parentheses-space-inside': 'never', + + // Will probably need to reimplement this one to ignore strings with quotes + // 'function-url-quotes': 'never', + + // 'function-whitelist': '', + 'function-whitespace-after': 'always', + 'indentation': 'tab', + 'max-empty-lines': 1, + // 'max-line-length': int, + // 'max-nesting-depth': int, + 'media-feature-colon-space-after': 'always', + 'media-feature-colon-space-before': 'never', + // 'media-feature-name-no-vendor-prefix': true, + // 'media-feature-no-missing-punctuation': true, + 'media-feature-range-operator-space-after': 'always', + 'media-feature-range-operator-space-before': 'always', + // 'media-query-list-comma-newline-after': 'always'|'always-multi-line'|'never-multi-line', + // 'media-query-list-comma-newline-before': 'always'|'always-multi-line'|'never-multi-line', + // 'media-query-list-comma-space-after': 'always'|'never'|'always-single-line'|'never-single-line', + // 'media-query-list-comma-space-before': 'always'|'never'|'always-single-line'|'never-single-line', + 'media-feature-parentheses-space-inside': 'never', + // 'no-descending-specificity': true, // Maybe + // 'no-duplicate-selectors': true, // Maybe + 'no-eol-whitespace': true, + // 'no-invalid-double-slash-comments': true, + // 'no-missing-end-of-source-newline': true, + // 'no-unknown-animations': true, + 'number-leading-zero': 'always', + 'number-max-precision': 3, + 'number-no-trailing-zeros': true, + 'length-zero-no-unit': true, + // 'property-blacklist': string|[], + 'property-no-vendor-prefix': true, + // 'property-unit-blacklist': {}, + // 'property-unit-whitelist': {}, + // 'property-value-blacklist': {}, + // 'property-whitelist': string|[], + // 'root-no-standard-properties': true, + 'rule-empty-line-before': [ + 'always', + { + except: ['first-nested'] + } + ], + // 'rule-non-nested-empty-line-before': 'always', + 'selector-class-pattern': [ + /(#\{\$.*?\}|[a-z0-9]+)(-#\{\$.*?\}|-[a-z0-9]+)*$/, + { + resolveNestedSelectors: true + } + ], // Maybe + 'selector-combinator-space-after': 'always', + 'selector-combinator-space-before': 'always', + // 'selector-id-pattern': string, + 'selector-list-comma-newline-after': 'always-multi-line', // Maybe + 'selector-list-comma-newline-before': 'never-multi-line', + 'selector-list-comma-space-after': 'always-single-line', + 'selector-list-comma-space-before': 'never', + // 'selector-max-specificity': string, + // 'selector-no-attribute': true, + // 'selector-no-combinator': true, + // 'selector-no-id': true, + // 'selector-no-type': true, + // 'selector-no-universal': true, + // 'selector-no-vendor-prefix': true, + 'selector-pseudo-element-colon-notation': 'single', + 'selector-type-case': 'lower', + 'string-no-newline': true, + // 'string-quotes': 'single', + // 'time-no-imperceptible': true, + // 'unit-blacklist': string|[], + // 'unit-whitelist': string|[], + 'value-list-comma-newline-after': false, + 'value-list-comma-newline-before': 'never-multi-line', + 'value-list-comma-space-after': 'always-single-line', + 'value-list-comma-space-before': 'never' + // 'value-no-vendor-prefix': true + } +}; \ No newline at end of file diff --git a/lib/css.js b/lib/css.js index 008e8ca..1407d10 100644 --- a/lib/css.js +++ b/lib/css.js @@ -1,13 +1,15 @@ var _ = require('lodash'); +var Promise = require('bluebird'); + var base = require('./base'); -var re = require('./re'); var REGEX = require('./regex'); var Formatter = require('content-formatter'); var iterateLines = base.iterateLines; -var sub = require('string-sub'); + +var REGEX_STYLELINT_POSTFIX = / \(.+?\)$/; Formatter.CSS = Formatter.create( { @@ -15,43 +17,49 @@ Formatter.CSS = Formatter.create( id: 'css', includes: /\.s?css$/, prototype: { - comparePropertySort: function(content, nextItem, context) { - var re = this._re; - - var nextItemMatch; - - var contentMatch = content.match(REGEX.PROP_KEY); - - if (nextItem && re.hasProperty(nextItem)) { - nextItem = nextItem.replace(REGEX.LEADING_SPACE, ''); - nextItemMatch = nextItem && re.hasProperty(nextItem) && nextItem.match(REGEX.PROP_KEY); - } - - if (contentMatch && nextItemMatch && contentMatch[1] > nextItemMatch[1]) { - this.log(context.lineNum, sub('Sort: {0} {1}', content, nextItem)); - } - - return content; - }, - - format: function(contents) { + format(contents, lint) { var instance = this; var logger = this.log.bind(this); - return iterateLines( + var newContents = iterateLines( contents, - function(item, index, collection) { - return instance.processFile(item, index, collection, logger); + (item, index, collection) => instance.processFile(item, index, collection, logger) + ); + + var context = { + file: this.file, + lintConfig: this.flags.lint !== false && lint + }; + + return this._lint(contents, context).then( + results => { + instance._logLintResults(results.results); + + return newContents; + } + ).catch( + err => { + instance.log( + 'N/A', + `Could not parse the file because of ${err}`, + 'stylelint-error', + { + column: 0, + ruleId: 'stylelint-error' + } + ); + + return newContents; } ); }, - formatPropertyItem: function(content) { + formatPropertyItem(content) { return content.replace(REGEX.LEADING_SPACE, '').replace(REGEX.LEADING_INCLUDE, ''); }, - processFile: function(content, index, collection, logger) { + processFile(content, index, collection, logger) { var re = this._re; var rawContent = content; @@ -85,7 +93,7 @@ Formatter.CSS = Formatter.create( return rawContent; }, - processProperty: function(rawContent, content, nextItem, context) { + processProperty(rawContent, content, nextItem, context) { var re = this._re; content = this.formatPropertyItem(content); @@ -94,21 +102,24 @@ Formatter.CSS = Formatter.create( {}, context, { - content: content + content } ); rawContent = re.iterateRules('css._properties', propertyContext); - content = this.comparePropertySort(content, nextItem, context); - return { - content: content, - rawContent: rawContent + content, + rawContent }; }, - _getContext: function(content, index, collection, logger) { + _getContext(content, index, collection, logger) { + var context = { + collection, + file: this.file + }; + var lineNum = index + 1; var nextItem = collection[lineNum] && collection[lineNum].trim(); var previousItem = null; @@ -118,18 +129,70 @@ Formatter.CSS = Formatter.create( previousItem = previousItem && previousItem.trim(); } - var propertyRules = this._re.rules.css._properties; + context.content = content; + context.index = index; + context.lineNum = lineNum; + context.nextItem = nextItem; + context.previousItem = previousItem; - return context = { - collection: collection, - content: content, - file: this.file, - index: index, - lineNum: lineNum, - nextItem: nextItem, - previousItem: previousItem - }; + return context; + }, + + _lint(contents, context) { + var lint = context.lintConfig; + + var results = Promise.resolve( + { + results: [ + { + warnings: [] + } + ] + } + ); + + if (lint !== false) { + var linter = require('./lint_css'); + + lint = _.isObjectLike(lint) ? lint : {}; + + context.lintConfig = _.merge(lint, this.config('css.lint')); + + results = linter(contents, this.file, context); + } + + return results; }, + + _logLintResults(results) { + var instance = this; + + var lintLogFilter = instance.lintLogFilter; + + if (!_.isFunction(lintLogFilter)) { + lintLogFilter = false; + } + + results[0].warnings.forEach( + (item, index) => { + item.text = item.text.replace(REGEX_STYLELINT_POSTFIX, ''); + + if (lintLogFilter) { + item = lintLogFilter(item); + } + + instance.log( + item.line, + item.text, + item.rule, + { + column: item.column, + ruleId: item.rule + } + ); + } + ); + } } } ); diff --git a/lib/deprecation.js b/lib/deprecation.js new file mode 100644 index 0000000..2323d09 --- /dev/null +++ b/lib/deprecation.js @@ -0,0 +1,38 @@ +var _ = require('lodash'); +var colors = require('cli-color-keywords')(); +var path = require('path'); + +var unindent = (strings, ...keys) => _.zipWith(strings, keys, _.add).join('').replace(/^\s+/gm, ' '); + +function deprecationCheck(params) { + var config = params.config; + var scriptName = params.scriptName; + + var checkInterval = params.interval || deprecationCheck.INTERVAL; + + var lastDeprecationCheck = config.get('lastDeprecationCheck'); + + var retVal = ''; + + if (path.basename(scriptName) === 'check_sf' && (Date.now() - lastDeprecationCheck >= checkInterval)) { + var header = `Using the ${colors.inverse('check_sf')} form of this module is deprecated.`; + + var footer = `Please use the ${colors.inverse('csf')} command instead. It's easier to type too!`; + + var maxLineLength = Math.max(header.length, footer.length); + + var bar = new Array(maxLineLength).join('-'); + + config.set('lastDeprecationCheck', Date.now()); + + retVal = unindent`${bar} + ${colors.error(header)} + ${colors.green(footer)}`; + } + + return retVal; +} + +deprecationCheck.INTERVAL = 1000 * 60 * 60 * 24; + +module.exports = deprecationCheck; \ No newline at end of file diff --git a/lib/engine_rules/common.js b/lib/engine_rules/common.js index dd38455..1dbea26 100644 --- a/lib/engine_rules/common.js +++ b/lib/engine_rules/common.js @@ -1,21 +1,21 @@ var colors = require('cli-color-keywords')(); var MAP_WHITESPACE = { - '\xa0': ' ', '\x95': '', - '\x99': '' + '\x99': '', + '\xa0': ' ' }; -var REGEX_WHITESPACE_CHARS = new RegExp('(' + Object.keys(MAP_WHITESPACE).join('|') + ')', 'g'); +var REGEX_WHITESPACE_CHARS = new RegExp(`(${Object.keys(MAP_WHITESPACE).join('|')})`, 'g'); module.exports = { extraneousSpaces: { message: 'Extraneous whitespace at the end of the line', regex: /\s+$/, - replacer: function(result, rule, context) { + replacer(result, rule, context) { return ''; }, - test: function(content, regex) { + test(content, regex) { var invalid = this.test(content, regex); return invalid; @@ -26,12 +26,12 @@ module.exports = { mixedSpaces: { message: 'Mixed spaces and tabs: {1}', regex: /^.*( \t|\t ).*$/, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var rawContent = context.rawContent; rawContent = rawContent.replace( /(.*)( +\t|\t +)(.*)/g, - function(str, prefix, problem, suffix) { + (str, prefix, problem, suffix) => { problem = problem.replace(/ {4}| {2}/g, '\t').replace(/ /g, ''); return prefix + problem + suffix; @@ -45,7 +45,7 @@ module.exports = { invalidWhiteSpace: { MSG: 'Invalid whitespace characters', - message: function(result, rule, context) { + message(result, rule, context) { var content = context.content; var displayedContent = content.replace( @@ -55,17 +55,15 @@ module.exports = { context.content = displayedContent; - return this.message(rule.MSG + ': {1}', result, rule, context); + return this.message(`${rule.MSG}: {1}`, result, rule, context); }, regex: REGEX_WHITESPACE_CHARS, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var rawContent = context.rawContent; return rawContent.replace( rule.regex, - function(str, m) { - return MAP_WHITESPACE[m]; - } + (str, m) => MAP_WHITESPACE[m] ); }, testProp: 'rawContent' diff --git a/lib/engine_rules/css.js b/lib/engine_rules/css.js index d60890b..424db6d 100644 --- a/lib/engine_rules/css.js +++ b/lib/engine_rules/css.js @@ -1,16 +1,12 @@ -var colors = require('cli-color-keywords')(); - -var sub = require('string-sub'); +var REGEX = require('../regex'); var REGEX_WHITESPACE = /\s/; -var REGEX = require('../regex'); - module.exports = { hexLowerCase: { - message: 'Hex code should be all uppercase: {1}', + message: false, regex: /[a-f]/, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var rawContent = context.rawContent; var hexMatch = this.hasHex(rawContent); @@ -19,7 +15,7 @@ module.exports = { return rawContent; }, - test: function(content, regex) { + test(content, regex) { var match = this.hasHex(content); return match && this.test(match, regex); @@ -27,15 +23,9 @@ module.exports = { }, hexRedundant: { - message: function(result, rule, context) { - var match = this.hasHex(context.content); - - var message = 'Hex code can be reduced to ' + rule._reduceHex(match) + ': {1}'; - - return this.message(message, result, rule, context); - }, + message: false, regex: /#([0-9A-Fa-f])\1([0-9A-Fa-f])\2([0-9A-Fa-f])\3/, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var rawContent = context.rawContent; var hexMatch = this.hasHex(rawContent); @@ -44,27 +34,27 @@ module.exports = { return rawContent; }, - test: function(content, regex) { + test(content, regex) { var match = this.hasHex(content); return match && this.test(match, regex); }, - _reduceHex: function(hex) { + _reduceHex(hex) { return hex.replace(REGEX.HEX_REDUNDANT, REGEX.REPLACE_HEX_REDUNDANT); } }, missingInteger: { - message: 'Missing integer: {1}', + message: false, regex: /([^0-9])(\.\d+)/g, replacer: '$10$2' }, missingListValuesSpace: { - message: 'Needs space between comma-separated values: {1}', + message: false, regex: /,(?=[^\s])/g, replacer: ', ', - test: function(content, regex) { + test(content, regex) { var needsSpace = this.test(content, regex); if (this.hasProperty(content)) { @@ -78,42 +68,30 @@ module.exports = { }, missingNewlines: { - message: function(result, rule, context) { - var message = 'There should be a newline between "{prevRule}" and "{rule}"'; - - message = this.message(message, result, rule, context); - - return sub( - message, - { - rule: context.nextItem.trim(), - prevRule: context.previousItem.trim() - } - ); - }, + message: false, regex: /.*?(\}|\{)/, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var rawContent = context.rawContent; return rawContent.replace( rule.regex, - function(m, bracket) { + (m, bracket) => { if (bracket == '{') { - m = '\n' + m; + m = `\n${m}`; } return m; } ); }, - test: function(content, regex, rule, context) { + test(content, regex, rule, context) { var missingNewlines = false; var hasCloser = REGEX.BRACE_CLOSING.test(content); var hasOpener = REGEX.BRACE_OPENING.test(content); - var previousItem = (context.previousItem || '').trim(); var nextItem = (context.nextItem || '').trim(); + var previousItem = (context.previousItem || '').trim(); if ((hasCloser && rule._isNextLineInvalid.call(this, nextItem)) || (hasOpener && rule._isPrevLineInvalid.call(this, previousItem) && content.indexOf('@else') !== 0)) { @@ -123,37 +101,37 @@ module.exports = { return missingNewlines; }, - _isNextLineInvalid: function(content) { + _isNextLineInvalid(content) { return (content !== '' && !REGEX.BRACE_CLOSING.test(content) && content.indexOf('@') !== 0); }, - _isPrevLineInvalid: function(content) { + _isPrevLineInvalid(content) { return (content !== '' && !REGEX.BRACE_OPENING.test(content) && !REGEX.CSS_COMMA_END.test(content)); } }, missingSelectorSpace: { - message: 'Missing space between selector and bracket: {1}', + message: false, regex: /([^ ])\{\s*$/ }, missingInternalSelectorSpace: { - message: 'Missing space around combinator: {1}', + message: false, regex: /(.)?([>~+])(.)?/g, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var item = context.rawContent; if (!this.hasProperty(item)) { item = context.rawContent.replace( rule.regex, - function(m, before, combinator, after) { + (m, before, combinator, after) => { if (rule._hasCombinator(before, after)) { if (before && !REGEX_WHITESPACE.test(before)) { before += ' '; } if (!REGEX_WHITESPACE.test(after)) { - after = ' ' + after; + after = ` ${after}`; } } @@ -164,13 +142,13 @@ module.exports = { return item; }, - test: function(item, regex, rule, context) { + test(item, regex, rule, context) { var hasCombinator = false; if (!this.hasProperty(item) && regex.test(item)) { item.replace( regex, - function(m, before, combinator, after) { + (m, before, combinator, after) => { if (!hasCombinator) { hasCombinator = rule._hasCombinator(before, after); } @@ -180,22 +158,22 @@ module.exports = { return hasCombinator; }, - _hasCombinator: function(before, after) { + _hasCombinator(before, after) { return after !== '=' && ((before && !REGEX_WHITESPACE.test(before)) || !REGEX_WHITESPACE.test(after)); } }, needlessQuotes: { - message: 'Needless quotes: {1}', + message: false, regex: /url\((["'])(.*?)\1\)/, replacer: 'url($2)' }, needlessUnit: { - message: 'Needless unit: {1}', + message: false, regex: /(#?)(\b0(?!s\b)[a-zA-Z]{1,}\b)/, replacer: '0', - test: function(content, regex) { + test(content, regex) { var m = content.match(regex); return m && !m[1]; @@ -205,7 +183,7 @@ module.exports = { trailingNewlines: { PRECEDING: 1, TRAILING: 2, - message: function(result, rule, context) { + message(result, rule, context) { var offset = 1; if (result == rule.PRECEDING) { @@ -216,12 +194,12 @@ module.exports = { return this.message('Needless new line', result, rule, context); }, - test: function(content, regex, rule, context) { + test(content, regex, rule, context) { var hasCloser = REGEX.BRACE_CLOSING.test(content); var hasOpener = REGEX.BRACE_OPENING.test(content); - var previousItem = context.previousItem; var nextItem = context.nextItem; + var previousItem = context.previousItem; var trailingNewlines = false; @@ -248,34 +226,28 @@ module.exports = { _properties: { invalidBorderReset: { - message: function(result, rule, context) { - var borderReplacement = rule._getValidReplacement(result); - - var message = sub('You should use "{1}": {0}', context.content, colors.error(borderReplacement)); - - return this.message(message, result, rule, context); - }, + message: false, regex: /(border(-(?:right|left|top|bottom))?):\s?(none|0)(\s?(none|0))?;/, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var rawContent = context.rawContent; return rawContent.replace(result[0], rule._getValidReplacement(result)); }, test: 'match', - _getValidReplacement: function(result) { - return '' + result[1] + '-width: 0;'; + _getValidReplacement(result) { + return `${result[1]}-width: 0;`; } }, invalidFormat: { - message: 'There should be one space after ":": {1}', + message: false, regex: /^\t*([^:]+:(?:(?! )|(?= {2,})))[^;]+;$/, - replacer: function(result, rule, context) { + replacer(result, rule, context) { var rawContent = context.rawContent; return rawContent.replace(/:\s*/, ': '); }, - test: function(content, regex) { + test(content, regex) { return content.indexOf(':') > -1 && regex.test(content); } } diff --git a/lib/engine_rules/html.js b/lib/engine_rules/html.js index c06144c..0016f03 100644 --- a/lib/engine_rules/html.js +++ b/lib/engine_rules/html.js @@ -1,6 +1,6 @@ module.exports = { anonymousBlockContainers: { - regex: //, - message: 'Block level containers need either a class or id: {1}' + message: 'Block level containers need either a class or id: {1}', + regex: // } }; \ No newline at end of file diff --git a/lib/engine_rules/html_js.js b/lib/engine_rules/html_js.js index 9a494aa..3e24604 100644 --- a/lib/engine_rules/html_js.js +++ b/lib/engine_rules/html_js.js @@ -6,7 +6,7 @@ module.exports = { liferayProvide: { message: 'You can\'t have a Liferay.provide call in a script taglib that has a "use" attribute', regex: /Liferay\.provide/, - test: function(content, regex, rule, context) { + test(content, regex, rule, context) { return context.asyncAUIScript && this.test(content, regex); } } diff --git a/lib/engine_rules/js.js b/lib/engine_rules/js.js index ce66b08..cd7b80d 100644 --- a/lib/engine_rules/js.js +++ b/lib/engine_rules/js.js @@ -16,12 +16,12 @@ module.exports = { invalidArgumentFormat: { message: 'These arguments should each be on their own line: {1}', regex: /(\w+)\((?!(?:$|.*?\);?))/, - test: function(content, regex) { + test(content, regex) { var invalid = false; content.replace( regex, - function(str, fnName) { + (str, fnName) => { if (fnName !== 'function') { invalid = true; } @@ -33,14 +33,14 @@ module.exports = { }, invalidConditional: { - message: function(result, rule, context) { + message(result, rule, context) { var message = 'Needs a space between ")" and "{bracket}": {1}'; return sub(this.message(message, result, rule, context), rule._bracket); }, regex: /\)\{(?!\})/, replacer: ') {', - test: function(content, regex) { + test(content, regex) { content = content.replace(REGEX.REGEX, ''); return regex.test(content); @@ -64,9 +64,9 @@ module.exports = { }, logging: { - message: 'Debugging statement: {1}', + message: false, regex: /\bconsole\.[^\(]+?\(/, - valid: function(rule, context) { + valid(rule, context) { return !context.hasSheBang; } }, @@ -74,7 +74,7 @@ module.exports = { varLineSpacing: { message: 'Variable declaration needs a new line after it: {1}', regex: /^(\s*?)?var\b\s/, - test: function(content, regex, rule, context) { + test(content, regex, rule, context) { var nextLineEmpty = context.nextItem == ''; var nextLineHasVar = this.test(context.nextItem, regex); diff --git a/lib/file.js b/lib/file.js index 1d8aa6c..2c5de0d 100644 --- a/lib/file.js +++ b/lib/file.js @@ -1,10 +1,9 @@ -var fs = require('fs'); var path = require('path'); var util = require('util'); var colors = require('cli-color-keywords')(); -exports.handleFileReadError = function(err, file) { +exports.handleFileReadError = (err, file) => { var errMsg = 'Could not open file'; if (err.code === 'ENOENT') { @@ -21,7 +20,7 @@ exports.handleFileReadError = function(err, file) { return errMsg; }; -exports.handleFileWriteError = function(err, file) { +exports.handleFileWriteError = (err, file) => { var errMsg = 'Could not write to file'; if (file == '') { diff --git a/lib/formatter.js b/lib/formatter.js index f89c1fe..fb0215b 100644 --- a/lib/formatter.js +++ b/lib/formatter.js @@ -1,16 +1,73 @@ +var _ = require('lodash'); +var path = require('path'); + require('./css'); require('./html'); require('./js'); var Formatter = module.exports = require('content-formatter'); +var Config = require('./config'); var re = require('./re'); var RULES = require('./rules'); +var minimatch = require('minimatch'); + +var configCache = {}; + +Formatter.prototype.config = function(key) { + var abspath = this._abspath; + + if (!abspath) { + abspath = path.resolve(this._config._paths.cwd, this.file); + + this._abspath = abspath; + } + + var configObj = configCache[abspath]; + + if (!configObj) { + var config = this._config; + + var paths = config._paths; + + var configs = paths.configs; + + var filteredConfigs = _.reduce( + paths.keys, + (prev, item, index) => { + if (minimatch(abspath, item)) { + prev.push(configs[index]); + } + + return prev; + }, + [] + ); + + if (filteredConfigs.length) { + filteredConfigs.unshift(new Config(), config); + + configObj = _.merge(...filteredConfigs); + + delete configObj._paths; + } + else { + configObj = config; + } + + configCache[abspath] = configObj; + } + + return configObj(key); +}; + Formatter.on( 'init', - function(instance) { + instance => { + instance._config = new Config(); + var ruleInstance = new re(RULES); instance._re = ruleInstance; @@ -19,7 +76,7 @@ Formatter.on( instance.on( 're:message', - function(data) { + data => { instance.log(data.context.lineNum, data.message); } ); diff --git a/lib/html.js b/lib/html.js index 09fe7d9..da675e0 100644 --- a/lib/html.js +++ b/lib/html.js @@ -1,3 +1,5 @@ +var _ = require('lodash'); + var base = require('./base'); var REGEX = require('./regex'); @@ -10,6 +12,7 @@ var sub = require('string-sub'); var jspLintStubs = base.jspLintStubs; var scriptletBlockOpen = '/* scriptlet block'; + var scriptletBlockClose = ' */'; require('./js'); @@ -22,9 +25,11 @@ var MAP_IGNORE_ATTR_VALUES = { 'title': true }; +var REGEX_JSP_PORTLET_NAMESPACE = //g; + var REGEX_JSP_SCRIPT_BLOCK = /<%.*?%>/gim; + var REGEX_JSP_SCRIPTLET_BLOCK = /<%=[^>]+>/g; -var REGEX_JSP_PORTLET_NAMESPACE = //g; Formatter.HTML = Formatter.create( { @@ -32,17 +37,15 @@ Formatter.HTML = Formatter.create( id: 'html', includes: /\.(jsp.*|htm.*|vm|ftl|tag|tpl|tmpl|hbs|soy)$/, prototype: { - init: function(file, logger, flags) { + init(file, logger, flags) { this._attrMap = {}; }, - extractCSS: function(contents) { + extractCSS(contents) { var filePath = this.file; var styleBlocks = []; - var re = this._re; - var hasCSS = (REGEX.STYLE).test(contents); if (hasCSS) { @@ -54,7 +57,7 @@ Formatter.HTML = Formatter.create( newContents.replace( reStyleGlobal, - function(m, tagName, styleAttrs, body, index) { + (m, tagName, styleAttrs, body, index) => { if (!body) { return; } @@ -66,8 +69,8 @@ Formatter.HTML = Formatter.create( contents: body, file: filePath, match: m, - styleAttrs: styleAttrs, - startLine: lines + startLine: lines, + styleAttrs } ); } @@ -77,13 +80,11 @@ Formatter.HTML = Formatter.create( return styleBlocks; }, - extractJs: function(contents) { + extractJs(contents) { var filePath = this.file; var scriptBlocks = []; - var re = this._re; - var hasJs = (REGEX.AUI_SCRIPT).test(contents); if (hasJs) { @@ -95,7 +96,7 @@ Formatter.HTML = Formatter.create( newContents.replace( reAUIScriptGlobal, - function(m, tagNamespace, scriptAttrs, body, index) { + (m, tagNamespace, scriptAttrs, body, index) => { if (!body) { return; } @@ -107,9 +108,9 @@ Formatter.HTML = Formatter.create( contents: body, file: filePath, match: m, - scriptAttrs: scriptAttrs, + scriptAttrs, startLine: lines, - tagNamespace: tagNamespace + tagNamespace } ); } @@ -119,7 +120,7 @@ Formatter.HTML = Formatter.create( return scriptBlocks; }, - format: function(contents) { + format(contents) { var instance = this; instance.parseCSS(contents); @@ -127,13 +128,15 @@ Formatter.HTML = Formatter.create( var filePath = instance.file; - var logger = instance.log.bind(instance); - var re = instance._re; - return iterateLines( + var context = { + file: filePath + }; + + var newContents = iterateLines( contents, - function(content, index, collection) { + (content, index, collection) => { var rawContent = content; content = content.trim(); @@ -154,12 +157,9 @@ Formatter.HTML = Formatter.create( rawContent = instance._attrRestoreScriptlets(rawContent, lineNum); rawContent = instance._attrRestoreTags(rawContent, lineNum); - var context = { - content: content, - file: filePath, - lineNum: lineNum, - rawContent: rawContent - }; + context.content = content; + context.lineNum = lineNum; + context.rawContent = rawContent; rawContent = re.iterateRules('common', context); @@ -170,32 +170,42 @@ Formatter.HTML = Formatter.create( return rawContent; } ); + + return newContents; }, - formatCSS: function(styleBlocks) { - var cssFormatter = new Formatter.CSS(this.file, this.logger, this.flags); + formatCSS(styleBlocks) { + var cssFormatter = new Formatter.CSS(this.file, this.logger, this.flags, this._config); + + cssFormatter._config = this._config; + cssFormatter._abspath = this._abspath; + + var lintConfig = require('./config/stylelint'); + + var lint = _.merge({}, lintConfig, this.config('css.lint'), this.config('html.lint.css')); return styleBlocks.map( - function(item, index) { - return cssFormatter.format(item.contents); - } + (item, index) => cssFormatter.format(item.contents, lint) ); }, - formatJs: function(scriptBlocks) { - var jsFormatter = new Formatter.JS(this.file, this.logger, this.flags); - var esLintConfig = require('./eslint_config_jsp'); + formatJs(scriptBlocks) { + var jsFormatter = new Formatter.JS(this.file, this.logger, this.flags, this._config); + + jsFormatter._config = this._config; + + var esLintConfig = require('./config/eslint_jsp'); + + var lint = _.merge({}, esLintConfig, this.config('js.lint'), this.config('html.lint.js')); jsFormatter.lintLogFilter = this._jsLogFilter.bind(this); return scriptBlocks.map( - function(item, index) { - return jsFormatter.format(item.contents, esLintConfig); - } + (item, index) => jsFormatter.format(item.contents, lint) ); }, - parseCSS: function(contents) { + parseCSS(contents) { var styleBlocks = this.extractCSS(contents); styleBlocks = this.sanitizeStyleBlocks(styleBlocks); @@ -204,7 +214,7 @@ Formatter.HTML = Formatter.create( return styleBlocks; }, - parseJs: function(contents) { + parseJs(contents) { var scriptBlocks = this.extractJs(contents); scriptBlocks = this.sanitizeScriptBlocks(scriptBlocks); @@ -213,20 +223,29 @@ Formatter.HTML = Formatter.create( return scriptBlocks; }, - sanitizeScriptBlocks: function(scriptBlocks) { + sanitizeScriptBlocks(scriptBlocks) { var instance = this; var token = 'void 0;'; scriptBlocks = scriptBlocks.map( - function(item, index) { - var contents = item.contents; + (item, index) => { item = instance._jsIterateRules(item); item = instance._jsRemoveScriptletBlocks(item); item = instance._jsHandleScriptletWhitespace(item); item = instance._jsPadLines(item, token); + var contents = item.contents; + + var lastIndex = contents.lastIndexOf('\n'); + + if (!contents.substr(lastIndex, contents.length).trim()) { + contents = contents.substr(0, lastIndex); + } + + item.contents = contents; + return item; } ); @@ -234,19 +253,27 @@ Formatter.HTML = Formatter.create( return scriptBlocks; }, - sanitizeStyleBlocks: function(styleBlocks) { + sanitizeStyleBlocks(styleBlocks) { var instance = this; var token = 'void: 0;'; styleBlocks = styleBlocks.map( - function(item, index) { - var contents = item.contents; - + (item, index) => { item = instance._jsRemoveScriptletBlocks(item); item = instance._jsHandleScriptletWhitespace(item); item = instance._jsPadLines(item, token); + var contents = item.contents; + + var lastIndex = contents.lastIndexOf('\n'); + + if (!contents.substr(lastIndex, contents.length).trim()) { + contents = contents.substr(0, lastIndex); + } + + item.contents = contents; + return item; } ); @@ -254,13 +281,11 @@ Formatter.HTML = Formatter.create( return styleBlocks; }, - _attrCheckOrder: function(attrName, lastAttr, line, lineNum) { + _attrCheckOrder(attrName, lastAttr, line, lineNum) { var needsSort = false; if (lastAttr > attrName) { - var filePath = this.file; - - var regex = new RegExp('\\b' + lastAttr + '\\b.*?> ?<.*?' + attrName); + var regex = new RegExp(`\\b${lastAttr}\\b.*?> ?<.*?${attrName}`); var note = ''; @@ -278,17 +303,17 @@ Formatter.HTML = Formatter.create( return needsSort; }, - _attrCleanTokens: function(value) { - var token = this._TOKEN; + _attrCleanTokens(value) { var nsToken = this._NS_TOKEN; + var token = this._TOKEN; - value = value.replace(new RegExp(token + '(\\d+)' + token, 'g'), '<%...%>'); - value = value.replace(new RegExp(nsToken + '(\\d+)' + nsToken, 'g'), ''); + value = value.replace(new RegExp(`${token}(\\d+)${token}`, 'g'), '<%...%>'); + value = value.replace(new RegExp(`${nsToken}(\\d+)${nsToken}`, 'g'), ''); return value; }, - _attrGetMapEntry: function(lineNum) { + _attrGetMapEntry(lineNum) { var attrMapEntry = this._attrMap[lineNum]; if (!attrMapEntry) { @@ -300,12 +325,12 @@ Formatter.HTML = Formatter.create( return attrMapEntry; }, - _attrRemoveScriptlets: function(line, lineNum) { + _attrRemoveScriptlets(line, lineNum) { var token = this._TOKEN; var index = 0; - var mapTokens = function(item) { + var mapTokens = item => { line = line.replace(item, token + (index++) + token); return item; @@ -316,7 +341,7 @@ Formatter.HTML = Formatter.create( /\$\{.*?\}/g, /\{{1,3}[^}]+\}{1,3}/g ].reduce( - function(prev, item, index) { + (prev, item, index) => { var m = line.match(item); var matches = m && m.map(mapTokens); @@ -339,13 +364,13 @@ Formatter.HTML = Formatter.create( return line; }, - _attrRemoveTags: function(line, lineNum) { + _attrRemoveTags(line, lineNum) { var nsm = line.match(new RegExp(REGEX_JSP_PORTLET_NAMESPACE.source)); var nsToken = this._NS_TOKEN; var nsMatches = nsm && nsm.map( - function(item, index) { + (item, index) => { line = line.replace(item, nsToken + index + nsToken); return item; @@ -359,7 +384,7 @@ Formatter.HTML = Formatter.create( return line; }, - _attrRestoreScriptlets: function(line, lineNum) { + _attrRestoreScriptlets(line, lineNum) { var attrMapEntry = this._attrGetMapEntry(lineNum); var matches = attrMapEntry.matches; @@ -368,17 +393,15 @@ Formatter.HTML = Formatter.create( var token = this._TOKEN; line = line.replace( - new RegExp(token + '(\\d+)' + token, 'g'), - function(str, id) { - return matches[id]; - } + new RegExp(`${token}(\\d+)${token}`, 'g'), + (str, id) => matches[id] ); } return line; }, - _attrRestoreTags: function(line, lineNum) { + _attrRestoreTags(line, lineNum) { var attrMapEntry = this._attrGetMapEntry(lineNum); var nsMatches = attrMapEntry.nsMatches; @@ -387,22 +410,20 @@ Formatter.HTML = Formatter.create( var nsToken = this._NS_TOKEN; line = line.replace( - new RegExp(nsToken + '(\\d+)' + nsToken, 'g'), - function(str, id) { - return nsMatches[id]; - } + new RegExp(`${nsToken}(\\d+)${nsToken}`, 'g'), + (str, id) => nsMatches[id] ); } return line; }, - _attrSortValues: function(attrName, attrValue, item, line, lineNum) { + _attrSortValues(attrName, attrValue, item, line, lineNum) { var instance = this; if (!MAP_IGNORE_ATTR_VALUES.hasOwnProperty(attrName)) { - var styleAttr = (attrName == 'style'); var onAttr = (attrName.indexOf('on') === 0); + var styleAttr = (attrName == 'style'); var hasScript = (attrValue.indexOf('javascript:') === 0); @@ -418,20 +439,20 @@ Formatter.HTML = Formatter.create( var sort = false; - var filePath = this.file; - attrValuePieces.forEach( - function(item, index, collection) { + (item, index, collection) => { item = item.trim(); if (/^[A-Za-z]/.test(item)) { + // Skip event handlers like onClick, labels, or any attr value // starting with javascript:;, etc since they will have // complex values that probably shouldn't be sorted + if (!hasScript && !onAttr && lastAttrPiece > item) { - var tmpLastAttrPiece = instance._attrCleanTokens(lastAttrPiece); var tmpItem = instance._attrCleanTokens(item); + var tmpLastAttrPiece = instance._attrCleanTokens(lastAttrPiece); - instance.log(lineNum, sub('Sort attribute values: {0} {1}', tmpLastAttrPiece, tmpItem)); + instance.log(lineNum, sub('Sort attribute values: {0} {1}', tmpLastAttrPiece, tmpItem)); sort = true; } @@ -445,15 +466,13 @@ Formatter.HTML = Formatter.create( if (sort) { attrValuePieces = attrValuePieces.filter( - function(item, index, collection) { - return !!item.trim(); - } + (item, index, collection) => !!item.trim() ); attrValuePieces.sort(); if (styleAttr) { - newAttrValue = attrValuePieces.join('; ') + ';'; + newAttrValue = `${attrValuePieces.join('; ')};`; } else { newAttrValue = attrValuePieces.join(' '); @@ -466,17 +485,15 @@ Formatter.HTML = Formatter.create( return item; }, - _getScriptletBlockReplacement: function(length) { + _getScriptletBlockReplacement(length) { return scriptletBlockOpen + (new Array(length).join('\nvoid 0;')) + scriptletBlockClose; }, - _jsCommentSingleLineScriptlets: function(lines) { - var re = this._re; - + _jsCommentSingleLineScriptlets(lines) { return lines.map( - function(item, index) { + (item, index) => { if (REGEX.SCRIPTLET_STUB.test(item)) { - item = '//' + item; + item = `//${item}`; } return item; @@ -484,7 +501,7 @@ Formatter.HTML = Formatter.create( ); }, - _jsFindScriptletBlock: function(contents) { + _jsFindScriptletBlock(contents) { var scriptBlockRe = /<%/g; var match; @@ -499,7 +516,7 @@ Formatter.HTML = Formatter.create( return contents; }, - _jsFindScriptletClose: function(contents, matchIndex) { + _jsFindScriptletClose(contents, matchIndex) { for (var i = matchIndex; i < contents.length; i++) { var item = contents.charAt(i); @@ -515,38 +532,14 @@ Formatter.HTML = Formatter.create( return contents; }, - _jsIgnoreEndNewlines: function(lines) { - var numLines = lines.length; - - if (lines[numLines - 2] === '' && lines[numLines - 3].indexOf('void 0; */') > -1) { - lines[numLines - 2] = 'void 0;'; - } - - return lines; - }, - - _jsIgnoreStartNewlines: function(lines) { - var numLines = lines.length; - - if (lines[1] === '' && lines[2].indexOf(scriptletBlockOpen) > -1) { - lines[1] = 'void 0;'; - } - - return lines; - }, - - _jsIsScriptletCloseToken: function(item, prev) { - return item && item == '>' && prev == '%'; - }, - - _jsHandleScriptletWhitespace: function(scriptBlock) { + _jsHandleScriptletWhitespace(scriptBlock) { var contents = scriptBlock.contents; // Let's check to see if we have new new lines at the start // or end of a script block due to scriptlet blocks, ie: // // - // <% if() { %> + // <% if() { %> // ... // <% } %> // @@ -575,7 +568,29 @@ Formatter.HTML = Formatter.create( return scriptBlock; }, - _jsIterateRules: function(scriptBlock) { + _jsIgnoreEndNewlines(lines) { + var numLines = lines.length; + + if (lines[numLines - 2] === '' && lines[numLines - 3].indexOf('void 0; */') > -1) { + lines[numLines - 2] = 'void 0;'; + } + + return lines; + }, + + _jsIgnoreStartNewlines(lines) { + if (lines[1] === '' && lines[2].indexOf(scriptletBlockOpen) > -1) { + lines[1] = 'void 0;'; + } + + return lines; + }, + + _jsIsScriptletCloseToken(item, prev) { + return item && item == '>' && prev == '%'; + }, + + _jsIterateRules(scriptBlock) { var instance = this; var contents = scriptBlock.contents; @@ -587,28 +602,26 @@ Formatter.HTML = Formatter.create( var asyncAUIScript = tagNamespace && tagNamespace.indexOf('aui:') === 0 && scriptAttrs.indexOf('use="') > -1; - var logger = instance.log.bind(instance); - var re = instance._re; iterateLines( contents, - function(content, index) { - var rawContent = content; + (content, index) => { var lineNum = startLine + index; + var rawContent = content; content = content.trim(); var context = { - asyncAUIScript: asyncAUIScript, + asyncAUIScript, body: contents, - content: content, - file: file, + content, + file, fullMatch: match, - lineNum: lineNum, - rawContent: rawContent, - scriptAttrs: scriptAttrs, - tagNamespace: tagNamespace + lineNum, + rawContent, + scriptAttrs, + tagNamespace }; rawContent = re.iterateRules('htmlJS', context); @@ -618,33 +631,34 @@ Formatter.HTML = Formatter.create( return scriptBlock; }, - _jsLogFilter: function(item) { - var message = item.message; - + _jsLogFilter(item) { item.message = item.message.replace(/\b_PN_(\w+)\b/g, '$1'); return item; }, - _jsPadLines: function(scriptBlock, token) { - var prefix = new Array(scriptBlock.startLine).join(token + '\n'); + _jsPadLines(scriptBlock, token) { + var prefix = new Array(scriptBlock.startLine).join(`${token}\n`); scriptBlock.contents = prefix + scriptBlock.contents; return scriptBlock; }, - _jsRemoveScriptletBlocks: function(scriptBlock) { + _jsRemoveScriptletBlocks(scriptBlock) { var instance = this; var rescanBlocks = []; var contents = scriptBlock.contents; - contents = contents.replace(/\$\{.*?\}/g, jspLintStubs.elExpression) + contents = contents.replace( + /\$\{.*?\}/g, + (m, index, str) => jspLintStubs.elExpression + index + ) .replace( /<%[^>]+>/g, - function(m, index) { + (m, index) => { var len = m.length; var retVal = m; @@ -674,16 +688,12 @@ Formatter.HTML = Formatter.create( return scriptBlock; }, - _processAttrs: function(line, lineNum) { + _processAttrs(line, lineNum) { var instance = this; - var filePath = this.file; - - var prevLine = line; - line = line.replace( /<[^>]+>/g, - function(m, mi, str) { + (m, mi, str) => { var attrs = m.match(/(?: )?([A-Za-z0-9-]+=(["']).*?\2)/g); if (attrs) { @@ -692,7 +702,7 @@ Formatter.HTML = Formatter.create( var trackSort = {}; attrs = attrs.map( - function(item, index, collection) { + (item, index, collection) => { var oldItem = item; var pieces = item.trim().match(/^([^=]+)=(["'])(.*)\2$/); @@ -714,7 +724,7 @@ Formatter.HTML = Formatter.create( } ); - if (trackSort[true]) { + if (trackSort.true) { m = instance._sortAttrs(m, attrs); } } @@ -726,24 +736,24 @@ Formatter.HTML = Formatter.create( return line; }, - _sortAttrs: function(line, attrs) { + _sortAttrs(line, attrs) { var instance = this; var sortedAttrs = []; attrs.forEach( - function(item, index) { + (item, index) => { sortedAttrs.push(item); - line = line.replace(item, '__' + index + '__'); + line = line.replace(item, `__${index}__`); } ); sortedAttrs.sort(); sortedAttrs.forEach( - function(item, index) { - line = line.replace('__' + index + '__', item); + (item, index) => { + line = line.replace(`__${index}__`, item); } ); diff --git a/lib/js.js b/lib/js.js index 1b06bbe..26836a0 100644 --- a/lib/js.js +++ b/lib/js.js @@ -1,7 +1,6 @@ var _ = require('lodash'); var base = require('./base'); -var re = require('./re'); var REGEX = require('./regex'); @@ -14,13 +13,17 @@ var sub = require('string-sub'); var jsonf = _.bindKeyRight( JSON, 'stringify', - function(key, value) { + (key, value) => { + var retVal; + if (key === 'start' || key === 'end') { - return value.line; + retVal = value.line; } - if (['parent', 'range'].indexOf(key) === -1) { - return value; + else if (['parent', 'range'].indexOf(key) === -1) { + retVal = value; } + + return retVal; }, 4 ); @@ -31,18 +34,30 @@ Formatter.JS = Formatter.create( id: 'js', includes: /\.js$/, prototype: { - init: function() { + init() { this.processor = {}; }, - format: function(contents, lint) { + format(contents, lint) { var hasSheBang = this._hasSheBang(contents); if (hasSheBang) { - contents = '//' + contents; + contents = `//${contents}`; } - this._lint(contents, this.flags.lint !== false && lint); + var filePath = this.file; + + var re = this._re; + + var context = { + customIgnore: re.rules.js.IGNORE, + file: filePath, + fileConfig: this._config, + hasSheBang, + lintConfig: this.flags.lint !== false && lint + }; + + contents = this._lint(contents, context); if (this.flags.verbose) { this._processSyntax(contents); @@ -52,15 +67,9 @@ Formatter.JS = Formatter.create( contents = contents.substr(2, contents.length); } - var filePath = this.file; - - var logger = this.log.bind(this); - - var re = this._re; - - return iterateLines( + var newContents = iterateLines( contents, - function(content, index, collection) { + (content, index, collection) => { var rawContent = content; content = content.trim(); @@ -69,15 +78,10 @@ Formatter.JS = Formatter.create( var lineNum = index + 1; - var context = { - content: content, - customIgnore: re.rules.js.IGNORE, - file: filePath, - hasSheBang: hasSheBang, - lineNum: lineNum, - nextItem: collection[lineNum] && collection[lineNum].trim(), - rawContent: rawContent - }; + context.content = content; + context.lineNum = lineNum; + context.nextItem = collection[lineNum] && collection[lineNum].trim(); + context.rawContent = rawContent; rawContent = re.iterateRules('common', context); @@ -92,25 +96,39 @@ Formatter.JS = Formatter.create( return rawContent; } ); + + return newContents; }, - _hasSheBang: function(contents) { + _hasSheBang(contents) { return contents && contents[0] === '#' && contents[1] === '!'; }, - _lint: function(contents, lint) { + _lint(contents, context) { + var lint = context.lintConfig; + if (lint !== false) { - var linter = require('./lint'); + var linter = require('./lint_js'); + + lint = _.isObjectLike(lint) ? lint : {}; - var results = linter(contents, this.file, lint); + context.lintConfig = _.merge(lint, this.config('js.lint')); + + var lintResults = linter(contents, this.file, context); + + var results = lintResults.results; if (results.length) { this._logLintResults(results); + + contents = lintResults.contents; } } + + return contents; }, - _logLintResults: function(results) { + _logLintResults(results) { var instance = this; var lintLogFilter = instance.lintLogFilter; @@ -120,7 +138,7 @@ Formatter.JS = Formatter.create( } results.forEach( - function(item, index) { + (item, index) => { if (lintLogFilter) { item = lintLogFilter(item); } @@ -138,15 +156,13 @@ Formatter.JS = Formatter.create( ); }, - _printAsSource: function(contents) { + _printAsSource(contents) { return contents.split(REGEX.NEWLINE).map( - function(item, index) { - return (index + 1) + ' ' + item; - } + (item, index) => `${index + 1} ${item}` ).join('\n'); }, - _processSyntax: function(contents) { + _processSyntax(contents) { var instance = this; try { @@ -158,7 +174,7 @@ Formatter.JS = Formatter.create( loc: true, tolerant: true }, - function(node) { + node => { var parent = node.parent; var type = node.type; diff --git a/lib/junit.js b/lib/junit.js index bea55d1..f402783 100644 --- a/lib/junit.js +++ b/lib/junit.js @@ -1,35 +1,34 @@ +'use strict'; + var _ = require('lodash'); -var fs = require('fs'); var Handlebars = require('content-logger-handlebars-helpers')(); var path = require('path'); +var Promise = require('bluebird'); -var base = require('./base'); -var Logger = require('./logger'); - -var A = base.A; +var fs = Promise.promisifyAll(require('fs')); -var JUnitReporter = function(config) { - this.flags = config.flags || {}; - this.logger = config.logger || Logger; - this.read = config.read || fs.readFile.bind(fs); - this.write = config.write || fs.writeFile.bind(fs); -}; +var Logger = require('./logger'); -JUnitReporter.prototype = { - TPL_PATH: path.join(__dirname, 'tpl', 'junit_report.tpl'), +class JUnitReporter { + constructor(config) { + this.flags = config.flags || {}; + this.logger = config.logger || Logger; + this.read = config.read || fs.readFileAsync.bind(fs); + this.write = config.write || fs.writeFileAsync.bind(fs); + } - generate: function(done) { - this.read(this.TPL_PATH, 'utf-8', _.bindRight(this.onRead, this, done)); - }, + generate() { + return this.read(this.TPL_PATH, 'utf-8').then(this.onRead.bind(this)); + } - getContext: function() { - var flags = this.flags; - var logger = this.logger; + getContext() { + const flags = this.flags; + const logger = this.logger; - var fileErrors = logger.getErrors(); - var testStats = logger.testStats; + const fileErrors = logger.getErrors(); + const testStats = logger.testStats; - var result = { + const result = { files: [], showLintIds: flags['lint-ids'], stats: testStats @@ -37,14 +36,19 @@ JUnitReporter.prototype = { _.forEach( fileErrors, - function(fileErrors, fileName) { - var errors = []; + (fileErrors, fileName) => { + const errors = []; - fileErrors = _.reject(fileErrors, {type: 'ignored'}); + fileErrors = _.reject( + fileErrors, + { + type: 'ignored' + } + ); _.forEach( _.groupBy(fileErrors, 'type'), - function(violations, violationType) { + (violations, violationType) => { errors.push( { failure: { @@ -57,8 +61,8 @@ JUnitReporter.prototype = { } ); - var fileResult = { - errors: errors, + const fileResult = { + errors, file: fileName, stats: { failures: fileErrors.length @@ -70,32 +74,34 @@ JUnitReporter.prototype = { ); return result; - }, + } - getOutputPath: function() { - var outputPath = this.flags.junit; + getOutputPath() { + let outputPath = this.flags.junit; if (!_.isString(outputPath)) { outputPath = 'result.xml'; } return outputPath; - }, + } - onRead: function(err, result, done) { - var context = this.getContext(); - var outputPath = this.getOutputPath(); + onRead(result) { + const context = this.getContext(); + const outputPath = this.getOutputPath(); - var xml = this.renderTPL(result, context); + const xml = this.renderTPL(result, context); - this.write(outputPath, xml, done); - }, + return this.write(outputPath, xml); + } - renderTPL: function(tpl, context) { - var xmlTpl = Handlebars.compile(tpl); + renderTPL(tpl, context) { + const xmlTpl = Handlebars.compile(tpl); return xmlTpl(context); } -}; +} + +JUnitReporter.prototype.TPL_PATH = path.join(__dirname, 'tpl', 'junit_report.tpl'); module.exports = JUnitReporter; \ No newline at end of file diff --git a/lib/lint.js b/lib/lint.js deleted file mode 100644 index b9052c3..0000000 --- a/lib/lint.js +++ /dev/null @@ -1,58 +0,0 @@ -var _ = require('lodash'); -var eslint = require('eslint'); -var ESLINT_CONFIG = require('./eslint_config'); -var glob = require('glob'); -var path = require('path'); - -var customRules = {}; - -var convertNameToRuleId = function(item) { - var baseName = path.basename(item, '.js'); - - return 'csf-' + baseName.replace(/_/g, '-'); -}; - -var runLinter = function(contents, file, customRules, config) { - eslint.linter.defineRules(customRules); - - if (_.isObject(config)) { - Object.keys(ESLINT_CONFIG).forEach( - function(item, index) { - var configItem = _.namespace(config, item); - - _.defaults(configItem, ESLINT_CONFIG[item]); - } - ); - } - else { - config = ESLINT_CONFIG; - } - - return eslint.linter.verify(contents, config, file); -}; - -var globOptions = { - cwd: __dirname -}; - -module.exports = function(contents, file, config) { - glob.sync( - './lint_rules/*.js', - globOptions - ).forEach( - function(item, index) { - var id = convertNameToRuleId(item); - - customRules[id] = require(item); - } - ); - - eslint.linter.defineRules(customRules); - - return runLinter(contents, file, customRules, config); -}; - -module.exports.convertNameToRuleId = convertNameToRuleId; -module.exports.eslint = eslint; -module.exports.linter = eslint.linter; -module.exports.runLinter = runLinter; \ No newline at end of file diff --git a/lib/lint_css.js b/lib/lint_css.js new file mode 100644 index 0000000..e1ed69f --- /dev/null +++ b/lib/lint_css.js @@ -0,0 +1,62 @@ +var _ = require('lodash'); +var glob = require('glob'); +var path = require('path'); +var stylelint = require('stylelint'); + +var STYLELINT_CONFIG = require('./config/stylelint'); + +var ruleUtils = require('./rule_utils'); + +var customRules = {}; + +var runLinter = (contents, file, context) => { + var customRules = context.customRules || {}; + + _.merge(stylelint.rules, customRules); + + var config = context.lintConfig; + + var configs = [{}, STYLELINT_CONFIG]; + + if (_.isObject(config)) { + configs.push(config); + } + + config = _.merge(...configs); + + return stylelint.lint( + { + code: contents, + codeFileName: file, + config, + configBasedir: path.resolve(__dirname, '..'), + formatter: 'json', + syntax: 'scss' + } + ); +}; + +var globOptions = { + cwd: __dirname +}; + +module.exports = (contents, file, context) => { + context.customRules = customRules; + + glob.sync( + './lint_css_rules/*.js', + globOptions + ).forEach( + (item, index) => { + var id = ruleUtils.getRuleId(item); + + customRules[id] = require(item); + } + ); + + return runLinter(contents, file, context); +}; + +module.exports.stylelint = stylelint; +module.exports.linter = stylelint.linter; +module.exports.runLinter = runLinter; \ No newline at end of file diff --git a/lib/lint_css_rules/at_rule_empty_line.js b/lib/lint_css_rules/at_rule_empty_line.js new file mode 100644 index 0000000..4a36fd4 --- /dev/null +++ b/lib/lint_css_rules/at_rule_empty_line.js @@ -0,0 +1,89 @@ +var _ = require('lodash'); +var stylelint = require('stylelint'); + +var ruleUtils = require('../rule_utils'); + +var ruleName = ruleUtils.getRuleId(__filename); + +var slUtils = stylelint.utils; + +/* istanbul ignore next */ +var jsonf = _.bindKeyRight( + JSON, + 'stringify', + (key, value) => { + var retVal; + + if (key === 'start' || key === 'end') { + retVal = value.line; + } + else if (['parent', 'range'].indexOf(key) === -1) { + retVal = value; + } + + return retVal; + }, + 4 +); + +module.exports = (expectation, options, context) => { + var atRuleFn = stylelint.rules['at-rule-empty-line-before'](expectation, options, context || {}); + + return (root, result) => { + var validOptions = slUtils.validateOptions( + result, + ruleName, + { + actual: expectation, + possible: ['always', 'never'] + }, + { + actual: options, + possible: { + except: ['first-nested'], + ignore: ['between-nested'] + }, + + optional: true + } + ); + + var getLineDistance = (left, right) => right.source.start.line - left.source.end.line; + + var isSingleLineRule = node => node.source.start.line === node.source.end.line; + + var validLines = []; + + if (validOptions) { + atRuleFn(root, result); + + root.walkAtRules( + node => { + if (node !== root.first) { + var startLine = node.source.start.line; + + if (node.name === 'include' || node.name === 'import') { + var prev = node.prev(); + + if (prev && prev.type === 'atrule' && isSingleLineRule(node) && isSingleLineRule(prev) && getLineDistance(prev, node) === 1) { + validLines.push(startLine); + } + } + else if (node.name === 'else') { + validLines.push(startLine); + } + } + } + ); + } + + result.messages = _.reject( + result.messages, + (item, index) => item.rule === 'at-rule-empty-line-before' && _.includes(validLines, item.line) + ); + + return result; + }; +}; + +module.exports.ruleName = ruleName; \ No newline at end of file diff --git a/lib/lint_js.js b/lib/lint_js.js new file mode 100644 index 0000000..7f04337 --- /dev/null +++ b/lib/lint_js.js @@ -0,0 +1,151 @@ +var _ = require('lodash'); +var eslint = require('eslint'); +var glob = require('glob'); +var path = require('path'); + +var SourceCodeFixer = require('eslint/lib/util/source-code-fixer'); + +var ruleUtils = require('./rule_utils'); + +var ESLINT_CONFIG = require('./config/eslint'); + +var customRules = {}; + +var reactRules = require('eslint-plugin-react').rules; + +_.defaults(customRules, reactRules); + +var loadPlugin = (pluginName, configPath) => { + var rules; + + if (pluginName !== 'react') { + if (pluginName.indexOf('eslint-plugin-') === -1) { + pluginName = `eslint-plugin-${pluginName}`; + } + + var baseName = pluginName.replace('eslint-plugin-', ''); + + if (pluginName.indexOf('/') !== -1) { + baseName = path.basename(baseName); + + if (configPath && !path.isAbsolute(pluginName)) { + pluginName = path.resolve(configPath, pluginName); + } + } + + try { + rules = require(pluginName).rules; + } + catch (e) { + } + + if (rules) { + rules = _.mapKeys( + rules, + (item, index) => `${baseName}/${index}` + ); + + eslint.linter.defineRules(rules); + } + } + + return rules; +}; + +var runLinter = (contents, file, context) => { + var customRules = context.customRules || {}; + + eslint.linter.defineRules(customRules); + + var config = context.lintConfig; + + // The ecmaVersion variable is undefined here if no config was found + // But it's being used now for it's side effects + // because we're defaulting the parser to es7 so it doesn't error out + // but if it's specified in the config, we add the special + // es6 lint rule set + + var ecmaVersion = _.get(config, 'parserOptions.ecmaVersion'); + + var configs = [{}, ESLINT_CONFIG]; + + if (ecmaVersion > 5) { + var es6Config = require('./config/eslint_es6'); + + configs.push(es6Config); + } + + if (_.isObject(config)) { + configs.push(config); + } + + configs.push( + (objValue, srcValue, key) => { + var retVal; + + if (key === 'plugins' && _.isArray(objValue) && _.isArray(srcValue)) { + retVal = objValue.concat(srcValue); + } + + return retVal; + } + ); + + config = _.mergeWith(...configs); + + if (config.plugins) { + var configPath = _.get(context, 'fileConfig._paths.obj.filepath'); + + if (configPath) { + configPath = path.dirname(configPath); + } + + config.plugins.forEach( + (item, index) => { + loadPlugin(item, configPath); + } + ); + } + + var results = eslint.linter.verify(contents, config, file); + + if (results.length) { + var fixedContent = SourceCodeFixer.applyFixes(contents, results); + + if (fixedContent.fixed) { + contents = fixedContent.output; + } + } + + return { + contents, + results + }; +}; + +var globOptions = { + cwd: __dirname +}; + +module.exports = (contents, file, context) => { + context.customRules = customRules; + + glob.sync( + './lint_js_rules/*.js', + globOptions + ).forEach( + (item, index) => { + var id = ruleUtils.getRuleId(item); + + customRules[id] = require(item); + } + ); + + // eslint.linter.defineRules(customRules); + + return runLinter(contents, file, context); +}; + +module.exports.eslint = eslint; +module.exports.linter = eslint.linter; +module.exports.runLinter = runLinter; \ No newline at end of file diff --git a/lib/lint_js_rules/array_spacing.js b/lib/lint_js_rules/array_spacing.js new file mode 100644 index 0000000..fd20af0 --- /dev/null +++ b/lib/lint_js_rules/array_spacing.js @@ -0,0 +1,50 @@ +var _ = require('lodash'); + +var REGEX = require('../regex'); + +var sub = require('string-sub'); + +var isSingleLine = node => node.loc.start.line === node.loc.end.line; + +module.exports = context => ({ + ArrayExpression(node) { + var source = context.getSource(node); + + if (isSingleLine(node) && REGEX.ARRAY_SURROUNDING_SPACE.test(source)) { + var brackets = []; + var surroundingSpaceTypes = []; + + source.replace( + REGEX.ARRAY_SURROUNDING_SPACE, + (item, index, str) => { + var endIndex = str.length; + var startIndex = 0; + + var leadingSpace = item.indexOf('[') > -1; + + if (leadingSpace) { + endIndex = index + 1; + surroundingSpaceTypes.push('leading'); + } + else { + startIndex = index + 1; + surroundingSpaceTypes.push('trailing'); + brackets.push('...'); + } + + brackets.push(str.substring(startIndex, endIndex)); + + if (leadingSpace) { + brackets.push('...'); + } + } + ); + + brackets = _.uniq(brackets); + + var message = sub('Remove {0} spaces: {1}', surroundingSpaceTypes.join(' and '), brackets.join(' ')); + + context.report(node, message); + } + } +}); \ No newline at end of file diff --git a/lib/lint_js_rules/array_spacing_chars.js b/lib/lint_js_rules/array_spacing_chars.js new file mode 100644 index 0000000..6d3f733 --- /dev/null +++ b/lib/lint_js_rules/array_spacing_chars.js @@ -0,0 +1,30 @@ +var sub = require('string-sub'); + +var REGEX = require('../regex'); + +var isSingleLine = node => node.loc.start.line === node.loc.end.line; + +module.exports = context => ({ + ArrayExpression(node) { + if (isSingleLine(node)) { + var source = context.getSource(node); + + var tmpSource = source.replace(/(['"]).*?\1/g, '$1$1'); + + if (REGEX.ARRAY_INTERNAL_SPACE.test(tmpSource)) { + var missingSpaces = []; + + source.replace( + REGEX.ARRAY_INTERNAL_SPACE, + (item, index, str) => { + missingSpaces.push(item.replace('\t', '\\t')); + } + ); + + var message = sub('Array items should be separated by exactly one space:{0}', missingSpaces.join('')); + + context.report(node, message); + } + } + } +}); \ No newline at end of file diff --git a/lib/lint_js_rules/catch_arg_name.js b/lib/lint_js_rules/catch_arg_name.js new file mode 100644 index 0000000..bc424bc --- /dev/null +++ b/lib/lint_js_rules/catch_arg_name.js @@ -0,0 +1,13 @@ +var sub = require('string-sub'); + +module.exports = context => ({ + CatchClause(node) { + var paramName = node.param.name; + + if (paramName != 'e') { + var message = sub('Catch statement param should be "e", not "{0}"', paramName); + + context.report(node, message); + } + } +}); \ No newline at end of file diff --git a/lib/lint_js_rules/catch_format.js b/lib/lint_js_rules/catch_format.js new file mode 100644 index 0000000..bbd3392 --- /dev/null +++ b/lib/lint_js_rules/catch_format.js @@ -0,0 +1,16 @@ +var sub = require('string-sub'); + +module.exports = context => ({ + CatchClause(node) { + var end = node.loc.end.line; + var start = node.loc.start.line; + + var shouldEnd = start + 1; + + if (!node.body.body.length && end != shouldEnd) { + var message = sub('Empty catch statement should be closed on line {0}', shouldEnd); + + context.report(node, message); + } + } +}); \ No newline at end of file diff --git a/lib/lint_js_rules/dot_notation.js b/lib/lint_js_rules/dot_notation.js new file mode 100644 index 0000000..d3a4f62 --- /dev/null +++ b/lib/lint_js_rules/dot_notation.js @@ -0,0 +1,14 @@ +var REGEX = require('../regex'); + +module.exports = context => ({ + MemberExpression(node) { + var propertyType = node.property.type; + var propertyValue = node.property.value; + + if (propertyType === 'Literal' && !REGEX.STUBS.test(propertyValue)) { + var dotNotation = require('eslint/lib/rules/dot-notation'); + + dotNotation.create(context).MemberExpression(node); + } + } +}); \ No newline at end of file diff --git a/lib/lint_rules/format_args.js b/lib/lint_js_rules/format_args.js similarity index 65% rename from lib/lint_rules/format_args.js rename to lib/lint_js_rules/format_args.js index 7802b1d..8da42dc 100644 --- a/lib/lint_rules/format_args.js +++ b/lib/lint_js_rules/format_args.js @@ -1,10 +1,13 @@ var _ = require('lodash'); -var base = require('../base'); var sub = require('string-sub'); -module.exports = function(context) { - var getAnonymousFnName = function(fnName) { +module.exports = context => { + var isFunctionExpression = type => _.endsWith(type, 'FunctionExpression'); + + var isCallable = type => isFunctionExpression(type) || type === 'CallExpression'; + + var getAnonymousFnName = fnName => { if (!fnName) { fnName = ''; } @@ -12,16 +15,32 @@ module.exports = function(context) { return fnName; }; - var getFnExpLines = function(lineBounds, node) { - var end = getLineBounds(node, 'end'); - var start = end; + var getFnExpLines = (lineBounds, node) => { + var end = lineBounds.end; + var start = lineBounds.start; - node.arguments.forEach( - function(item, index) { - start = item.loc.start.line; - end = item.loc.end.line; - } - ); + if (node.callee && isFunctionExpression(node.callee.type)) { + start = end; + } + + if (node.arguments && node.arguments.length) { + node.arguments.forEach( + (item, index) => { + var type = item.type; + + if (isCallable(type)) { + var argLineBounds = getFnLines(item); + + start = Math.min(argLineBounds.start, start); + end = Math.max(argLineBounds.end, end); + } + else { + start = item.loc.start.line; + end = item.loc.end.line; + } + } + ); + } lineBounds.end = end; lineBounds.start = start; @@ -29,19 +48,21 @@ module.exports = function(context) { return lineBounds; }; - var getFnLines = function(node) { - var callee = node.callee; - + var getFnLines = node => { var lineBounds = getLineBounds(node); - var type = callee.type; + var callee = node.callee; - if (type === 'FunctionExpression') { - lineBounds = getFnExpLines(lineBounds, node); - } - else if (type === 'MemberExpression') { - lineBounds.end = getLineBounds(node, 'end'); - lineBounds.start = getLineBounds(callee, 'end'); + if (callee) { + var type = callee.type; + + if (isCallable(type)) { + lineBounds = getFnExpLines(lineBounds, node); + } + else if (type === 'MemberExpression') { + lineBounds.end = getLineBounds(node, 'end'); + lineBounds.start = getLineBounds(callee, 'end'); + } } lineBounds.multi = (lineBounds.end > lineBounds.start); @@ -49,7 +70,7 @@ module.exports = function(context) { return lineBounds; }; - var getFnName = function(callee) { + var getFnName = callee => { var fnName = callee.name; if (!fnName && callee.id) { @@ -58,17 +79,20 @@ module.exports = function(context) { var type = callee.type; - if (type === 'FunctionExpression') { + if (isFunctionExpression(type)) { fnName = getAnonymousFnName(fnName); } else if (type === 'MemberExpression') { fnName = getMethodName(callee); } + else if (type === 'CallExpression') { + fnName = callee.callee.name; + } return fnName; }; - var getLineBounds = function(loc, prop) { + var getLineBounds = (loc, prop) => { var val = {}; loc = loc.loc || loc; @@ -83,7 +107,7 @@ module.exports = function(context) { return val; }; - var getMethodName = function(callee) { + var getMethodName = callee => { var fnName = callee.property.name; if (!fnName && callee.object.callee) { @@ -93,11 +117,11 @@ module.exports = function(context) { return fnName; }; - var getMultiLineError = function(error, loc, options) { - var argStart = loc.start; + var getMultiLineError = (error, loc, options) => { var argEnd = loc.end; - var fnStart = options.start; + var argStart = loc.start; var fnEnd = options.end; + var fnStart = options.start; if (options.multi) { if (argStart === fnStart) { @@ -111,10 +135,10 @@ module.exports = function(context) { return error; }; - var logArgError = function(fnLines, fnName, node) { + var logArgError = (fnLines, fnName, node) => { var message; - var obj = processArgs(node.arguments, fnLines); + var obj = processArgs(node.arguments, fnLines, node); var error = obj.error; @@ -125,28 +149,26 @@ module.exports = function(context) { } }; - var processArgs = function(args, options) { + var processArgs = (args, options, node) => { var obj = {}; - var fnStart = options.start; - var fnEnd = options.end; - var multiLineFn = options.multi; - var lastArgStartLine = 0; var lastArgEndLine = 0; + var lastArgStartLine = 0; var hasNonEmptyFunctionArg = false; var hasNonEmptyObjectArg = false; - var testLineEndings = false; - var argLineStarts = []; var argLineEnds = []; + var argLineStarts = []; + + var testLineEndings = false; var error = ''; args.forEach( - function(item, index) { + (item, index) => { var type = item.type; var loc = getLineBounds(item.loc); @@ -154,13 +176,13 @@ module.exports = function(context) { var argStart = loc.start; var argEnd = loc.end; - argLineStarts.push(argStart); argLineEnds.push(argEnd); + argLineStarts.push(argStart); if (type === 'FunctionExpression' && item.body.body.length) { hasNonEmptyFunctionArg = true; } - else if (type === 'ObjectExpression' && item.properties.length) { + else if (type === 'ObjectExpression' && item.properties.length && _.findIndex(item.properties, ['shorthand', true]) === -1) { hasNonEmptyObjectArg = true; } @@ -170,8 +192,8 @@ module.exports = function(context) { testLineEndings = true; } - lastArgStartLine = argStart; lastArgEndLine = argEnd; + lastArgStartLine = argStart; } ); @@ -192,11 +214,11 @@ module.exports = function(context) { }; return { - CallExpression: function(node) { + CallExpression(node) { var callee = node.callee; - var fnName = getFnName(callee); var fnLines = getFnLines(node); + var fnName = getFnName(callee); if (node.arguments.length) { logArgError(fnLines, fnName, node); diff --git a/lib/lint_rules/format_constants.js b/lib/lint_js_rules/format_constants.js similarity index 74% rename from lib/lint_rules/format_constants.js rename to lib/lint_js_rules/format_constants.js index 799d1fa..a45100a 100644 --- a/lib/lint_rules/format_constants.js +++ b/lib/lint_js_rules/format_constants.js @@ -1,12 +1,11 @@ -var base = require('../base'); var utils = require('../rule_utils'); -module.exports = function(context) { - var checkDistance = function(node) { +module.exports = context => { + var checkDistance = node => { var constants = utils.getConstants(node); constants.forEach( - function(item, index, coll) { + (item, index, coll) => { var prev = coll[index - 1]; if (prev) { diff --git a/lib/lint_js_rules/format_multiline_vars.js b/lib/lint_js_rules/format_multiline_vars.js new file mode 100644 index 0000000..faef4ae --- /dev/null +++ b/lib/lint_js_rules/format_multiline_vars.js @@ -0,0 +1,132 @@ +var findFirstofLastLine = (tokens, line) => { + var firstOfLast = null; + + var len = tokens.length; + + for (var i = 0; i < len; i++) { + var token = tokens[i]; + + if (token.loc.start.line === line) { + firstOfLast = token; + + break; + } + } + + return firstOfLast; +}; + +var isSameColumn = (a, b, requireKeyword) => { + var inc = requireKeyword ? 3 : 0; + + return a.loc.start.column === (b.loc.start.column + inc); +}; + +var isSameLine = (a, b) => a.loc.start.line === b.loc.start.line; + +module.exports = context => { + var checkEndColumn = (declaration, init, node) => { + var decLoc = declaration.loc; + var decStart = decLoc.start; + + if (init.type === 'BinaryExpression' && + init.operator === '+' && + decLoc.end.line > decStart.line && + !isSameColumn(declaration, init.right)) { + + var tokens = context.getTokens(node); + + var firstOfLast = findFirstofLastLine(tokens, decLoc.end.line); + + var assignmentExpression = (node.type === 'AssignmentExpression'); + + if (!isSameColumn(declaration, firstOfLast, !assignmentExpression)) { + var id = assignmentExpression ? declaration.left : declaration.id; + + context.report( + node, + 'Multi-line strings should be aligned to the start of the variable name "{{identifier}}"', + { + identifier: id.name + } + ); + } + } + }; + + var checkStartLine = (id, init, node) => { + var allowedFormat = isSameLine(id, init); + + if (!allowedFormat) { + var info = { + identifier: id.name + }; + + var message = 'Variable values should start on the same line as the variable name "{{identifier}}"'; + + if (init.type === 'LogicalExpression' || init.type === 'JSXElement') { + var token = context.getTokenBefore(init); + + allowedFormat = (token.value === '(' && isSameLine(id, token)); + } + else if (id.type === 'ObjectPattern' || id.type === 'ArrayPattern') { + var endToken = context.getLastToken(id); + var startToken = context.getFirstToken(id); + + var keywordToken = context.getTokenBefore(id); + + var endOnSameLineAsInit = isSameLine(init, endToken); + var startOnSameLineAsKeyword = isSameLine(keywordToken, startToken); + + allowedFormat = startOnSameLineAsKeyword && endOnSameLineAsInit; + + if (!allowedFormat) { + info = { + endToken: endToken.value, + initName: init.name || context.getSourceCode().getText(init), + keywordToken: keywordToken.value, + startToken: startToken.value + }; + + if (!startOnSameLineAsKeyword && !endOnSameLineAsInit) { + message = 'Destructured assignments should have "{{startToken}}" on the same line as "{{keywordToken}}" and "{{endToken}}" should be on the same line as "{{initName}}"'; + } + else if (!startOnSameLineAsKeyword) { + message = 'Destructured assignments should have "{{startToken}}" on the same line as "{{keywordToken}}"'; + } + else { + message = 'Destructured assignments should have "{{endToken}}" on the same line as "{{initName}}"'; + } + } + } + + if (!allowedFormat) { + context.report( + node, + message, + info + ); + } + } + }; + + return { + AssignmentExpression(node) { + checkStartLine(node.left, node.right, node); + checkEndColumn(node, node.right, node); + }, + + VariableDeclaration(node) { + var declarations = node.declarations; + + var dec = declarations[0]; + var decId = dec.id; + var decInit = dec.init; + + if (decInit) { + checkStartLine(decId, decInit, node); + checkEndColumn(dec, decInit, node); + } + } + }; +}; \ No newline at end of file diff --git a/lib/lint_js_rules/function_spacing.js b/lib/lint_js_rules/function_spacing.js new file mode 100644 index 0000000..8574db9 --- /dev/null +++ b/lib/lint_js_rules/function_spacing.js @@ -0,0 +1,88 @@ +var utils = require('../rule_utils'); + +var sub = require('string-sub'); + +module.exports = { + create(context) { + var testFunctionSpacing = node => { + var nodeBody = node.body; + + var fnBody = nodeBody.body; + + var range = []; + + var sourceCode = context.getSourceCode(); + + function fix(fixer) { + return fixer.replaceTextRange(range, '\n'); + } + + if (fnBody.length) { + var firstStatement = fnBody[0]; + var lastStatement = fnBody[fnBody.length - 1]; + + var leadingComments = sourceCode.getComments(firstStatement).leading; + var trailingComments = sourceCode.getComments(lastStatement).trailing; + + var startLineDistance = utils.getLineDistance(nodeBody, firstStatement, 'start'); + + if (leadingComments.length) { + var firstLeadingComment = leadingComments[0]; + var lastLeadingComment = leadingComments[leadingComments.length - 1]; + + var startCommentAfterDistance = utils.getLineDistance(lastLeadingComment, firstStatement, 'start'); + var startCommentBeforeDistance = utils.getLineDistance(nodeBody, firstLeadingComment, 'start'); + + startLineDistance = Math.max(startCommentBeforeDistance, startCommentAfterDistance); + } + + if (startLineDistance !== 1) { + range[0] = sourceCode.getFirstToken(nodeBody).range[1]; + range[1] = sourceCode.getFirstToken(firstStatement).range[0] - 1; + + context.report( + { + fix, + message: sub('There should be exactly one line between the start of the function and the first statement, not {0} lines', startLineDistance), + node + } + ); + } + + var endLineDistance = utils.getLineDistance(lastStatement, nodeBody, 'end', 'end'); + + if (trailingComments.length) { + var firstTrailingComment = trailingComments[0]; + var lastTrailingComment = trailingComments[trailingComments.length - 1]; + + var endCommentAfterDistance = utils.getLineDistance(lastTrailingComment, nodeBody, 'end', 'end'); + var endCommentBeforeDistance = utils.getLineDistance(lastStatement, firstTrailingComment, 'end', 'end'); + + endLineDistance = Math.max(endCommentBeforeDistance, endCommentAfterDistance); + } + + if (endLineDistance !== 1) { + range[0] = sourceCode.getLastToken(lastStatement).range[1]; + range[1] = sourceCode.getLastToken(nodeBody).range[0]; + + context.report( + { + fix, + message: sub('There should be exactly one line between the last statement and the end of the function, not {0} lines', endLineDistance), + node: lastStatement + } + ); + } + } + }; + + return { + FunctionDeclaration: testFunctionSpacing, + FunctionExpression: testFunctionSpacing + }; + }, + + meta: { + fixable: 'whitespace' + } +}; \ No newline at end of file diff --git a/lib/lint_rules/liferay_language_get.js b/lib/lint_js_rules/liferay_language_get.js similarity index 80% rename from lib/lint_rules/liferay_language_get.js rename to lib/lint_js_rules/liferay_language_get.js index 989308f..8f3b966 100644 --- a/lib/lint_rules/liferay_language_get.js +++ b/lib/lint_js_rules/liferay_language_get.js @@ -1,12 +1,10 @@ -module.exports = function(context) { +module.exports = context => { var REGEX_STRING = /^(['"]).*\1$/; - var isMemberExpression = function(obj) { - return obj.type === 'MemberExpression'; - }; + var isMemberExpression = obj => obj.type === 'MemberExpression'; return { - CallExpression: function(node) { + CallExpression(node) { var callee = node.callee; if (isMemberExpression(callee) && isMemberExpression(callee.object) && callee.object.object.name === 'Liferay' && callee.object.property.name === 'Language' && callee.property.name === 'get') { diff --git a/lib/lint_js_rules/liferay_provide_format.js b/lib/lint_js_rules/liferay_provide_format.js new file mode 100644 index 0000000..c6075d2 --- /dev/null +++ b/lib/lint_js_rules/liferay_provide_format.js @@ -0,0 +1,45 @@ +module.exports = context => ({ + CallExpression(node) { + var callee = node.callee; + + if (callee.type === 'MemberExpression' && callee.object.name === 'Liferay' && callee.property.name === 'provide') { + var args = node.arguments; + + if (args.length < 4) { + context.report(node, 'Missing dependencies (don\'t use Liferay.provide to create regular functions).'); + } + else { + var arg0 = args[0]; + var arg1 = args[1]; + var arg2 = args[2]; + var arg3 = args[3]; + + var arg0Type = arg0.type; + var arg1Type = arg1.type; + var arg2Type = arg2.type; + var arg3Type = arg3.type; + + if (arg0Type !== 'Identifier' && arg0Type !== 'MemberExpression') { + context.report(arg0, 'Liferay.provide expects an object as the first argument.'); + } + + if (arg1Type !== 'Identifier' && typeof arg1.value !== 'string') { + context.report(arg1, 'Liferay.provide expects a string as the second argument.'); + } + + if (arg2Type !== 'Identifier' && arg2Type !== 'FunctionExpression') { + context.report(arg2, 'Liferay.provide expects a function as the third argument.'); + } + + var arg3TypeExpression = arg3Type === 'CallExpression'; + + if (arg3Type !== 'Identifier' && arg3Type !== 'ArrayExpression' && !arg3TypeExpression || arg3TypeExpression && arg3.callee.object.type !== 'ArrayExpression') { + context.report(arg3, 'Liferay.provide expects an array as the last argument.'); + } + else if (arg3Type === 'ArrayExpression' && !arg3.elements.length) { + context.report(arg3, 'Liferay.provide dependencies should have at least one dependency.'); + } + } + } + } +}); \ No newline at end of file diff --git a/lib/lint_js_rules/multiple_vars.js b/lib/lint_js_rules/multiple_vars.js new file mode 100644 index 0000000..012c063 --- /dev/null +++ b/lib/lint_js_rules/multiple_vars.js @@ -0,0 +1,17 @@ +var sub = require('string-sub'); + +module.exports = context => ({ + VariableDeclaration(node) { + var declarations = node.declarations; + + if (declarations.length > 1) { + var vars = declarations.map( + (item, index) => item.id.name + ); + + var message = sub('Each variable should have it\'s own var statement: {0}', vars.join(', ')); + + context.report(node, message); + } + } +}); \ No newline at end of file diff --git a/lib/lint_js_rules/no_extra_semi.js b/lib/lint_js_rules/no_extra_semi.js new file mode 100644 index 0000000..a5b77aa --- /dev/null +++ b/lib/lint_js_rules/no_extra_semi.js @@ -0,0 +1,9 @@ +module.exports = context => ({ + EmptyStatement(node) { + var afterText = context.getSource(node, 0, 10); + + if (afterText !== ';(function(') { + context.report(node, 'Unnecessary semicolon.'); + } + } +}); \ No newline at end of file diff --git a/lib/lint_rules/no_is_prefix.js b/lib/lint_js_rules/no_is_prefix.js similarity index 82% rename from lib/lint_rules/no_is_prefix.js rename to lib/lint_js_rules/no_is_prefix.js index 71f6d3c..b7043a7 100644 --- a/lib/lint_rules/no_is_prefix.js +++ b/lib/lint_js_rules/no_is_prefix.js @@ -1,16 +1,14 @@ -var base = require('../base'); - var REGEX = require('../regex'); var sub = require('string-sub'); -module.exports = function(context) { - var checkProcessVars = function(node) { +module.exports = context => { + var checkProcessVars = node => { var value = node.value; var valueType = value.type; - var propValueMemberExp = (valueType === 'MemberExpression'); var propValueIdentifier = (valueType === 'Identifier'); + var propValueMemberExp = (valueType === 'MemberExpression'); var processVars = true; @@ -27,7 +25,7 @@ module.exports = function(context) { return processVars; }; - var testVarNames = function(varName, node) { + var testVarNames = (varName, node) => { var pass = true; if (REGEX.VAR_IS.test(varName)) { @@ -38,11 +36,11 @@ module.exports = function(context) { return pass; }; - var testFunctionParams = function(node) { + var testFunctionParams = node => { var params = node.params; params.forEach( - function(item, index) { + (item, index) => { testVarNames(item.name, node); } ); @@ -53,7 +51,7 @@ module.exports = function(context) { FunctionDeclaration: testFunctionParams, - Property: function(node) { + Property(node) { if (node.value.type !== 'FunctionExpression') { var processVars = checkProcessVars(node); @@ -63,9 +61,9 @@ module.exports = function(context) { } }, - VariableDeclaration: function(node) { + VariableDeclaration(node) { node.declarations.forEach( - function(item, index) { + (item, index) => { var process = true; var varName = item.id.name; diff --git a/lib/lint_js_rules/no_multiple_return.js b/lib/lint_js_rules/no_multiple_return.js new file mode 100644 index 0000000..0aa8db8 --- /dev/null +++ b/lib/lint_js_rules/no_multiple_return.js @@ -0,0 +1,49 @@ +module.exports = { + meta: { + docs: { + category: 'Fill me in', + description: 'Enforces keeping a single return within a function', + recommended: false + }, + fixable: null, + schema: [] + }, + + create(context) { + var funcInfo = null; + + var checkReturns = node => { + if (funcInfo.returnCount > 1) { + context.report( + { + message: 'Functions should only have one return statement', + node + } + ); + } + }; + + return { + 'ArrowFunctionExpression:exit': checkReturns, + 'FunctionDeclaration:exit': checkReturns, + 'FunctionExpression:exit': checkReturns, + + onCodePathStart(codePath) { + funcInfo = { + returnCount: 0, + upper: funcInfo + }; + }, + + onCodePathEnd() { + funcInfo = funcInfo.upper; + }, + + 'Program:exit': checkReturns, + + ReturnStatement(node) { + funcInfo.returnCount += 1; + } + }; + } +}; \ No newline at end of file diff --git a/lib/lint_js_rules/no_undef.js b/lib/lint_js_rules/no_undef.js new file mode 100644 index 0000000..e67f46f --- /dev/null +++ b/lib/lint_js_rules/no_undef.js @@ -0,0 +1,44 @@ +var _ = require('lodash'); + +var base = require('../base'); +var stubs = base.stubs; + +module.exports = context => { + var noUndef = require('eslint/lib/rules/no-undef').create; + + var collectedReport = []; + + var mockContext = { + report(obj) { + collectedReport.push(obj); + } + }; + + _.defaults( + mockContext, + context, + { + options: context.options + } + ); + + return { + 'Program:exit': function(node) { + noUndef(mockContext)['Program:exit'](node); + + collectedReport.forEach( + (item, index) => { + var name = item.node.name; + + if (/_EL_EXPRESSION_\d+/.test(name)) { + name = '_EL_EXPRESSION_'; + } + + if (!stubs[name] && name.indexOf('_PN_') !== 0) { + context.report(item); + } + } + ); + } + }; +}; \ No newline at end of file diff --git a/lib/lint_js_rules/no_unused_vars.js b/lib/lint_js_rules/no_unused_vars.js new file mode 100644 index 0000000..d162cad --- /dev/null +++ b/lib/lint_js_rules/no_unused_vars.js @@ -0,0 +1,74 @@ +var _ = require('lodash'); + +var base = require('../base'); +var stubs = base.stubs; + +var STUB_RE = new RegExp(`^${Object.keys(stubs).join('|')}`); + +module.exports = { + create(context) { + function useInstance(node) { + context.markVariableAsUsed('instance'); + } + + var lintRules = { + 'ReturnStatement': useInstance, + 'VariableDeclaration': useInstance + }; + + var options = context.options; + + if (options.length && options[0].jsp === true) { + var noUnused = require('eslint/lib/rules/no-unused-vars').create; + + var collectedReport = []; + + var mockContext = { + report(obj) { + collectedReport.push(obj); + }, + options: [ + { + 'args': 'none', + 'vars': 'local' + } + ] + }; + + _.defaults(mockContext, context); + + mockContext.getSourceCode = context.getSourceCode; + + lintRules['Program:exit'] = node => { + noUnused(mockContext)['Program:exit'](node); + + collectedReport.forEach( + (item, index) => { + var declaration = item.node; + var name = declaration.name; + + var namespacedVar = STUB_RE.test(name); + + var namespacedFn = false; + + if (namespacedVar) { + var parentType = declaration.parent.type; + + if (parentType === 'FunctionDeclaration' || + (parentType === 'VariableDeclarator' && declaration.parent.init.type === 'FunctionExpression') + ) { + namespacedFn = true; + } + } + + if (!stubs[name] && !namespacedVar || (namespacedVar && !namespacedFn)) { + context.report(item); + } + } + ); + }; + } + + return lintRules; + } +}; \ No newline at end of file diff --git a/lib/lint_js_rules/no_use_before_define.js b/lib/lint_js_rules/no_use_before_define.js new file mode 100644 index 0000000..7ec71b5 --- /dev/null +++ b/lib/lint_js_rules/no_use_before_define.js @@ -0,0 +1,62 @@ +var _ = require('lodash'); + +module.exports = context => { + var noUse = require('eslint/lib/rules/no-use-before-define').create; + + var collectedReport = []; + + var options = context.options; + + var sameScope = false; + + if (_.isPlainObject(options[0])) { + sameScope = options[0].samescope; + + options[0] = _.omit(options[0], 'samescope'); + } + + var mockContext = { + report(obj) { + var report = true; + + if (sameScope) { + var scope = mockContext.getScope(); + + scope.references.forEach( + reference => { + if (reference.identifier !== obj.node) { + return; + } + + var variable = reference.resolved; + + report = reference.from.variableScope === variable.scope; + } + ); + } + + if (report) { + collectedReport.push(obj); + } + } + }; + + _.defaults(mockContext, context); + + var defaultRule = noUse(mockContext); + + return _.defaults( + { + 'Program:exit': function(node) { + defaultRule['Program:exit'](node); + + collectedReport.forEach( + (item, index) => { + context.report(item); + } + ); + } + }, + defaultRule + ); +}; \ No newline at end of file diff --git a/lib/lint_js_rules/sort_constants.js b/lib/lint_js_rules/sort_constants.js new file mode 100644 index 0000000..319f973 --- /dev/null +++ b/lib/lint_js_rules/sort_constants.js @@ -0,0 +1,89 @@ +var _ = require('lodash'); +var utils = require('../rule_utils'); + +var sub = require('string-sub'); + +var REGEX_UNDERSCORE = /_/g; + +module.exports = context => { + + // Recursive function for collecting identifiers from node + + var getIdentifiers = (node, obj) => { + obj = obj || {}; + + if (node) { + var type = node.type; + + if (type === 'Identifier') { + obj[node.name] = true; + } + else if (type === 'Property') { + obj = getIdentifiers(node.key, obj); + obj = getIdentifiers(node.value, obj); + } + else if (type === 'BinaryExpression') { + obj = getIdentifiers(node.left, obj); + obj = getIdentifiers(node.right, obj); + } + else if (type === 'CallExpression' || type === 'ObjectExpression') { + var prop = 'properties'; + + if (type === 'CallExpression') { + obj = getIdentifiers(node.callee, obj); + + prop = 'arguments'; + } + + node[prop].forEach(_.ary(_.bindRight(getIdentifiers, null, obj), 1)); + } + else if (type === 'MemberExpression') { + obj = getIdentifiers(node.object, obj); + obj = getIdentifiers(node.property, obj); + } + } + + return obj; + }; + + var checkSort = node => { + var constants = utils.getConstants(node); + + var prevConstants = []; + + constants.forEach( + (item, index, coll) => { + var prev = coll[index - 1]; + + var itemName = item.id.name; + + if (prev) { + var prevName = prev.id.name; + + var diff = utils.getLineDistance(prev, item); + + if (diff === 2 && prevName.replace(REGEX_UNDERSCORE, '') > itemName.replace(REGEX_UNDERSCORE, '')) { + var identifiers = getIdentifiers(item.init); + + var hasReference = prevConstants.some( + (item, index) => identifiers[item] + ); + + if (!hasReference) { + var message = sub('Sort constants: {0} {1}', prevName, itemName); + + context.report(prev, message); + } + } + } + + prevConstants.push(itemName); + } + ); + }; + + return { + BlockStatement: checkSort, + Program: checkSort + }; +}; \ No newline at end of file diff --git a/lib/lint_js_rules/sort_props.js b/lib/lint_js_rules/sort_props.js new file mode 100644 index 0000000..72a3d68 --- /dev/null +++ b/lib/lint_js_rules/sort_props.js @@ -0,0 +1,172 @@ +var _ = require('lodash'); + +var REGEX = require('../regex'); + +var sub = require('string-sub'); + +var ruleUtils = require('../rule_utils'); + +module.exports = context => { + var LIFECYCLE_METHODS = { + init: -1100, + initializer: -1000, + renderUI: -900, + bindUI: -800, + syncUI: -700, + destructor: -600 + }; + + var getCacheKey = (...args) => args.join('_'); + + var getPropName = obj => { + var propName = ''; + + var type = obj.type; + + if (type === 'Literal' || type === 'Identifier') { + propName = obj.name || obj.value; + } + else { + propName = context.getSourceCode().getText(obj); + } + + return propName; + }; + + var sourceCode = context.getSourceCode(); + + var getComputedPropertyName = obj => sourceCode.getTokenBefore(obj).value + sourceCode.getText(obj) + sourceCode.getTokenAfter(obj).value; + + var inAttrs = parent => { + var insideAttrs = false; + + var grandParent = parent && parent.parent; + + if (grandParent && grandParent.type === 'Property' && grandParent.key.name === 'ATTRS') { + insideAttrs = true; + } + + return insideAttrs; + }; + + var isFunctionExpression = obj => obj.type === 'FunctionExpression' || obj.type === 'ArrowFunctionExpression'; + + var isLifecycle = _.memoize( + (propName, prevPropName) => LIFECYCLE_METHODS.hasOwnProperty(propName) || LIFECYCLE_METHODS.hasOwnProperty(prevPropName), + getCacheKey + ); + + var isMatchingCase = _.memoize( + (propName, prevPropName) => isUpper(propName) === isUpper(prevPropName), + getCacheKey + ); + + var isMatchingType = (item, prev) => isFunctionExpression(prev.value) === isFunctionExpression(item.value); + + var isPrivate = _.memoize( + str => _.isString(str) && str.charAt(0) === '_' + ); + + var RE_UPPER = /^[^a-z]+$/; + + var isUpper = _.memoize( + str => RE_UPPER.test(str) + ); + + var naturalCompare = ruleUtils.naturalCompare; + + var configuration = context.options[0] || {}; + + var caseSensitive = configuration.casesensitive; + + var checkLifecyleSort = (needsSort, propName, prevPropName, item, prev, parent) => { + var customPrevPropName = LIFECYCLE_METHODS[prevPropName]; + var customPropName = LIFECYCLE_METHODS[propName]; + + if (customPropName) { + if (customPrevPropName) { + needsSort = customPropName < customPrevPropName; + } + else { + needsSort = (!isUpper(prevPropName) && isFunctionExpression(prev.value)); + } + } + + return needsSort; + }; + + var checkRegPropSort = (needsSort, propName, prevPropName, item, prev, caseSensitive, parent) => { + var privatePrevProp = isPrivate(prevPropName); + var privateProp = isPrivate(propName); + + needsSort = (privateProp === privatePrevProp) && isMatchingCase(propName, prevPropName) && naturalCompare(propName, prevPropName, !caseSensitive) === -1 && isMatchingType(item, prev); + + if (privateProp !== privatePrevProp && privatePrevProp && !privateProp) { + needsSort = true; + } + + if (needsSort && !isFunctionExpression(item.value) && !inAttrs(parent)) { + + // Allow a set of properties to be grouped with an extra newline + + needsSort = (item.loc.start.line - prev.loc.end.line) < 2; + } + + return needsSort; + }; + + var checkSort = (propName, prevPropName, item, prev, caseSensitive, parent) => { + var needsSort = false; + + if (isLifecycle(propName, prevPropName)) { + needsSort = checkLifecyleSort(needsSort, propName, prevPropName, item, prev, parent); + } + else { + needsSort = checkRegPropSort(needsSort, propName, prevPropName, item, prev, caseSensitive, parent); + } + + if (REGEX.SERVICE_PROPS.test(propName) || REGEX.SERVICE_PROPS.test(prevPropName)) { + needsSort = false; + } + + return needsSort; + }; + + return { + ObjectExpression(node) { + var prev = null; + + node.properties.forEach( + (item, index, collection) => { + if (index > 0 && item.type !== 'ExperimentalSpreadProperty' && prev.type !== 'ExperimentalSpreadProperty') { + var key = item.key; + var prevKey = prev.key; + + var prevPropName = getPropName(prevKey); + var propName = getPropName(key); + + var needsSort = checkSort(propName, prevPropName, item, prev, caseSensitive, node); + + if (needsSort) { + var note = isLifecycle(propName, prevPropName) ? ' (Lifecycle methods should come first)' : ''; + + var displayPrevPropName = prevPropName; + var displayPropName = propName; + + if (item.computed) { + displayPrevPropName = getComputedPropertyName(prevKey); + displayPropName = getComputedPropertyName(key); + } + + var message = sub('Sort properties: {0} {1}{2}', displayPrevPropName, displayPropName, note); + + context.report(item, message); + } + } + + prev = item; + } + ); + } + }; +}; \ No newline at end of file diff --git a/lib/lint_js_rules/sort_requires.js b/lib/lint_js_rules/sort_requires.js new file mode 100644 index 0000000..f90c6e1 --- /dev/null +++ b/lib/lint_js_rules/sort_requires.js @@ -0,0 +1,47 @@ +module.exports = context => ({ + Property(node) { + var nodeValue = node.value; + + if (node.key.name == 'requires' && nodeValue.type == 'ArrayExpression') { + var elements = nodeValue.elements; + + if (elements.length > 1) { + + // I really, really hate having two loops here, + // but I can't think of any way to check only strings + // in an array, allowing for the off chance of non-string values + // ie. if the previous N items are not strings, you'll have to loop + // backwards anyways, but I would like to find a way to do + // this check all in one iteration + + var modules = []; + + elements.forEach( + (item, index) => { + if (item.type == 'Literal' && typeof item.value === 'string') { + modules.push(item.value); + } + } + ); + + var needsSort = []; + + modules.forEach( + (item, index, collection) => { + if (index > 0) { + var prevValue = collection[index - 1]; + + if (item < prevValue) { + needsSort.push(`${prevValue} > ${item}`); + } + } + } + ); + + if (needsSort.length) { + context.report(node, `Sort modules in "requires" array: ${needsSort.join(', ')}`); + } + } + } + } +}); \ No newline at end of file diff --git a/lib/lint_js_rules/sort_vars.js b/lib/lint_js_rules/sort_vars.js new file mode 100644 index 0000000..dc950e0 --- /dev/null +++ b/lib/lint_js_rules/sort_vars.js @@ -0,0 +1,133 @@ +var utils = require('../rule_utils'); + +var getLineDistance = utils.getLineDistance; +var naturalCompare = utils.naturalCompare; + +var sub = require('string-sub'); + +var REGEX_ASSIGNMENT_PATTERNS = /(Object|Array)Pattern/; + +var REGEX_FOR = /For.*Statement/; + +module.exports = context => { + var configuration = context.options[0] || {}; + + var caseSensitive = configuration.casesensitive; + + var destructuredVars = []; + var imports = []; + var variables = []; + + var findVars = node => { + if (!REGEX_FOR.test(node.parent.type)) { + var declarations = node.declarations; + var specifiers = node.specifiers; + + if (declarations) { + declarations.forEach( + (val, key) => { + var varType = val.id.type; + + var destructuredVar = REGEX_ASSIGNMENT_PATTERNS.test(varType); + + if (val.init && !destructuredVar) { + variables.push(val); + } + else if (destructuredVar && varType === 'ObjectPattern') { + var props = val.id.properties.filter( + (item, index) => item.key + ); + + destructuredVars.push(props); + } + } + ); + } + else { + specifiers = specifiers.filter( + (item, index) => item.type !== 'ImportDefaultSpecifier' + ); + + if (specifiers.length > 1) { + imports.push(specifiers); + } + } + } + }; + + return { + 'Program:exit': function() { + variables.reduce( + (prev, item, index) => { + var lineDistance = getLineDistance(prev, item); + + if (lineDistance === 1 || lineDistance === 0) { + var curName = item.id.name; + var prevName = prev.id.name; + + var result = naturalCompare(curName, prevName, !caseSensitive); + + if (result === -1) { + var message = sub('Sort variables: {0} {1}', prevName, curName); + + context.report(prev, message); + } + } + + return item; + }, + variables[0] + ); + + destructuredVars.forEach( + (item, index) => { + item.reduce( + (prev, item, index) => { + var curName = item.key.name; + var prevName = prev.key.name; + + var result = naturalCompare(curName, prevName, !caseSensitive); + + if (result === -1) { + var message = sub('Sort variables: {0} {1}', prevName, curName); + + context.report(prev, message); + } + + return item; + }, + item[0] + ); + } + ); + + imports.forEach( + (item, index) => { + item.reduce( + (prev, item, index) => { + var curName = item.local.name; + var prevName = prev.local.name; + + if (prevName === prev.imported.name && curName === item.imported.name) { + var result = naturalCompare(curName, prevName, !caseSensitive); + + if (result === -1) { + var message = sub('Sort imported members: {0} {1}', prevName, curName); + + context.report(prev, message); + } + } + + return item; + }, + item[0] + ); + } + ); + }, + + ImportDeclaration: findVars, + + VariableDeclaration: findVars + }; +}; \ No newline at end of file diff --git a/lib/lint_rules/array_spacing.js b/lib/lint_rules/array_spacing.js deleted file mode 100644 index e8b46f2..0000000 --- a/lib/lint_rules/array_spacing.js +++ /dev/null @@ -1,55 +0,0 @@ -var _ = require('lodash'); -var base = require('../base'); - -var REGEX = require('../regex'); - -var sub = require('string-sub'); - -var isSingleLine = function(node) { - return node.loc.start.line === node.loc.end.line; -}; - -module.exports = function(context) { - return { - ArrayExpression: function(node) { - var source = context.getSource(node); - - if (isSingleLine(node) && REGEX.ARRAY_SURROUNDING_SPACE.test(source)) { - var brackets = []; - var surroundingSpaceTypes = []; - - source.replace( - REGEX.ARRAY_SURROUNDING_SPACE, - function(item, index, str) { - var startIndex = 0; - var endIndex = str.length; - - var leadingSpace = item.indexOf('[') > -1; - - if (leadingSpace) { - endIndex = index + 1; - surroundingSpaceTypes.push('leading'); - } - else { - startIndex = index + 1; - surroundingSpaceTypes.push('trailing'); - brackets.push('...'); - } - - brackets.push(str.substring(startIndex, endIndex)); - - if (leadingSpace) { - brackets.push('...'); - } - } - ); - - brackets = _.uniq(brackets); - - var message = sub('Remove {0} spaces: {1}', surroundingSpaceTypes.join(' and '), brackets.join(' ')); - - context.report(node, message); - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/array_spacing_chars.js b/lib/lint_rules/array_spacing_chars.js deleted file mode 100644 index b1af72e..0000000 --- a/lib/lint_rules/array_spacing_chars.js +++ /dev/null @@ -1,34 +0,0 @@ -var sub = require('string-sub'); - -var REGEX = require('../regex'); - -var isSingleLine = function(node) { - return node.loc.start.line === node.loc.end.line; -}; - -module.exports = function(context) { - return { - ArrayExpression: function(node) { - if (isSingleLine(node)) { - var source = context.getSource(node); - - var tmpSource = source.replace(/(['"]).*?\1/g, '$1$1'); - - if (REGEX.ARRAY_INTERNAL_SPACE.test(tmpSource)) { - var missingSpaces = []; - - source.replace( - REGEX.ARRAY_INTERNAL_SPACE, - function(item, index, str) { - missingSpaces.push(item.replace('\t', '\\t')); - } - ); - - var message = sub('Array items should be separated by exactly one space:{0}', missingSpaces.join('')); - - context.report(node, message); - } - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/catch_arg_name.js b/lib/lint_rules/catch_arg_name.js deleted file mode 100644 index 4365d85..0000000 --- a/lib/lint_rules/catch_arg_name.js +++ /dev/null @@ -1,17 +0,0 @@ -var base = require('../base'); - -var sub = require('string-sub'); - -module.exports = function(context) { - return { - CatchClause: function(node) { - var paramName = node.param.name; - - if (paramName != 'e') { - var message = sub('Catch statement param should be "e", not "{0}"', paramName); - - context.report(node, message); - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/catch_format.js b/lib/lint_rules/catch_format.js deleted file mode 100644 index f192021..0000000 --- a/lib/lint_rules/catch_format.js +++ /dev/null @@ -1,19 +0,0 @@ -var base = require('../base'); - -var sub = require('string-sub'); - -module.exports = function(context) { - return { - CatchClause: function(node) { - var start = node.loc.start.line; - var shouldEnd = start + 1; - var end = node.loc.end.line; - - if (!node.body.body.length && end != shouldEnd) { - var message = sub('Empty catch statement should be closed on line {0}', shouldEnd); - - context.report(node, message); - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/dot_notation.js b/lib/lint_rules/dot_notation.js deleted file mode 100644 index 60fddf9..0000000 --- a/lib/lint_rules/dot_notation.js +++ /dev/null @@ -1,16 +0,0 @@ -var REGEX = require('../regex'); - -module.exports = function(context) { - return { - MemberExpression: function(node) { - var propertyValue = node.property.value; - var propertyType = node.property.type; - - if (propertyType === 'Literal' && !REGEX.STUBS.test(propertyValue)) { - var dotNotation = require('../../node_modules/eslint/lib/rules/dot-notation'); - - dotNotation(context).MemberExpression(node); - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/format_multiline_vars.js b/lib/lint_rules/format_multiline_vars.js deleted file mode 100644 index db8a5bf..0000000 --- a/lib/lint_rules/format_multiline_vars.js +++ /dev/null @@ -1,98 +0,0 @@ -var findFirstofLastLine = function(tokens, line) { - var firstOfLast = null; - - for (var i = 0, len = tokens.length; i < len; i++) { - var token = tokens[i]; - - if (token.loc.start.line === line) { - firstOfLast = token; - - break; - } - } - - return firstOfLast; -}; - -var isSameColumn = function(a, b, requireKeyword) { - var inc = requireKeyword ? 3 : 0; - - return a.loc.start.column === (b.loc.start.column + inc); -}; - -var isSameLine = function(a, b) { - return a.loc.start.line === b.loc.start.line; -}; - -module.exports = function(context) { - var checkEndColumn = function(declaration, init, node) { - var decLoc = declaration.loc; - var decStart = decLoc.start; - - if (init.type === 'BinaryExpression' && - init.operator === '+' && - decLoc.end.line > decStart.line && - !isSameColumn(declaration, init.right)) { - - var tokens = context.getTokens(node); - - var firstOfLast = findFirstofLastLine(tokens, decLoc.end.line); - - var assignmentExpression = (node.type === 'AssignmentExpression'); - - if (!isSameColumn(declaration, firstOfLast, !assignmentExpression)) { - var id = assignmentExpression ? declaration.left : declaration.id; - - context.report( - node, - 'Multi-line strings should be aligned to the start of the variable name "{{identifier}}"', - { - identifier: id.name - } - ); - } - } - }; - - var checkStartLine = function(id, init, node) { - var allowedFormat = isSameLine(id, init); - - if (!allowedFormat) { - if (init.type === 'LogicalExpression') { - var token = context.getTokenBefore(init); - - allowedFormat = (token.value === '(' && isSameLine(id, token)); - } - - if (!allowedFormat) { - context.report( - node, - 'Variable values should start on the same line as the variable name "{{identifier}}"', - { - identifier: id.name - } - ); - } - } - }; - - return { - AssignmentExpression: function(node) { - checkStartLine(node.left, node.right, node); - checkEndColumn(node, node.right, node); - }, - - VariableDeclaration: function(node) { - var declarations = node.declarations; - - var dec = declarations[0]; - var decId = dec.id; - var decInit = dec.init; - - if (decInit) { - checkStartLine(decId, decInit, node); - checkEndColumn(dec, decInit, node); - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/liferay_provide_format.js b/lib/lint_rules/liferay_provide_format.js deleted file mode 100644 index 64d2a9e..0000000 --- a/lib/lint_rules/liferay_provide_format.js +++ /dev/null @@ -1,47 +0,0 @@ -module.exports = function(context) { - return { - CallExpression: function(node) { - var callee = node.callee; - - if (callee.type === 'MemberExpression' && callee.object.name === 'Liferay' && callee.property.name === 'provide') { - var args = node.arguments; - - if (args.length < 4) { - context.report(node, 'Missing dependencies (don\'t use Liferay.provide to create regular functions).'); - } - else { - var arg0 = args[0]; - var arg1 = args[1]; - var arg2 = args[2]; - var arg3 = args[3]; - - var arg0Type = arg0.type; - var arg1Type = arg1.type; - var arg2Type = arg2.type; - var arg3Type = arg3.type; - - if (arg0Type !== 'Identifier' && arg0Type !== 'MemberExpression') { - context.report(arg0, 'Liferay.provide expects an object as the first argument.'); - } - - if (arg1Type !== 'Identifier' && typeof arg1.value !== 'string') { - context.report(arg1, 'Liferay.provide expects a string as the second argument.'); - } - - if (arg2Type !== 'Identifier' && arg2Type !== 'FunctionExpression') { - context.report(arg2, 'Liferay.provide expects a function as the third argument.'); - } - - var arg3TypeExpression = arg3Type === 'CallExpression'; - - if (arg3Type !== 'Identifier' && arg3Type !== 'ArrayExpression' && !arg3TypeExpression || arg3TypeExpression && arg3.callee.object.type !== 'ArrayExpression') { - context.report(arg3, 'Liferay.provide expects an array as the last argument.'); - } - else if (arg3Type === 'ArrayExpression' && !arg3.elements.length) { - context.report(arg3, 'Liferay.provide dependencies should have at least one dependency.'); - } - } - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/multiple_vars.js b/lib/lint_rules/multiple_vars.js deleted file mode 100644 index 751e023..0000000 --- a/lib/lint_rules/multiple_vars.js +++ /dev/null @@ -1,23 +0,0 @@ -var base = require('../base'); - -var sub = require('string-sub'); - -module.exports = function(context) { - return { - VariableDeclaration: function(node) { - var declarations = node.declarations; - - if (declarations.length > 1) { - var vars = declarations.map( - function(item, index) { - return item.id.name; - } - ); - - var message = sub('Each variable should have it\'s own var statement: {0}', vars.join(', ')); - - context.report(node, message); - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/no_extra_semi.js b/lib/lint_rules/no_extra_semi.js deleted file mode 100644 index 3aedbf0..0000000 --- a/lib/lint_rules/no_extra_semi.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = function(context) { - return { - EmptyStatement: function(node) { - var afterText = context.getSource(node, 0, 10); - - if (afterText !== ';(function(') { - context.report(node, 'Unnecessary semicolon.'); - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/no_undef.js b/lib/lint_rules/no_undef.js deleted file mode 100644 index 7c51586..0000000 --- a/lib/lint_rules/no_undef.js +++ /dev/null @@ -1,34 +0,0 @@ -var _ = require('lodash'); - -var base = require('../base'); -var stubs = base.stubs; - -module.exports = function(context) { - var noUndef = require('../../node_modules/eslint/lib/rules/no-undef'); - - var collectedReport = []; - - var mockContext = { - report: function() { - collectedReport.push(arguments); - } - }; - - _.defaults(mockContext, context); - - return { - 'Program:exit': function(node) { - noUndef(mockContext)['Program:exit'](node); - - collectedReport.forEach( - function(item, index) { - var name = item[0].name; - - if (!stubs[name] && name.indexOf('_PN_') !== 0) { - context.report.apply(context, item); - } - } - ); - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/no_unused_vars.js b/lib/lint_rules/no_unused_vars.js deleted file mode 100644 index 31920f4..0000000 --- a/lib/lint_rules/no_unused_vars.js +++ /dev/null @@ -1,67 +0,0 @@ -var _ = require('lodash'); - -var base = require('../base'); -var stubs = base.stubs; -var portletNS = base.jspLintStubs.namespace; - -module.exports = function(context) { - function useInstance(node) { - context.markVariableAsUsed('instance'); - } - - var lintRules = { - 'VariableDeclaration': useInstance, - 'ReturnStatement': useInstance - }; - - var options = context.options; - - if (options.length && options[0].jsp === true) { - var noUnused = require('../../node_modules/eslint/lib/rules/no-unused-vars'); - - var collectedReport = []; - - var mockContext = { - report: function() { - collectedReport.push(arguments); - }, - options: [{'vars': 'local', 'args': 'none'}] - }; - - _.defaults(mockContext, context); - - lintRules['Program:exit'] = function(node) { - noUnused(mockContext)['Program:exit'](node); - - collectedReport.forEach( - function(item, index) { - var declaration = item[0]; - var name = declaration.name; - - var namespacedVar = name.indexOf(portletNS) === 0; - - var namespacedFn = false; - - if (namespacedVar) { - // item[0].name = name.replace(portletNS, ''); - // item[2].name = name.replace(portletNS, ''); - - var parentType = declaration.parent.type; - - if (parentType === 'FunctionDeclaration' || - (parentType === 'VariableDeclarator' && declaration.parent.init.type === 'FunctionExpression') - ) { - namespacedFn = true; - } - } - - if (!stubs[name] && !namespacedVar || (namespacedVar && !namespacedFn)) { - context.report.apply(context, item); - } - } - ); - } - } - - return lintRules; -}; \ No newline at end of file diff --git a/lib/lint_rules/no_use_before_define.js b/lib/lint_rules/no_use_before_define.js deleted file mode 100644 index 868536a..0000000 --- a/lib/lint_rules/no_use_before_define.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @fileoverview Rule to flag use of variables before they are defined - * @author Ilya Volodin - */ - -//------------------------------------------------------------------------------ -// Constants -//------------------------------------------------------------------------------ - -var NO_FUNC = "nofunc"; - -//------------------------------------------------------------------------------ -// Rule Definition -//------------------------------------------------------------------------------ - -module.exports = function(context) { - - "use strict"; - - function findDeclaration(name, scope) { - //try searching in the current scope first - for (var i = 0, l = scope.variables.length; i < l; i++) { - if (scope.variables[i].name === name) { - return scope.variables[i]; - } - } - //check if there's upper scope and call recursivly till we find the variable - if (scope.upper) { - return findDeclaration(name, scope.upper); - } - } - - function findVariables() { - var scope = context.getScope(); - var configuration = context.options[0] || {}; - var typeOption = configuration.nofunc ? NO_FUNC : null; - var scopeOption = configuration.samescope; - - function checkLocationAndReport(reference, declaration) { - if ((typeOption !== NO_FUNC || declaration.defs[0].type !== "FunctionName") && (!scopeOption || reference.from.variableScope === declaration.scope)) { - if (declaration.identifiers[0].range[1] > reference.identifier.range[1]) { - context.report(reference.identifier, "{{a}} was used before it was defined", {a: reference.identifier.name}); - } - } - } - - scope.references.forEach(function(reference) { - //if the reference is resolved check for declaration location - //if not, it could be function invocation, try to find manually - if (reference.resolved && reference.resolved.identifiers.length > 0) { - checkLocationAndReport(reference, reference.resolved); - } else { - var declaration = findDeclaration(reference.identifier.name, scope); - //if there're no identifiers, this is a global environment variable - if (declaration && declaration.identifiers.length !== 0) { - checkLocationAndReport(reference, declaration); - } - } - }); - } - - return { - "Program": findVariables, - "FunctionExpression": findVariables, - "FunctionDeclaration": findVariables - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/sort_constants.js b/lib/lint_rules/sort_constants.js deleted file mode 100644 index 07b2566..0000000 --- a/lib/lint_rules/sort_constants.js +++ /dev/null @@ -1,45 +0,0 @@ -var base = require('../base'); -var utils = require('../rule_utils'); - -var sub = require('string-sub'); - -var REGEX_UNDERSCORE = /_/g; - -module.exports = function(context) { - var checkSort = function(node) { - var constants = utils.getConstants(node); - - var prevConstants = []; - - constants.forEach( - function(item, index, coll) { - var prev = coll[index - 1]; - - var itemName = item.id.name; - - if (prev) { - var prevName = prev.id.name; - - var diff = utils.getLineDistance(prev, item); - - if (diff === 2 && prevName.replace(REGEX_UNDERSCORE, '') > itemName.replace(REGEX_UNDERSCORE, '')) { - var re = new RegExp('\\b' + prevConstants.join('|') + '\\b'); - - if (!re.test(context.getSource(item))) { - var message = sub('Sort constants: {0} {1}', prevName, itemName); - - context.report(prev, message); - } - } - } - - prevConstants.push(itemName); - } - ); - }; - - return { - BlockStatement: checkSort, - Program: checkSort - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/sort_props.js b/lib/lint_rules/sort_props.js deleted file mode 100644 index 10a88c2..0000000 --- a/lib/lint_rules/sort_props.js +++ /dev/null @@ -1,160 +0,0 @@ -var _ = require('lodash'); - -var REGEX = require('../regex'); - -var sub = require('string-sub'); - -var ruleUtils = require('../rule_utils'); - -var LIFECYCLE_METHODS = { - init: -1100, - initializer: -1000, - renderUI: -900, - bindUI: -800, - syncUI: -700, - destructor: -600 -}; - -var getCacheKey = function() { - return Array.prototype.join.call(arguments, '_'); -}; - -var getPropName = function(obj) { - return obj.name || obj.value; -}; - -var inAttrs = function(parent) { - var insideAttrs = false; - - var grandParent = parent && parent.parent; - - if (grandParent && grandParent.type === 'Property' && grandParent.key.name === 'ATTRS') { - insideAttrs = true; - } - - return insideAttrs; -}; - -var isFunctionExpression = function(obj) { - return obj.type === 'FunctionExpression'; -}; - -var isLifecycle = _.memoize( - function(propName, prevPropName) { - return (LIFECYCLE_METHODS.hasOwnProperty(propName) || LIFECYCLE_METHODS.hasOwnProperty(prevPropName)); - }, - getCacheKey -); - -var isMatchingCase = _.memoize( - function(propName, prevPropName) { - return isUpper(propName) === isUpper(prevPropName); - }, - getCacheKey -); - -var isMatchingType = function(item, prev) { - return isFunctionExpression(prev.value) === isFunctionExpression(item.value); -}; - -var isPrivate = _.memoize( - function(str) { - return _.isString(str) && str.charAt(0) === '_'; - } -); - -var RE_UPPER = /^[^a-z]+$/; - -var isUpper = _.memoize( - function(str) { - return RE_UPPER.test(str); - } -); - -var naturalCompare = ruleUtils.naturalCompare; - -module.exports = function(context) { - var configuration = context.options[0] || {}; - var caseSensitive = configuration.casesensitive; - - var checkLifecyleSort = function(needsSort, propName, prevPropName, item, prev, parent) { - var customPropName = LIFECYCLE_METHODS[propName]; - var customPrevPropName = LIFECYCLE_METHODS[prevPropName]; - - if (customPropName) { - if (customPrevPropName) { - needsSort = customPropName < customPrevPropName; - } - else { - needsSort = (!isUpper(prevPropName) && isFunctionExpression(prev.value)); - } - } - - return needsSort; - }; - - var checkRegPropSort = function(needsSort, propName, prevPropName, item, prev, caseSensitive, parent) { - var privateProp = isPrivate(propName); - var privatePrevProp = isPrivate(prevPropName); - - needsSort = (privateProp === privatePrevProp) && isMatchingCase(propName, prevPropName) && naturalCompare(propName, prevPropName, !caseSensitive) === -1 && isMatchingType(item, prev); - - if (privateProp !== privatePrevProp && privatePrevProp && !privateProp) { - needsSort = true; - } - - if (needsSort && !isFunctionExpression(item.value) && !inAttrs(parent)) { - // Allow a set of properties to be grouped with an extra newline - needsSort = (item.loc.start.line - prev.loc.end.line) < 2; - } - - return needsSort; - }; - - var checkSort = function(propName, prevPropName, item, prev, caseSensitive, parent) { - var needsSort = false; - - if (isLifecycle(propName, prevPropName)) { - needsSort = checkLifecyleSort(needsSort, propName, prevPropName, item, prev, parent); - } - else { - needsSort = checkRegPropSort(needsSort, propName, prevPropName, item, prev, caseSensitive, parent); - } - - if (REGEX.SERVICE_PROPS.test(propName) || REGEX.SERVICE_PROPS.test(prevPropName)) { - needsSort = false; - } - - return needsSort; - }; - - return { - ObjectExpression: function(node) { - var prev = null; - - node.properties.forEach( - function(item, index, collection) { - if (index > 0) { - var key = item.key; - var prevKey = prev.key; - - var propName = getPropName(key); - var prevPropName = getPropName(prevKey); - - var needsSort = checkSort(propName, prevPropName, item, prev, caseSensitive, node); - - if (needsSort) { - var note = isLifecycle(propName, prevPropName) ? ' (Lifecycle methods should come first)' : ''; - - var message = sub('Sort properties: {0} {1}{2}', prevPropName, propName, note); - - context.report(item, message); - } - } - - prev = item; - } - ); - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/sort_requires.js b/lib/lint_rules/sort_requires.js deleted file mode 100644 index fb8cf94..0000000 --- a/lib/lint_rules/sort_requires.js +++ /dev/null @@ -1,48 +0,0 @@ -module.exports = function(context) { - return { - Property: function(node) { - var nodeValue = node.value; - - if (node.key.name == 'requires' && nodeValue.type == 'ArrayExpression') { - var elements = nodeValue.elements; - - if (elements.length > 1) { - // I really, really hate having two loops here, - // but I can't think of any way to check only strings - // in an array, allowing for the off chance of non-string values - // ie. if the previous N items are not strings, you'll have to loop - // backwards anyways, but I would like to find a way to do - // this check all in one iteration - - var modules = []; - - elements.forEach( - function(item, index) { - if (item.type == 'Literal' && typeof item.value === 'string') { - modules.push(item.value); - } - } - ); - - var needsSort = []; - - modules.forEach( - function(item, index, collection) { - if (index > 0) { - var prevValue = collection[index - 1]; - - if (item < prevValue) { - needsSort.push(prevValue + ' > ' + item); - } - } - } - ); - - if (needsSort.length) { - context.report(node, 'Sort modules in "requires" array: ' + needsSort.join(', ')); - } - } - } - } - }; -}; \ No newline at end of file diff --git a/lib/lint_rules/sort_vars.js b/lib/lint_rules/sort_vars.js deleted file mode 100644 index fb88a30..0000000 --- a/lib/lint_rules/sort_vars.js +++ /dev/null @@ -1,54 +0,0 @@ -var base = require('../base'); -var utils = require('../rule_utils'); - -var getLineDistance = utils.getLineDistance; -var naturalCompare = utils.naturalCompare; - -var sub = require('string-sub'); - -var REGEX_FOR = /For.*Statement/ - -module.exports = function(context) { - var configuration = context.options[0] || {}; - var caseSensitive = configuration.casesensitive; - - var variables = []; - - var findVars = function(node) { - if (!REGEX_FOR.test(node.parent.type)) { - node.declarations.forEach( - function(val, key) { - variables.push(val); - } - ); - } - }; - - return { - 'Program:exit': function(){ - var varGroups = variables.reduce( - function(prev, item, index) { - var lineDistance = getLineDistance(prev, item); - - if (lineDistance === 1 || lineDistance === 0) { - var prevName = prev.id.name; - var curName = item.id.name; - - var result = naturalCompare(curName, prevName, !caseSensitive); - - if (result === -1) { - var message = sub('Sort variables: {0} {1}', prevName, curName); - - context.report(prev, message); - } - } - - return item; - }, - variables[0] - ); - }, - - VariableDeclaration: findVars - }; -}; \ No newline at end of file diff --git a/lib/logger.js b/lib/logger.js index c89bd1d..343aae9 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -3,11 +3,13 @@ var Logger = require('content-logger'); var contentLogger = Logger.create( { prototype: { - init: function() { + init() { this.testStats = { failures: 0 }; + this._errorStack = []; + this.on( 'add', function(error) { @@ -16,6 +18,22 @@ var contentLogger = Logger.create( } } ); + }, + + filterFileErrors(file, fn) { + var fileErrors; + + var errors = this.getErrors(file); + + this._errorStack.push(errors); + + var filteredErrors = fn(errors); + + filteredErrors.errorMap = {}; + + this.fileErrors[file] = filteredErrors; + + return fileErrors; } } } diff --git a/lib/meta.js b/lib/meta.js index 36d459d..37da3ab 100644 --- a/lib/meta.js +++ b/lib/meta.js @@ -1,8 +1,8 @@ var _ = require('lodash'); var falafel = require('falafel'); -var async = require('async'); var path = require('path'); -var fs = require('fs'); +var Promise = require('bluebird'); +var fs = Promise.promisifyAll(require('fs')); var argv = require('./argv'); var base = require('./base'); var colors = require('cli-color-keywords')(); @@ -11,12 +11,12 @@ var INDENT = base.INDENT; var VERBOSE = argv.v; -var extractRequires = function(node) { +var extractRequires = node => { var requires = []; if (node && node.type == 'Property' && node.key.name == 'requires' && node.value && node.value.elements) { node.value.elements.forEach( - function(item, index) { + (item, index) => { requires.push(item.value); } ); @@ -25,7 +25,7 @@ var extractRequires = function(node) { return requires; }; -var extractModuleMetaData = function(node, metaDataObj) { +var extractModuleMetaData = (node, metaDataObj) => { if (node.type == 'Property' && node.key.name == 'modules' && node.parent.parent.type == 'Property' && node.parent.parent.key.name == 'liferay' && node.value.type == 'ObjectExpression' @@ -33,13 +33,13 @@ var extractModuleMetaData = function(node, metaDataObj) { var objSource = node.value.source(); node.value.properties.forEach( - function(item, index) { + (item, index) => { var val = item.value; var metaDataItem = {}; if (val.type == 'ObjectExpression') { val.properties.forEach( - function(valItem, valIndex) { + (valItem, valIndex) => { var propName = valItem.key.name; var propValue = valItem.value; @@ -71,7 +71,7 @@ var extractModuleMetaData = function(node, metaDataObj) { return metaDataObj; }; -var extractFileMetaData = function(node, moduleInfo, fileName) { +var extractFileMetaData = (node, moduleInfo, fileName) => { if (node.type == 'Property' && node.key.name == 'requires') { if (node.parent.parent.type == 'CallExpression') { var moduleDef = node.parent.parent; @@ -95,25 +95,18 @@ var extractFileMetaData = function(node, moduleInfo, fileName) { return moduleInfo; }; -var readFile = function(filePath, fileName, moduleInfo, done) { - fs.readFile( - filePath, - function(err, contents) { - if (!err) { - contents = falafel( - contents.toString(), - function(node) { - moduleInfo = extractFileMetaData(node, moduleInfo, fileName); - } - ); +var readFile = (filePath, fileName, moduleInfo) => fs.readFileAsync(filePath).then( + contents => { + contents = falafel( + contents.toString(), + node => { + moduleInfo = extractFileMetaData(node, moduleInfo, fileName); } + ); + } +).catch(_.noop); - done(); - } - ); -}; - -var checkMissingModuleInfo = function(files, metaDataObj) { +var checkMissingModuleInfo = (files, metaDataObj) => { var missingModules = metaDataObj.missing; var moduleFiles = metaDataObj.files; @@ -127,7 +120,7 @@ var checkMissingModuleInfo = function(files, metaDataObj) { } missingModules = largest.reduce( - function(prev, item, index) { + (prev, item, index) => { if (smallest.indexOf(item) === -1) { prev.push(item); } @@ -141,15 +134,11 @@ var checkMissingModuleInfo = function(files, metaDataObj) { return metaDataObj; }; -var diffArray = function(array, values) { - return array.filter( - function(item, index) { - return values.indexOf(item) == -1; - } - ); -}; +var diffArray = (array, values) => array.filter( + (item, index) => values.indexOf(item) == -1 +); -var checkMetaData = function(config) { +var checkMetaData = config => { var done = config.done; var liferayModuleDir = config.liferayModuleDir; @@ -172,20 +161,17 @@ var checkMetaData = function(config) { loc: true, tolerant: true }, - function(node) { + node => { moduleInfo = extractModuleMetaData(node, moduleInfo); } ); var fileSeries = []; - fs.readdir( - liferayModuleDir, - function(err, files) { + fs.readdirAsync(liferayModuleDir).then( + files => { files = files.filter( - function(item, index) { - return path.extname(item) == '.js' && item !== 'modules.js'; - } + (item, index) => path.extname(item) == '.js' && item !== 'modules.js' ); checkMissingModuleInfo(files, moduleInfo); @@ -193,18 +179,13 @@ var checkMetaData = function(config) { var updateModules = []; files.forEach( - function(item, index) { - fileSeries.push( - function(done) { - readFile(path.join(liferayModuleDir, item), item, moduleInfo, done); - } - ); + (item, index) => { + fileSeries.push(readFile(path.join(liferayModuleDir, item), item, moduleInfo)); } ); - async.series( - fileSeries, - function(results) { + return Promsie.all(fileSeries).then( + results => { var moduleKeys = Object.keys(moduleInfo.meta); var fileModuleKeys = Object.keys(moduleInfo.fileMeta); @@ -223,14 +204,14 @@ var checkMetaData = function(config) { var needsFileData = []; combined.forEach( - function(item, index) { + (item, index) => { var moduleMeta = moduleInfo.meta[item]; var fileMeta = moduleInfo.fileMeta[item]; var hasModuleMeta = !!moduleMeta; var hasFileMeta = !!fileMeta; - var modFileIdentifier = item + ': ' + (hasFileMeta ? fileMeta.path : moduleMeta.path); + var modFileIdentifier = `${item}: ${hasFileMeta ? fileMeta.path : moduleMeta.path}`; if (!hasModuleMeta && hasFileMeta) { needsModuleData.push(modFileIdentifier); @@ -243,16 +224,16 @@ var checkMetaData = function(config) { needsMetaSync.push(modFileIdentifier); if (VERBOSE) { - needsMetaSync.push(INDENT + 'modules.js: ' + moduleMeta.requires); - needsMetaSync.push(INDENT + fileMeta.path + ': ' + fileMeta.requires.join(', ')); + needsMetaSync.push(`${INDENT}modules.js: ${moduleMeta.requires}`); + needsMetaSync.push(`${INDENT + fileMeta.path}: ${fileMeta.requires.join(', ')}`); } } else if (moduleMeta.requires && !fileMeta.requires) { needsMetaSync.push(modFileIdentifier); if (VERBOSE) { - needsMetaSync.push(INDENT + 'modules.js: ' + moduleMeta.requires.join(', ')); - needsMetaSync.push(INDENT + fileMeta.path + ': ' + fileMeta.requires); + needsMetaSync.push(`${INDENT}modules.js: ${moduleMeta.requires.join(', ')}`); + needsMetaSync.push(`${INDENT + fileMeta.path}: ${fileMeta.requires}`); } } else { @@ -271,14 +252,14 @@ var checkMetaData = function(config) { needsMetaSync.push(modFileIdentifier); if (VERBOSE) { - needsMetaSync.push(INDENT + 'modules.js: ' + moduleMeta.requires.join(', ')); - needsMetaSync.push(INDENT + fileMeta.path + ': ' + fileMeta.requires.join(', ')); + needsMetaSync.push(`${INDENT}modules.js: ${moduleMeta.requires.join(', ')}`); + needsMetaSync.push(`${INDENT + fileMeta.path}: ${fileMeta.requires.join(', ')}`); var merged = fileMeta.requires.concat(moduleMeta.requires); merged = _.uniq(merged).sort(); - needsMetaSync.push(INDENT + 'merged: \'' + merged.join('\', \'') + '\''); + needsMetaSync.push(`${INDENT}merged: '${merged.join('\', \'')}'`); needsMetaSync.push('---'); } } @@ -318,8 +299,6 @@ var checkMetaData = function(config) { console.log(colors.subtle('----')); } - - done(); } ); } @@ -327,7 +306,7 @@ var checkMetaData = function(config) { }; module.exports = { - check: function(config) { - checkMetaData(config); + check(config) { + return checkMetaData(config); } }; \ No newline at end of file diff --git a/lib/re.js b/lib/re.js index 3085f84..947d538 100644 --- a/lib/re.js +++ b/lib/re.js @@ -10,7 +10,9 @@ re.prototype.hasExtraNewLines = function(item, index, collection) { var extraNewLines = false; if (item === '') { - extraNewLines = (index === 0 && collection.length > 1) || collection[index - 1] === ''; + var length = collection.length; + + extraNewLines = (index === 0 && length > 1) || collection[index - 1] === '' || (index === length - 1 && length > 1); } if (extraNewLines) { @@ -19,7 +21,7 @@ re.prototype.hasExtraNewLines = function(item, index, collection) { { context: { rawContent: item, - item: item, + item, lineNum: index + 1 }, message: 'Extra new line' @@ -30,14 +32,12 @@ re.prototype.hasExtraNewLines = function(item, index, collection) { return extraNewLines; }; -re.prototype.hasHex = function(item) { +re.prototype.hasHex = item => { var match = item.match(REGEX.HEX); return match && match[0]; }; -re.prototype.hasProperty = function(item) { - return REGEX.PROPERTY.test(item); -}; +re.prototype.hasProperty = item => REGEX.PROPERTY.test(item); module.exports = re; \ No newline at end of file diff --git a/lib/regex.js b/lib/regex.js index 4c918b3..4f23dd6 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -28,11 +28,11 @@ var REGEX = { REGEX: /\/.*\/([gim]{1,3})?/g, - SCRIPTLET_STUB: new RegExp('^\\s*' + base.jspLintStubs.scriptlet + '$'), + SCRIPTLET_STUB: new RegExp(`^\\s*${base.jspLintStubs.scriptlet}$`), SERVICE_PROPS: /(^@)|((.*?) = (.*?))/, - STUBS: new RegExp('^_*(' + Object.keys(base.stubs).join('|') + ')_*'), + STUBS: new RegExp(`^_*(${Object.keys(base.stubs).join('|')})_*`), STYLE: /<(style)(.*?)>([\s\S]*?)<\/\1>/, diff --git a/lib/rule_utils.js b/lib/rule_utils.js index fd93a81..98758eb 100644 --- a/lib/rule_utils.js +++ b/lib/rule_utils.js @@ -1,15 +1,16 @@ var _ = require('lodash'); +var path = require('path'); var REGEX = require('./regex'); -exports.getConstants = function(node) { +exports.getConstants = node => { var constants = []; node.body.forEach( - function(item, index) { + (item, index) => { if (item.type == 'VariableDeclaration' && item.declarations) { item.declarations.forEach( - function(val, key) { + (val, key) => { if (/^[A-Z0-9_]+$/.test(val.id.name)) { constants.push(val); } @@ -23,12 +24,12 @@ exports.getConstants = function(node) { }; // Gets distance between the end of "left" and the start of "right" +// Or, pass in leftEnd or rightStart to define whether +// it's the end or start of a line -exports.getLineDistance = function(left, right) { - return right.loc.start.line - left.loc.end.line; -}; +exports.getLineDistance = (left, right, leftEnd, rightStart) => right.loc[rightStart || 'start'].line - left.loc[leftEnd || 'end'].line; -var compare = function(a, b) { +var compare = (a, b) => { var retVal = 0; if (a < b) { @@ -41,7 +42,7 @@ var compare = function(a, b) { return retVal; }; -var compareAlpha = function(a, b, caseInsensitive, result) { +var compareAlpha = (a, b, caseInsensitive, result) => { if (caseInsensitive === true) { a = a.toLowerCase(); b = b.toLowerCase(); @@ -71,7 +72,7 @@ var compareAlpha = function(a, b, caseInsensitive, result) { var isFinite = _.isFinite; -exports.naturalCompare = function(a, b, caseInsensitive) { +exports.naturalCompare = (a, b, caseInsensitive) => { var result = 0; if ((isFinite(a) && isFinite(b)) || (isFinite(+a) && isFinite(+b))) { @@ -82,4 +83,10 @@ exports.naturalCompare = function(a, b, caseInsensitive) { } return result; +}; + +exports.getRuleId = filePath => { + var baseName = path.basename(filePath, '.js'); + + return `csf-${_.kebabCase(baseName)}`; }; \ No newline at end of file diff --git a/lib/tpl/lint_rules/js/rule.js b/lib/tpl/lint_rules/js/rule.js new file mode 100644 index 0000000..8ddb4be --- /dev/null +++ b/lib/tpl/lint_rules/js/rule.js @@ -0,0 +1,29 @@ +var _ = require('lodash'); +var sub = require('string-sub'); + +var base = require('../base'); +var utils = require('../rule_utils'); + +module.exports = { + meta: { + docs: { + description: '<%= description %>', + category: 'Fill me in', + recommended: false + }, + fixable: null, // or "code" or "whitespace" + schema: [ + // fill in your schema + ] + }, + + create(context) { + return { + + // ReturnStatement: function(node) { + // .... + // } + + }; + } +}; \ No newline at end of file diff --git a/lib/tpl/lint_rules/js/test.js b/lib/tpl/lint_rules/js/test.js new file mode 100644 index 0000000..9e0f6e4 --- /dev/null +++ b/lib/tpl/lint_rules/js/test.js @@ -0,0 +1,25 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require(`../../lib/lint_js_rules/${path.basename(__filename)}`), + { + valid: [ + // Code that won't give a warning + ], + + invalid: [ + // { + // code: '', + // errors: [ { message: 'Something went wrong' } ] + // } + ] + } +); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0c040f2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13637 @@ +{ + "name": "check-source-formatting", + "version": "2.0.0-rc.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "requires": { + "jsonparse": "0.0.5", + "through": "2.3.8" + } + }, + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==" + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.0" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.8.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "autoprefixer": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.4.tgz", + "integrity": "sha512-MB1XybOJqu1uAwpfSilAa1wSURNc4W310CFKvMj1fNaJBFxr1PGgz72vZaPr9ryKGqs2vYZ6jDyJ0aiGELjsoA==", + "requires": { + "browserslist": "2.4.0", + "caniuse-lite": "1.0.30000727", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.11", + "postcss-value-parser": "3.3.0" + } + }, + "babel-code-frame": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", + "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", + "requires": { + "chalk": "2.1.0", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + } + } + }, + "babel-eslint": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.0.tgz", + "integrity": "sha512-tN1B3adZ3tw8pr9oGsZ18iKCbdKBSvsn9ab6cGdbED+61LpGLhIVcf76eh59XejbdRLTBe+OYezxmYIaTgPiYA==", + "requires": { + "babel-code-frame": "7.0.0-beta.0", + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22" + } + }, + "babel-helper-function-name": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.0.tgz", + "integrity": "sha512-DaQccFBBWBEzMdqbKmNXamY0m1yLHJGOdbbEsNoGdJrrU7wAF3wwowtDDPzF0ZT3SqJXPgZW/P2kgBX9moMuAA==", + "requires": { + "babel-helper-get-function-arity": "7.0.0-beta.0", + "babel-template": "7.0.0-beta.0", + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0" + } + }, + "babel-helper-get-function-arity": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.0.tgz", + "integrity": "sha512-csqAic15/2Vm1951nJxkkL9K8E6ojyNF/eAOjk7pqJlO8kvgrccGNFCV9eDwcGHDPe5AjvJGwVSAcQ5fit9wuA==", + "requires": { + "babel-types": "7.0.0-beta.0" + } + }, + "babel-messages": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-7.0.0-beta.0.tgz", + "integrity": "sha512-eXdShsm9ZTh9AQhlIaAn6HR3xWpxCnK9ZwIDA9QyjnwTgMctGxHHflw4b4RJ3/ZjTL0Vrmvm0tQXPkp49mTAUw==" + }, + "babel-template": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.0.tgz", + "integrity": "sha512-tmdH+MmmU0F6Ur8humpevSmFzYKbrN3Oru0g5Qyg4R6+sxjnzZmnvzUbsP0aKMr7tB0Ua6xhEb9arKTOsEMkyA==", + "requires": { + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", + "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", + "requires": { + "babel-code-frame": "7.0.0-beta.0", + "babel-helper-function-name": "7.0.0-beta.0", + "babel-messages": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22", + "debug": "3.0.1", + "globals": "10.1.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", + "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "2.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.22", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.22.tgz", + "integrity": "sha512-Yl7iT8QGrS8OfR7p6R12AJexQm+brKwrryai4VWZ7NHUbPoZ5al3+klhvl/14shXZiLa7uK//OIFuZ1/RKHgoA==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "boxen": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", + "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.1.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + } + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browserslist": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.4.0.tgz", + "integrity": "sha512-aM2Gt4x9bVlCUteADBS6JP0F+2tMWKM1jQzUulVROtdFWFIcIVvY76AJbr7GDqy0eDhn+PcnpzzivGxY4qiaKQ==", + "requires": { + "caniuse-lite": "1.0.30000727", + "electron-to-chromium": "1.3.21" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caniuse-db": { + "version": "1.0.30000727", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000727.tgz", + "integrity": "sha1-TiJZMImw81wbKtz8KCNEk6IaSy4=" + }, + "caniuse-lite": { + "version": "1.0.30000727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000727.tgz", + "integrity": "sha1-IMiVdoOY3tX5ikvqtKdsKF3vQdI=" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + }, + "dependencies": { + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "file:node_shrinkwrap/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "file:node_shrinkwrap/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + } + } + }, + "chai-string": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.4.0.tgz", + "integrity": "sha1-NZFAwFHTak5LGl/GuRAVL0OKjUk=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=" + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "requires": { + "exit": "0.1.2", + "glob": "7.1.2" + }, + "dependencies": { + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-color-keywords": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/cli-color-keywords/-/cli-color-keywords-0.0.1.tgz", + "integrity": "sha1-3eoJX653nJ5LT0FYHsenbbSOlLc=", + "requires": { + "chalk": "1.1.3", + "lodash": "3.10.1" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.0.tgz", + "integrity": "sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw=", + "requires": { + "is-regexp": "1.0.0", + "is-supported-regexp-flag": "1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "requires": { + "color-name": "1.1.3" + } + }, + "color-diff": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", + "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=" + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colorguard": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/colorguard/-/colorguard-1.2.0.tgz", + "integrity": "sha1-8/rK9cquuk71RlPZ+yW7cxd8DYQ=", + "requires": { + "chalk": "1.1.3", + "color-diff": "0.1.7", + "log-symbols": "1.0.2", + "object-assign": "4.1.1", + "pipetteur": "2.0.3", + "plur": "2.1.2", + "postcss": "5.2.17", + "postcss-reporter": "1.4.1", + "text-table": "0.2.0", + "yargs": "1.3.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "1.1.3" + } + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "1.1.3", + "js-base64": "2.3.2", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "postcss-reporter": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", + "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", + "requires": { + "chalk": "1.1.3", + "lodash": "4.17.4", + "log-symbols": "1.0.2", + "postcss": "5.2.17" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.0.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "content-formatter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/content-formatter/-/content-formatter-2.0.2.tgz", + "integrity": "sha1-dqUrLiSQy1dLsEqeojZoypwiAqo=", + "requires": { + "drip": "1.4.0", + "lodash": "4.17.4" + } + }, + "content-logger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-logger/-/content-logger-1.0.1.tgz", + "integrity": "sha1-dsobrEkqmKoL/xhIfkr2bHxvFlM=", + "requires": { + "content-logger-handlebars-helpers": "0.0.1", + "drip": "1.4.0", + "lodash": "4.17.4" + } + }, + "content-logger-handlebars-helpers": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/content-logger-handlebars-helpers/-/content-logger-handlebars-helpers-0.0.1.tgz", + "integrity": "sha1-V797IGgUio4PZItp+SnF0qUNQr0=", + "requires": { + "cli-color-keywords": "0.0.1", + "handlebars": "3.0.3", + "lodash": "3.10.1" + }, + "dependencies": { + "handlebars": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.3.tgz", + "integrity": "sha1-DgllGi8Ps8lJFgWDcQ1VH5Lm0q0=", + "requires": { + "optimist": "0.6.1", + "source-map": "0.1.43", + "uglify-js": "2.3.6" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": "1.0.1" + }, + "dependencies": { + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + } + } + }, + "uglify-js": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", + "optional": true, + "requires": { + "async": "0.2.10", + "optimist": "0.3.7", + "source-map": "0.1.43" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "optional": true + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "optional": true, + "requires": { + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "optional": true + } + } + } + } + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.9.1", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + } + }, + "coveralls": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", + "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + }, + "dependencies": { + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + }, + "dependencies": { + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.0.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + }, + "dependencies": { + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.9.0", + "is-my-json-valid": "2.16.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + } + } + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + }, + "dependencies": { + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + }, + "dependencies": { + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + } + } + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + } + } + } + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + }, + "dependencies": { + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "requires": { + "extsprintf": "1.0.2" + } + } + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + } + } + } + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + }, + "dependencies": { + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true + } + } + } + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "css-color-names": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.3.tgz", + "integrity": "sha1-3gzvFvTYqoIioyDVttfpu62nufY=" + }, + "css-rule-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", + "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=", + "requires": { + "css-tokenize": "1.0.1", + "duplexer2": "0.0.2", + "ldjson-stream": "1.2.1", + "through2": "0.6.5" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "css-tokenize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", + "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "1.0.2" + } + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "debug": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", + "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "doiuse": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-2.6.0.tgz", + "integrity": "sha1-GJLRC2Gpo1at2/K2FJM+gfi7ODQ=", + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000727", + "css-rule-stream": "1.1.0", + "duplexer2": "0.0.2", + "jsonfilter": "1.1.2", + "ldjson-stream": "1.2.1", + "lodash": "4.17.4", + "multimatch": "2.1.0", + "postcss": "5.2.17", + "source-map": "0.4.4", + "through2": "0.6.5", + "yargs": "3.32.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "1.0.30000727", + "electron-to-chromium": "1.3.21" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "1.1.3", + "js-base64": "2.3.2", + "source-map": "0.5.7", + "supports-color": "3.2.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "1.0.0" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "1.0.1" + } + }, + "drip": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/drip/-/drip-1.4.0.tgz", + "integrity": "sha1-JDhhZq2QrsZ9aYYaGAieET7fJgI=", + "requires": { + "tea-concat": "0.1.0" + }, + "dependencies": { + "tea-concat": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tea-concat/-/tea-concat-0.1.0.tgz", + "integrity": "sha1-6i6QdAD914pjNM4CD6PGlQLZnoQ=" + } + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "1.1.14" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "electron-to-chromium": { + "version": "1.3.21", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz", + "integrity": "sha1-qWfr3P6O0Ag/wkTRiUAiqOgRPqI=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.18" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.0.tgz", + "integrity": "sha512-Cf9/h5MrXtExM20gSS55YFrGKCyPrRBjIVBtVyy8vmlsDfe0NPKMWj65tPLgzyfPuapWxh5whpXCtW4+AW5mRg==", + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.0", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.7.0.tgz", + "integrity": "sha1-01/AfEclIL496Fs9oR6ZxXav1RU=", + "requires": { + "ajv": "5.2.2", + "babel-code-frame": "6.26.0", + "chalk": "2.1.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.0.1", + "doctrine": "2.0.0", + "eslint-scope": "3.7.1", + "espree": "3.5.1", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "inquirer": "3.2.2", + "is-resolvable": "1.0.0", + "js-yaml": "3.9.1", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.4.1", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.1", + "text-table": "0.2.0" + }, + "dependencies": { + "ajv": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", + "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "eslint-plugin-dollar-sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-dollar-sign/-/eslint-plugin-dollar-sign-1.0.0.tgz", + "integrity": "sha1-r7pQRZ6d6XpfzXdjJ55MOp4ltaw=", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.3.0.tgz", + "integrity": "sha512-7L6QEOxm7XhcDoe+U9Qt7GJjU6KeQOX9jCLGE8EPGF6FQbwZ9LgcBzsjXIZv9oYvNQlvQZmLjJs76xEeWsI4QA==", + "requires": { + "doctrine": "2.0.0", + "has": "1.0.1", + "jsx-ast-utils": "2.0.0", + "prop-types": "15.5.10" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "espree": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "requires": { + "acorn": "5.1.2", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "execall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", + "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "requires": { + "clone-regexp": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "external-editor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", + "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "requires": { + "iconv-lite": "0.4.18", + "jschardet": "1.5.1", + "tmp": "0.0.31" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "falafel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", + "integrity": "sha1-wY0k71CRF0pJfzGM0ksCaiXN2rQ=", + "requires": { + "acorn": "1.2.2", + "foreach": "2.0.5", + "isarray": "0.0.1", + "object-keys": "1.0.11" + }, + "dependencies": { + "acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + } + } + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.1.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fbjs": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.14.tgz", + "integrity": "sha1-0dviviVMNakeCfMfnNUKQLKg7Rw=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.14" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gather-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", + "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=" + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-10.1.0.tgz", + "integrity": "sha1-RCWhiBvg0za0qCOoKnvnJdXdmHw=" + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=" + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.3", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + }, + "dependencies": { + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.0.1" + }, + "dependencies": { + "time-stamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + } + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.2.9", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.0", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true, + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.0.2", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.3.3" + }, + "dependencies": { + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + }, + "dependencies": { + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + }, + "dependencies": { + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + } + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.0", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.0.3" + }, + "dependencies": { + "arr-flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", + "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", + "dev": true + } + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + }, + "dependencies": { + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.6", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "randomatic": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", + "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "kind-of": "3.2.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + } + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + }, + "dependencies": { + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "kind-of": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.0.tgz", + "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.0.1" + }, + "dependencies": { + "remove-trailing-separator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz", + "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + }, + "dependencies": { + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.2", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + } + } + }, + "is-dotfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", + "dev": true + } + } + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + }, + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + } + } + } + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + }, + "dependencies": { + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + } + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + }, + "dependencies": { + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "0.2.0", + "which": "1.2.14" + }, + "dependencies": { + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + }, + "dependencies": { + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + } + } + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + } + } + } + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + } + } + } + } + } + } + }, + "fined": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.0.2.tgz", + "integrity": "sha1-WyhCS3YNdZiWC374SA3/itNmDpc=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "lodash.assignwith": "4.2.0", + "lodash.isempty": "4.4.0", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.pick": "4.4.0", + "parse-filepath": "1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + } + } + }, + "lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha1-EnqX8CrcQXUalU0ksN4X4QDgOOs=", + "dev": true + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true, + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + }, + "dependencies": { + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + }, + "dependencies": { + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "0.1.2" + }, + "dependencies": { + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + }, + "dependencies": { + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + } + } + } + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + }, + "dependencies": { + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + } + } + } + } + } + } + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.3.3" + } + }, + "resolve": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + }, + "dependencies": { + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + } + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + }, + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + } + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "dev": true + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + } + } + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + }, + "dependencies": { + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + } + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + } + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + }, + "dependencies": { + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + } + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + } + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + }, + "dependencies": { + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + }, + "dependencies": { + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + } + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + } + } + } + } + } + } + } + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.0" + }, + "dependencies": { + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + }, + "dependencies": { + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + } + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + } + } + }, + "gulp-complexity": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/gulp-complexity/-/gulp-complexity-0.3.2.tgz", + "integrity": "sha1-yPn2L1WuqK8ROCK6gBkqwtTlMlI=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "complexity-report": "0.6.2", + "gulp-util": "2.2.20", + "multiline": "0.2.0", + "string-interpolate": "0.1.1", + "through2": "0.4.2", + "util-extend": "1.0.3" + }, + "dependencies": { + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "complexity-report": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/complexity-report/-/complexity-report-0.6.2.tgz", + "integrity": "sha1-XgLgp2ZIKNDLWt/0PK0pd4RIIPw=", + "dev": true, + "requires": { + "check-types": "0.3.1", + "commander": "1.1.1", + "esprima": "1.0.4" + }, + "dependencies": { + "check-types": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-0.3.1.tgz", + "integrity": "sha1-DA1G8yq4mgHKq+AM0S4p+vJx89A=", + "dev": true + }, + "commander": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz", + "integrity": "sha1-UNFlGGiuYOzP8KLZ80WVN2vGsEE=", + "dev": true, + "requires": { + "keypress": "0.1.0" + }, + "dependencies": { + "keypress": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", + "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=", + "dev": true + } + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true + } + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "requires": { + "chalk": "0.5.1", + "dateformat": "1.0.12", + "lodash._reinterpolate": "2.4.1", + "lodash.template": "2.4.1", + "minimist": "0.2.0", + "multipipe": "0.1.2", + "through2": "0.5.1", + "vinyl": "0.2.3" + }, + "dependencies": { + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + } + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + } + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.3.8", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + }, + "dependencies": { + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + }, + "dependencies": { + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + } + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + } + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "normalize-package-data": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "dev": true, + "requires": { + "hosted-git-info": "2.4.2", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + } + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + }, + "dependencies": { + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + } + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + } + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + } + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.3.8", + "path-type": "1.1.0" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + }, + "dependencies": { + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } + } + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + } + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + }, + "dependencies": { + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + } + } + } + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + } + } + } + } + } + } + } + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + }, + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + }, + "dependencies": { + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + }, + "dependencies": { + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + } + } + } + } + } + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + } + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "2.4.1", + "lodash._reinterpolate": "2.4.1", + "lodash.defaults": "2.4.1", + "lodash.escape": "2.4.1", + "lodash.keys": "2.4.1", + "lodash.templatesettings": "2.4.1", + "lodash.values": "2.4.1" + }, + "dependencies": { + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + } + } + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "2.4.1", + "lodash._reunescapedhtml": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1" + }, + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + } + } + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + } + } + } + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + }, + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + }, + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + } + } + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + }, + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + } + } + } + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "2.4.1", + "lodash.escape": "2.4.1" + } + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "2.4.1" + } + } + } + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "0.0.1" + }, + "dependencies": { + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "multiline": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/multiline/-/multiline-0.2.0.tgz", + "integrity": "sha1-fLSkvRW58jgAe/BbFjBtLRKriVg=", + "dev": true + }, + "string-interpolate": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/string-interpolate/-/string-interpolate-0.1.1.tgz", + "integrity": "sha1-Q2gxkDEgI7DsBx7EV5d9iomGdz0=", + "dev": true + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "2.1.2" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "0.4.0" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + } + } + } + } + }, + "util-extend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=", + "dev": true + } + } + }, + "gulp-coveralls": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/gulp-coveralls/-/gulp-coveralls-0.1.4.tgz", + "integrity": "sha1-L2IKyN9i0LhrS73mTaNnzEGhkMk=", + "dev": true, + "requires": { + "coveralls": "2.13.1", + "gulp-util": "3.0.8", + "through2": "1.1.1" + }, + "dependencies": { + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.0.1" + }, + "dependencies": { + "time-stamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.2.9", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.0", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + } + } + }, + "gulp-debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gulp-debug/-/gulp-debug-3.1.0.tgz", + "integrity": "sha1-TakVaLVJFb6ANpbKqsEMiVssCnE=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "gulp-util": "3.0.8", + "plur": "2.1.2", + "stringify-object": "3.2.0", + "through2": "2.0.3", + "tildify": "1.2.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.0.1" + }, + "dependencies": { + "time-stamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "1.2.0" + }, + "dependencies": { + "irregular-plurals": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.2.0.tgz", + "integrity": "sha1-OPKZg0uowAwwvpxVThNyaXUv86w=", + "dev": true + } + } + }, + "stringify-object": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.0.tgz", + "integrity": "sha1-lDcKE15BvASDWIE7+ZSB8TFcaqY=", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "1.0.1", + "is-obj": "1.0.1", + "is-regexp": "1.0.0" + }, + "dependencies": { + "get-own-enumerable-property-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-1.0.1.tgz", + "integrity": "sha1-8dTjrRQC4DmJjlbR6bmqkkwm5IQ=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + } + } + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.2.9", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.0", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + } + } + } + } + }, + "gulp-doctoc": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/gulp-doctoc/-/gulp-doctoc-0.1.4.tgz", + "integrity": "sha1-ChGZPyIMTPUJbbcBQo23ilW/tn8=", + "dev": true, + "requires": { + "doctoc": "1.3.0", + "gulp-util": "2.2.20", + "through2": "0.4.2" + }, + "dependencies": { + "doctoc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/doctoc/-/doctoc-1.3.0.tgz", + "integrity": "sha1-fwg5hR3VjICKLK5V2VBOAS0I7jA=", + "dev": true, + "requires": { + "anchor-markdown-header": "0.5.7", + "htmlparser2": "3.9.2", + "markdown-to-ast": "3.4.0", + "minimist": "1.2.0", + "underscore": "1.8.3", + "update-section": "0.3.3" + }, + "dependencies": { + "anchor-markdown-header": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.5.7.tgz", + "integrity": "sha1-BFBj125qH5zTJ6V6ASaqD97Dcac=", + "dev": true, + "requires": { + "emoji-regex": "6.1.3" + }, + "dependencies": { + "emoji-regex": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.3.tgz", + "integrity": "sha1-7HmjlpsC0uzytyJUJ5v5m8eoOTI=", + "dev": true + } + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.6.2", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.2.9" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", + "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + }, + "dependencies": { + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + } + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.0", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + } + } + }, + "markdown-to-ast": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/markdown-to-ast/-/markdown-to-ast-3.4.0.tgz", + "integrity": "sha1-Diy6gTkLBUmpFT7DsNkVthwWS+c=", + "dev": true, + "requires": { + "debug": "2.6.6", + "remark": "5.1.0", + "structured-source": "3.0.2", + "traverse": "0.6.6" + }, + "dependencies": { + "debug": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.6.tgz", + "integrity": "sha1-qfpvvpykPPHnn3O3XAGJy7fW21o=", + "dev": true, + "requires": { + "ms": "0.7.3" + }, + "dependencies": { + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "dev": true + } + } + }, + "remark": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-5.1.0.tgz", + "integrity": "sha1-y0Y709vLS5l5STXu4c9x16jjBow=", + "dev": true, + "requires": { + "remark-parse": "1.1.0", + "remark-stringify": "1.1.0", + "unified": "4.2.1" + }, + "dependencies": { + "remark-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-1.1.0.tgz", + "integrity": "sha1-w8oQ+ajaBGFcKPCapOMEUQUm7CE=", + "dev": true, + "requires": { + "collapse-white-space": "1.0.2", + "extend": "3.0.1", + "parse-entities": "1.1.0", + "repeat-string": "1.6.1", + "trim": "0.0.1", + "trim-trailing-lines": "1.1.0", + "unherit": "1.1.0", + "unist-util-remove-position": "1.1.0", + "vfile-location": "2.0.1" + }, + "dependencies": { + "collapse-white-space": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.2.tgz", + "integrity": "sha1-nEY/ucbRkNLcriGjVqAbyunu720=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "parse-entities": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.0.tgz", + "integrity": "sha1-S8WPNf3I5l3e01oS8uQCI8oko/c=", + "dev": true, + "requires": { + "character-entities": "1.2.0", + "character-entities-legacy": "1.1.0", + "character-reference-invalid": "1.1.0", + "has": "1.0.1", + "is-alphanumerical": "1.0.0", + "is-decimal": "1.0.0", + "is-hexadecimal": "1.0.0" + }, + "dependencies": { + "character-entities": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.0.tgz", + "integrity": "sha1-poPiz3Xb6LFxljUxNk5Y4YobFV8=", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.0.tgz", + "integrity": "sha1-sYqtmPa3vMZGweTIH58ZVjdqVho=", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.0.tgz", + "integrity": "sha1-3smtHfufjQa0/NqircPE/ZevHmg=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + }, + "dependencies": { + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + } + } + }, + "is-alphanumerical": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.0.tgz", + "integrity": "sha1-4GSS5xnBvxXewjnk8a9fZ7TW578=", + "dev": true, + "requires": { + "is-alphabetical": "1.0.0", + "is-decimal": "1.0.0" + }, + "dependencies": { + "is-alphabetical": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.0.tgz", + "integrity": "sha1-4lRMEwWCVfIUTLdXBmzTNCocjEY=", + "dev": true + } + } + }, + "is-decimal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.0.tgz", + "integrity": "sha1-lAV5tupjxigICmnmK9qIyEcLT+A=", + "dev": true + }, + "is-hexadecimal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.0.tgz", + "integrity": "sha1-XEWXcdKvmi45Ungf1U/LG8/kETw=", + "dev": true + } + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz", + "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=", + "dev": true + }, + "unherit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", + "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "xtend": "4.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "unist-util-remove-position": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.0.tgz", + "integrity": "sha1-JET+3DRLxfVA2rY1PgE7bXgQHcI=", + "dev": true, + "requires": { + "unist-util-visit": "1.1.1" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.1.1.tgz", + "integrity": "sha1-6RejsTdlizNctEIMfaLnTZKOTpQ=", + "dev": true + } + } + }, + "vfile-location": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.1.tgz", + "integrity": "sha1-C/iBb3MrD4vZAqVv2kxiyOk13FI=", + "dev": true + } + } + }, + "remark-stringify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-1.1.0.tgz", + "integrity": "sha1-pxBeJbnuK/mkm3XSxCPxGwauIJI=", + "dev": true, + "requires": { + "ccount": "1.0.1", + "extend": "3.0.1", + "longest-streak": "1.0.0", + "markdown-table": "0.4.0", + "parse-entities": "1.1.0", + "repeat-string": "1.6.1", + "stringify-entities": "1.3.0", + "unherit": "1.1.0" + }, + "dependencies": { + "ccount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.1.tgz", + "integrity": "sha1-ZlaHlFFowhjsd/9hpBVa4AInqWw=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "longest-streak": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-1.0.0.tgz", + "integrity": "sha1-0GWXxNTDG1LMsfXY+P5xSOr9aWU=", + "dev": true + }, + "markdown-table": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-0.4.0.tgz", + "integrity": "sha1-iQwsGzv+g/sA5BKbjkz+ZFJw+dE=", + "dev": true + }, + "parse-entities": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.0.tgz", + "integrity": "sha1-S8WPNf3I5l3e01oS8uQCI8oko/c=", + "dev": true, + "requires": { + "character-entities": "1.2.0", + "character-entities-legacy": "1.1.0", + "character-reference-invalid": "1.1.0", + "has": "1.0.1", + "is-alphanumerical": "1.0.0", + "is-decimal": "1.0.0", + "is-hexadecimal": "1.0.0" + }, + "dependencies": { + "character-entities": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.0.tgz", + "integrity": "sha1-poPiz3Xb6LFxljUxNk5Y4YobFV8=", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.0.tgz", + "integrity": "sha1-sYqtmPa3vMZGweTIH58ZVjdqVho=", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.0.tgz", + "integrity": "sha1-3smtHfufjQa0/NqircPE/ZevHmg=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + }, + "dependencies": { + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + } + } + }, + "is-alphanumerical": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.0.tgz", + "integrity": "sha1-4GSS5xnBvxXewjnk8a9fZ7TW578=", + "dev": true, + "requires": { + "is-alphabetical": "1.0.0", + "is-decimal": "1.0.0" + }, + "dependencies": { + "is-alphabetical": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.0.tgz", + "integrity": "sha1-4lRMEwWCVfIUTLdXBmzTNCocjEY=", + "dev": true + } + } + }, + "is-decimal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.0.tgz", + "integrity": "sha1-lAV5tupjxigICmnmK9qIyEcLT+A=", + "dev": true + }, + "is-hexadecimal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.0.tgz", + "integrity": "sha1-XEWXcdKvmi45Ungf1U/LG8/kETw=", + "dev": true + } + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "stringify-entities": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.0.tgz", + "integrity": "sha1-IkSlFsTx6OAbc9rQECMBZ3ar2Rc=", + "dev": true, + "requires": { + "character-entities-html4": "1.1.0", + "character-entities-legacy": "1.1.0", + "has": "1.0.1", + "is-alphanumerical": "1.0.0", + "is-hexadecimal": "1.0.0" + }, + "dependencies": { + "character-entities-html4": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.0.tgz", + "integrity": "sha1-GrCFUdPOH6HfCNAPucod77FHoGw=", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.0.tgz", + "integrity": "sha1-sYqtmPa3vMZGweTIH58ZVjdqVho=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + }, + "dependencies": { + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + } + } + }, + "is-alphanumerical": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.0.tgz", + "integrity": "sha1-4GSS5xnBvxXewjnk8a9fZ7TW578=", + "dev": true, + "requires": { + "is-alphabetical": "1.0.0", + "is-decimal": "1.0.0" + }, + "dependencies": { + "is-alphabetical": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.0.tgz", + "integrity": "sha1-4lRMEwWCVfIUTLdXBmzTNCocjEY=", + "dev": true + }, + "is-decimal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.0.tgz", + "integrity": "sha1-lAV5tupjxigICmnmK9qIyEcLT+A=", + "dev": true + } + } + }, + "is-hexadecimal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.0.tgz", + "integrity": "sha1-XEWXcdKvmi45Ungf1U/LG8/kETw=", + "dev": true + } + } + }, + "unherit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", + "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "xtend": "4.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + } + } + }, + "unified": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/unified/-/unified-4.2.1.tgz", + "integrity": "sha1-dv9Dqo2kMPbn5KVchOusKtLPzS4=", + "dev": true, + "requires": { + "bail": "1.0.1", + "extend": "3.0.1", + "has": "1.0.1", + "once": "1.4.0", + "trough": "1.0.0", + "vfile": "1.4.0" + }, + "dependencies": { + "bail": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.1.tgz", + "integrity": "sha1-kSV53os5Gq3zxf30zSoPwiXfO8I=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + }, + "dependencies": { + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "trough": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.0.tgz", + "integrity": "sha1-a97f5/KqSabzxDIldodVWVfzQv0=", + "dev": true + }, + "vfile": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-1.4.0.tgz", + "integrity": "sha1-wP1vpIT43r23cfaMMe112I2pf+c=", + "dev": true + } + } + } + } + }, + "structured-source": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-3.0.2.tgz", + "integrity": "sha1-3YAkJeD1PcSm56yjdSkBoczaevU=", + "dev": true, + "requires": { + "boundary": "1.0.1" + }, + "dependencies": { + "boundary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-1.0.1.tgz", + "integrity": "sha1-TWfcJgLAzBbdm85+v4fpSCkPWBI=", + "dev": true + } + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "file:node_shrinkwrap/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "update-section": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/update-section/-/update-section-0.3.3.tgz", + "integrity": "sha1-RY8Xgg03gg3GDiC4bZQ5GwASMVg=", + "dev": true + } + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "requires": { + "chalk": "0.5.1", + "dateformat": "1.0.12", + "lodash._reinterpolate": "2.4.1", + "lodash.template": "2.4.1", + "minimist": "0.2.0", + "multipipe": "0.1.2", + "through2": "0.5.1", + "vinyl": "0.2.3" + }, + "dependencies": { + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + } + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + } + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.3.8", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + }, + "dependencies": { + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + }, + "dependencies": { + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + } + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + } + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "normalize-package-data": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "dev": true, + "requires": { + "hosted-git-info": "2.4.2", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + } + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + }, + "dependencies": { + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + } + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + } + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + } + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.3.8", + "path-type": "1.1.0" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + }, + "dependencies": { + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } + } + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + } + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + }, + "dependencies": { + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + } + } + } + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + } + } + } + } + } + } + } + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + }, + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + }, + "dependencies": { + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + }, + "dependencies": { + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + } + } + } + } + } + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + } + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "2.4.1", + "lodash._reinterpolate": "2.4.1", + "lodash.defaults": "2.4.1", + "lodash.escape": "2.4.1", + "lodash.keys": "2.4.1", + "lodash.templatesettings": "2.4.1", + "lodash.values": "2.4.1" + }, + "dependencies": { + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + } + } + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "2.4.1", + "lodash._reunescapedhtml": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1" + }, + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + } + } + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + } + } + } + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + }, + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + }, + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + } + } + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + }, + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + } + } + } + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "2.4.1", + "lodash.escape": "2.4.1" + } + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "2.4.1" + } + } + } + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "0.0.1" + }, + "dependencies": { + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "2.1.2" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "0.4.0" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + } + } + } + } + } + } + }, + "gulp-istanbul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gulp-istanbul/-/gulp-istanbul-1.1.2.tgz", + "integrity": "sha512-53+BDhGlGNHYfeFh/mSXWhNu9wSFmE8qAEFj6ViMiWzTwI9pYxedUxMmGfigwaddsHHQxBl9TgnzUydrX84Kog==", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "istanbul": "0.4.5", + "istanbul-threshold-checker": "0.2.1", + "lodash": "4.17.4", + "through2": "2.0.3", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "gulp-load-plugins": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/gulp-load-plugins/-/gulp-load-plugins-1.5.0.tgz", + "integrity": "sha1-TEGffldk2aDjMGG6uWGPgbc9QXE=", + "dev": true, + "requires": { + "array-unique": "0.2.1", + "fancy-log": "1.3.0", + "findup-sync": "0.4.3", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "micromatch": "2.3.11", + "resolve": "1.3.3" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.0.1" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "time-stamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", + "dev": true + } + } + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + }, + "dependencies": { + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + }, + "dependencies": { + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + } + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + }, + "dependencies": { + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + } + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + }, + "dependencies": { + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "0.2.0", + "which": "1.2.14" + }, + "dependencies": { + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + }, + "dependencies": { + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + } + } + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + } + } + } + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + } + } + } + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.0", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.0.3" + }, + "dependencies": { + "arr-flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", + "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", + "dev": true + } + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + }, + "dependencies": { + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.6", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "randomatic": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", + "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "kind-of": "3.2.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + } + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + }, + "dependencies": { + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.0.tgz", + "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.0.1" + }, + "dependencies": { + "remove-trailing-separator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz", + "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + }, + "dependencies": { + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.2", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + } + } + }, + "is-dotfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", + "dev": true + } + } + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + }, + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + } + } + } + } + }, + "resolve": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + }, + "dependencies": { + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + } + } + } + } + }, + "gulp-mocha": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-3.0.1.tgz", + "integrity": "sha1-qwyiw5QDcYF03drXUOY6Yb4X4EE=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "mocha": "3.3.0", + "plur": "2.1.2", + "req-cwd": "1.0.1", + "temp": "0.8.3", + "through": "2.3.8" + }, + "dependencies": { + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.0.1" + }, + "dependencies": { + "time-stamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.2.9", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.0", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "1.2.0" + }, + "dependencies": { + "irregular-plurals": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.2.0.tgz", + "integrity": "sha1-OPKZg0uowAwwvpxVThNyaXUv86w=", + "dev": true + } + } + }, + "req-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-1.0.1.tgz", + "integrity": "sha1-DXOurpJm5penj3l2AZZ352rPD/8=", + "dev": true, + "requires": { + "req-from": "1.0.1" + }, + "dependencies": { + "req-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-1.0.1.tgz", + "integrity": "sha1-v4HaUUeUfTLRO5R9wSpYrUWHNQ4=", + "dev": true, + "requires": { + "resolve-from": "2.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "file:node_shrinkwrap/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true + } + } + } + } + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2", + "rimraf": "2.2.8" + }, + "dependencies": { + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + } + } + }, + "gulp-rename": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", + "dev": true + }, + "gulp-template": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-template/-/gulp-template-4.0.0.tgz", + "integrity": "sha1-Bd42gIxvuZZleNWpTucs7gjNxTs=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "lodash": "4.17.4", + "through2": "2.0.3" + }, + "dependencies": { + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.0.1" + }, + "dependencies": { + "time-stamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.2.9", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.0", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + } + }, + "harmonize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/harmonize/-/harmonize-2.0.0.tgz", + "integrity": "sha1-peMLabaNc+PsPAQYOR8RCoDo1Pc=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" + }, + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "2.0.1" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "inquirer": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.2.tgz", + "integrity": "sha512-bTKLzEHJVATimZO/YFdLrom0lRx1BHfRYskFHfIMVkGdp8+dIZaxuU+4yrsS1lcu6YWywVQVVsfvdwESzbeqHw==", + "requires": { + "ansi-escapes": "2.0.0", + "chalk": "2.1.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.0.4", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + } + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "irregular-plurals": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz", + "integrity": "sha1-evBpMb33S+M9z1haE+BvzMFsrs8=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "requires": { + "tryit": "1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-supported-regexp-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz", + "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.2", + "whatwg-fetch": "2.0.3" + } + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.8", + "js-yaml": "3.8.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.2.14", + "wordwrap": "1.0.0" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + } + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + }, + "dependencies": { + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + } + } + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + } + } + }, + "handlebars": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.8.tgz", + "integrity": "sha1-Irh1zT8ObL6jAxTxROgrx6cv9CA=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.23" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + }, + "dependencies": { + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + } + } + }, + "uglify-js": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.23.tgz", + "integrity": "sha1-gjDdl4M3EjLWKngh4s+agXJwqKA=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true, + "optional": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.0", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.0.tgz", + "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true, + "optional": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + } + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + } + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.0", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.0.tgz", + "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true, + "optional": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + } + } + } + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "optional": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + } + } + } + } + } + } + }, + "js-yaml": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", + "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "3.1.3" + }, + "dependencies": { + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + } + } + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + } + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "istanbul-threshold-checker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/istanbul-threshold-checker/-/istanbul-threshold-checker-0.2.1.tgz", + "integrity": "sha1-xdyU6PLMXNP/0zVFL4S1U8QkgzE=", + "dev": true, + "requires": { + "istanbul": "0.4.5", + "lodash": "4.17.4" + } + }, + "js-base64": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", + "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", + "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jschardet": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", + "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "0.0.0" + } + }, + "jsonfilter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz", + "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=", + "requires": { + "JSONStream": "0.8.4", + "minimist": "1.2.0", + "stream-combiner": "0.2.2", + "through2": "0.6.5" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=" + }, + "jsx-ast-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.0.tgz", + "integrity": "sha1-7Aaj1gzzB+XhGdrHutgeifCW8Pg=", + "requires": { + "array-includes": "3.0.3" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + }, + "known-css-properties": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.3.0.tgz", + "integrity": "sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==" + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "4.0.1" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "ldjson-stream": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz", + "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=", + "requires": { + "split2": "0.2.1", + "through2": "0.6.5" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash-bindright": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lodash-bindright/-/lodash-bindright-1.0.1.tgz", + "integrity": "sha1-VnyxrMnCvhAvA1Dpp9+oSGwY+z4=", + "requires": { + "lodash": "3.10.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "lodash-namespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lodash-namespace/-/lodash-namespace-1.0.0.tgz", + "integrity": "sha1-i9rcy40a9sCWsCjLKMdvmbqt68I=", + "requires": { + "lodash": "3.10.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "log-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.0.0.tgz", + "integrity": "sha512-ValCSal2pRxRbet7O69a/1g5fZ2MLxf1YXIslNrdJF42ofY9zVf6MTqTwfhG+2x168xrbZATCgFQfXAwdNHv+w==", + "requires": { + "chalk": "2.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + } + } + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "requires": { + "pify": "2.3.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "mathml-tag-names": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz", + "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=" + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "1.1.7" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.3.0.tgz", + "integrity": "sha1-0pt0KNP1LILi5l3x7LcGThqrv7U=", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.0", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", + "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", + "dev": true, + "requires": { + "ms": "0.7.2" + }, + "dependencies": { + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + }, + "dependencies": { + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + } + } + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + } + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node-fetch": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.2.tgz", + "integrity": "sha512-xZZUq2yDhKMIn/UgG5q//IZSNLJIwW2QxS14CNH5spuiXkITM2pUitjdq58yLSaU7m4M0wBNaM2Gh/ggY4YJig==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onecolor": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.0.4.tgz", + "integrity": "sha1-daRvgNpseqpbTarhekcZi9llJJQ=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pipetteur": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pipetteur/-/pipetteur-2.0.3.tgz", + "integrity": "sha1-GVV2CVno0aEcsqUOyD7sRwYz5J8=", + "requires": { + "onecolor": "3.0.4", + "synesthesia": "1.0.1" + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "requires": { + "irregular-plurals": "1.3.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, + "postcss": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", + "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", + "requires": { + "chalk": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.4.0" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "postcss-less": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.0.tgz", + "integrity": "sha1-vcx2vmTEMk2HP7xc2foueZ5DBfo=", + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "1.1.3", + "js-base64": "2.3.2", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=" + }, + "postcss-reporter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "requires": { + "chalk": "2.1.0", + "lodash": "4.17.4", + "log-symbols": "2.0.0", + "postcss": "6.0.11" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + } + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=" + }, + "postcss-scss": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.2.tgz", + "integrity": "sha1-/0XPM1S4ee6JpOtoaA9GrJuxT5Q=", + "requires": { + "postcss": "6.0.11" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "requires": { + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "prop-types": { + "version": "15.5.10", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=", + "requires": { + "fbjs": "0.8.14", + "loose-envify": "1.3.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-file-stdin": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", + "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", + "requires": { + "gather-stream": "1.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "requires": { + "rc": "1.2.1", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "1.2.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "roolz": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/roolz/-/roolz-1.0.2.tgz", + "integrity": "sha1-9GScCTA2bsSxs12cbFr9ofHpGM8=", + "requires": { + "drip": "1.4.0", + "lodash": "3.10.1", + "string-sub": "0.0.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "run-sequence": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz", + "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "gulp-util": "3.0.8" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.0.1" + }, + "dependencies": { + "time-stamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + } + } + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.2.9", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.0", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + } + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "5.4.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sinon": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.2.0.tgz", + "integrity": "sha1-OxtC/13vy/UaUqYqym1hFxuf0mI=", + "dev": true, + "requires": { + "diff": "3.2.0", + "formatio": "1.2.0", + "lolex": "1.6.0", + "native-promise-only": "0.8.1", + "path-to-regexp": "1.7.0", + "samsam": "1.2.1", + "text-encoding": "0.6.4", + "type-detect": "4.0.3" + }, + "dependencies": { + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "requires": { + "samsam": "1.2.1" + } + }, + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "samsam": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", + "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=", + "dev": true + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + } + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "specificity": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.1.tgz", + "integrity": "sha1-8bBoQkzjF64HR42V3jwhz4Xo1Wc=" + }, + "split2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz", + "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=", + "requires": { + "through2": "0.6.5" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "requires": { + "duplexer": "0.1.1", + "through": "2.3.8" + } + }, + "string-sub": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/string-sub/-/string-sub-0.0.1.tgz", + "integrity": "sha1-Z8lZrDoU5c/igP7wi0IcJAUOqk0=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "4.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + } + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=" + }, + "stylehacks": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-2.3.2.tgz", + "integrity": "sha1-ZMg+BDimjJ7fRJ6MVSp9mrYAmws=", + "requires": { + "browserslist": "1.7.7", + "chalk": "1.1.3", + "log-symbols": "1.0.2", + "minimist": "1.2.0", + "plur": "2.1.2", + "postcss": "5.2.17", + "postcss-reporter": "1.4.1", + "postcss-selector-parser": "2.2.3", + "read-file-stdin": "0.2.1", + "text-table": "0.2.0", + "write-file-stdout": "0.0.2" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "1.0.30000727", + "electron-to-chromium": "1.3.21" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "1.1.3" + } + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "1.1.3", + "js-base64": "2.3.2", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "postcss-reporter": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", + "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", + "requires": { + "chalk": "1.1.3", + "lodash": "4.17.4", + "log-symbols": "1.0.2", + "postcss": "5.2.17" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "stylelint": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-8.1.1.tgz", + "integrity": "sha512-RtjUtqG2h3dP4CuMU1M++GRJGvKXWozmv5yhLoOLy7NWP2jJZOwLZSVwtcjXQsBJBfGuC33mooBOwNaCIhi2tQ==", + "requires": { + "autoprefixer": "7.1.4", + "balanced-match": "1.0.0", + "chalk": "2.1.0", + "cosmiconfig": "2.2.2", + "debug": "3.0.1", + "execall": "1.0.0", + "file-entry-cache": "2.0.0", + "get-stdin": "5.0.1", + "globby": "6.1.0", + "globjoin": "0.1.4", + "html-tags": "2.0.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "known-css-properties": "0.3.0", + "lodash": "4.17.4", + "log-symbols": "2.0.0", + "mathml-tag-names": "2.0.1", + "meow": "3.7.0", + "micromatch": "2.3.11", + "normalize-selector": "0.2.0", + "pify": "3.0.0", + "postcss": "6.0.11", + "postcss-less": "1.1.0", + "postcss-media-query-parser": "0.2.3", + "postcss-reporter": "5.0.0", + "postcss-resolve-nested-selector": "0.1.1", + "postcss-scss": "1.0.2", + "postcss-selector-parser": "2.2.3", + "postcss-value-parser": "3.3.0", + "resolve-from": "3.0.0", + "specificity": "0.3.1", + "string-width": "2.1.1", + "style-search": "0.1.0", + "sugarss": "1.0.0", + "svg-tags": "1.0.0", + "table": "4.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "stylelint-order": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-0.4.4.tgz", + "integrity": "sha1-2338oFQbUGIBDH4uIedFeR/AiKw=", + "requires": { + "lodash": "4.17.4", + "postcss": "5.2.17", + "stylelint": "7.13.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000727", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + } + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "1.0.30000727", + "electron-to-chromium": "1.3.21" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "known-css-properties": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.2.0.tgz", + "integrity": "sha512-UTCzU28rRI9wkb8qSGoZa9pgWvxr4LjP2MEhi9XHb/1XMOJy0uTnIxaxzj8My/PORG+kQG6VzAcGvRw66eIOfA==" + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "js-base64": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=" + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + } + } + } + } + }, + "postcss-less": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-0.14.0.tgz", + "integrity": "sha1-xjGwicbM5CK5oQ86lY0r7dOBkyQ=", + "requires": { + "postcss": "5.2.17" + } + }, + "postcss-reporter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-3.0.0.tgz", + "integrity": "sha1-CeoPN6RExWk4eGBuCbAY6+/3z48=", + "requires": { + "chalk": "1.1.3", + "lodash": "4.17.4", + "log-symbols": "1.0.2", + "postcss": "5.2.17" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "postcss-scss": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-0.4.1.tgz", + "integrity": "sha1-rXcbgfD3L19IRdCKpg+TVXZT1Uw=", + "requires": { + "postcss": "5.2.17" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "stylelint": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.13.0.tgz", + "integrity": "sha1-ER+Xttpy53XICADWu29fhpmXeF0=", + "requires": { + "autoprefixer": "6.7.7", + "balanced-match": "0.4.2", + "chalk": "2.1.0", + "colorguard": "1.2.0", + "cosmiconfig": "2.2.2", + "debug": "2.6.8", + "doiuse": "2.6.0", + "execall": "1.0.0", + "file-entry-cache": "2.0.0", + "get-stdin": "5.0.1", + "globby": "6.1.0", + "globjoin": "0.1.4", + "html-tags": "2.0.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "known-css-properties": "0.2.0", + "lodash": "4.17.4", + "log-symbols": "1.0.2", + "mathml-tag-names": "2.0.1", + "meow": "3.7.0", + "micromatch": "2.3.11", + "normalize-selector": "0.2.0", + "pify": "2.3.0", + "postcss": "5.2.17", + "postcss-less": "0.14.0", + "postcss-media-query-parser": "0.2.3", + "postcss-reporter": "3.0.0", + "postcss-resolve-nested-selector": "0.1.1", + "postcss-scss": "0.4.1", + "postcss-selector-parser": "2.2.3", + "postcss-value-parser": "3.3.0", + "resolve-from": "3.0.0", + "specificity": "0.3.1", + "string-width": "2.1.1", + "style-search": "0.1.0", + "stylehacks": "2.3.2", + "sugarss": "0.2.0", + "svg-tags": "1.0.0", + "table": "4.0.1" + } + }, + "sugarss": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-0.2.0.tgz", + "integrity": "sha1-rDQjdWMyfG/4l7ZHQr9q7BkK054=", + "requires": { + "postcss": "5.2.17" + } + } + } + }, + "sugarss": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.0.tgz", + "integrity": "sha1-ZeUbOVhDL7cNVFGmi7M+MtDPHvc=", + "requires": { + "postcss": "6.0.11" + } + }, + "supports-color": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", + "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", + "requires": { + "has-flag": "2.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=" + }, + "synesthesia": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/synesthesia/-/synesthesia-1.0.1.tgz", + "integrity": "sha1-XvlepUjA1cbm+btLDQcx3/hkp3c=", + "requires": { + "css-color-names": "0.0.3" + } + }, + "table": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", + "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "ua-parser-js": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz", + "integrity": "sha1-EQ1T+kw/MmwSEpK76skE0uAzh8o=" + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "update-notifier": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", + "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", + "requires": { + "boxen": "1.2.1", + "chalk": "1.1.3", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "write-file-stdout": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", + "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=" + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "xsd-schema-validator": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xsd-schema-validator/-/xsd-schema-validator-0.5.0.tgz", + "integrity": "sha1-OjXEblIxV2bk1WjBmBi7kCp2lTE=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", + "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=" + } + } +} diff --git a/package.json b/package.json index 1793ee9..6828174 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "check-source-formatting", - "version": "1.1.10", + "version": "2.0.0-rc.7", "description": "Check the source formatting of HTML/JS/CSS", "main": "lib/cli.js", "bin": { - "check_sf": "./bin/index.js" + "check_sf": "./bin/index.js", + "csf": "./bin/index.js" }, "scripts": { "coveralls": "gulp coveralls", @@ -13,7 +14,7 @@ "author": "Nate Cavanaugh", "license": "BSD", "engines": { - "node": ">=0.10.0" + "node": ">=4" }, "repository": { "type": "git", @@ -21,43 +22,53 @@ }, "preferGlobal": "true", "dependencies": { - "async": "^0.9.0", - "chalk": "^1.0.0", - "cli": "^0.8.0", + "babel-eslint": "^8.0.0", + "bluebird": "^3.4.1", + "cli": "^1.0.0", "cli-color-keywords": "0.0.1", - "content-formatter": "^1.1.0", - "content-logger": "^0.0.3", + "configstore": "^3.1.1", + "content-formatter": "^2.0.2", + "content-logger": "^1.0.1", "content-logger-handlebars-helpers": "0.0.1", + "cosmiconfig": "^2.2.2", "drip": "^1.4.0", - "eslint": "^0.24.0", - "falafel": "^0.3.1", + "eslint": "^4.7.0", + "eslint-plugin-react": "^7.3.0", + "falafel": "^1.2.0", "getobject": "^0.1.0", - "glob": "^5.0.5", - "handlebars": "^3.0.1", - "lodash": "^3.6.0", + "glob": "^7.1.2", + "lodash": "^4.15.0", "lodash-bindright": "^1.0.1", "lodash-namespace": "^1.0.0", + "minimatch": "^3.0.4", "optimist": "^0.6.1", - "roolz": "^1.0.0", + "roolz": "^1.0.2", "string-sub": "0.0.1", - "update-notifier": "^0.5.0" + "stylelint": "^8.1.1", + "stylelint-order": "^0.4.4", + "update-notifier": "^2.2.0" }, "devDependencies": { - "chai": "^2.2.0", - "chai-string": "^1.1.1", - "coveralls": "^2.11.2", - "eslint-tester": "^0.6.0", - "gulp": "^3.8.11", - "gulp-complexity": "^0.3.0", - "gulp-coveralls": "^0.1.3", - "gulp-doctoc": "^0.1.2", - "gulp-istanbul": "^0.8.1", - "gulp-load-plugins": "^1.0.0-rc.1", - "gulp-mocha": "^2.0.1", - "istanbul": "^0.3.13", - "mocha": "^2.2.4", - "run-sequence": "^1.0.2", - "sinon": "^1.14.1", - "xsd-schema-validator": "^0.3.0" + "chai": "^3.5.0", + "chai-string": "^1.4.0", + "coveralls": "^2.13.1", + "eslint-plugin-dollar-sign": "^1.0.0", + "gulp": "^3.9.1", + "gulp-complexity": "^0.3.2", + "gulp-coveralls": "^0.1.4", + "gulp-debug": "^3.1.0", + "gulp-doctoc": "^0.1.4", + "gulp-istanbul": "^1.1.2", + "gulp-load-plugins": "^1.2.4", + "gulp-mocha": "^3.0.1", + "gulp-rename": "^1.2.2", + "gulp-template": "^4.0.0", + "harmonize": "^2.0.0", + "inquirer": "^3.2.2", + "istanbul": "^0.4.4", + "mocha": "^3.3.0", + "run-sequence": "^1.2.2", + "sinon": "^2.2.0", + "xsd-schema-validator": "^0.5.0" } } diff --git a/test/cli.js b/test/cli.js index 9503c2f..dd502ce 100644 --- a/test/cli.js +++ b/test/cli.js @@ -1,11 +1,16 @@ +var _ = require('lodash'); var chai = require('chai'); var fs = require('fs'); var path = require('path'); var sinon = require('sinon'); +var Promise = require('bluebird'); var cli = require('../lib/cli'); var File = require('../lib/file'); var Logger = require('../lib/logger'); +var config = require('../lib/config/eslint'); + +var getRule = require('./test_utils').getRule; chai.use(require('chai-string')); @@ -23,7 +28,19 @@ describe( }; var invalidContentStub = function(path, encoding, callback) { - callback(null, MAP_CONTENT[path][0]); + var file = MAP_CONTENT[path]; + + if (file) { + callback(null, file[0]); + } + else { + var err = new Error('File missing'); + + err.errno = 34; + err.code = 'ENOENT'; + + callback(err); + } }; var validContentStub = function(path, contents, callback) { @@ -47,31 +64,36 @@ describe( it( 'should read files correctly', function() { - sandbox.stub(fs, 'readFile', invalidContentStub); + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); + + var logger = new Logger.constructor(); var cliInstance = new cli.CLI( { args: ['foo.js', 'bar.html', 'baz.css'], - log: sinon.log, - logger: new Logger.constructor() + log: _.noop, + logger: logger } ); - cliInstance.init(); - - assert.isTrue(fs.readFile.calledThrice, 'fs.read should have been called 3 times'); - assert.isTrue(fs.readFile.calledWith('foo.js'), 'foo.js should have been read'); - assert.isTrue(fs.readFile.calledWith('bar.html'), 'bar.html should have been read'); - assert.isTrue(fs.readFile.calledWith('baz.css'), 'baz.css should have been read'); - + return cliInstance.init().then( + function() { + assert.isTrue(fs.readFile.callCount >= 3, 'fs.readFile should have been called 3 times, it was instead called ' + fs.readFile.callCount + ' times'); + assert.isTrue(fs.readFile.calledWith('foo.js'), 'foo.js should have been read'); + assert.isTrue(fs.readFile.calledWith('bar.html'), 'bar.html should have been read'); + assert.isTrue(fs.readFile.calledWith('baz.css'), 'baz.css should have been read'); + } + ); } ); it( 'should write files correctly', function() { - sandbox.stub(fs, 'readFile', invalidContentStub); - sandbox.stub(fs, 'writeFile', validContentStub); + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); + sandbox.stub(fs, 'writeFile').callsArgWith(2, null); + + var log = sandbox.spy(); var cliInstance = new cli.CLI( { @@ -79,34 +101,39 @@ describe( flags: { inlineEdit: true }, - log: sinon.log, + log: log, logger: new Logger.constructor() } ); - cliInstance.init(); + sandbox.spy(cliInstance, 'logResults'); - assert.isTrue(fs.writeFile.calledThrice, 'fs.write should have been called 3 times'); - assert.isTrue(fs.writeFile.calledWith('foo.js'), 'foo.js should have been written to'); - assert.isTrue(fs.writeFile.calledWith('bar.html'), 'bar.html should have been written to'); - assert.isTrue(fs.writeFile.calledWith('baz.css'), 'baz.css should have been written to'); + return cliInstance.init().then( + function() { + assert.isTrue(fs.writeFile.calledThrice, 'fs.writeFile should have been called 3 times, it was instead called ' + fs.writeFile.callCount + ' times'); + assert.isTrue(fs.writeFile.calledWith('foo.js'), 'foo.js should have been written to'); + assert.isTrue(fs.writeFile.calledWith('bar.html'), 'bar.html should have been written to'); + assert.isTrue(fs.writeFile.calledWith('baz.css'), 'baz.css should have been written to'); - fs.writeFile.args.forEach( - function(item, index) { - var path = item[0]; - var expectedContents = MAP_CONTENT[path][1]; + fs.writeFile.args.forEach( + function(item, index) { + var path = item[0]; + var expectedContents = MAP_CONTENT[path][1]; - assert.equal(expectedContents, item[1], 'The contents passed to writeFile for ' + path + ' aren\'t what was expected'); + assert.equal(expectedContents, item[1], 'The contents passed to writeFile for ' + path + ' aren\'t what was expected'); + } + ); + + assert.equal(log.callCount, 6, '.log should have been called 6 times, it was instead called ' + log.callCount + ' times'); } ); - } ); it( 'should handle file write errors', function() { - sandbox.stub(fs, 'readFile', invalidContentStub); + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); sandbox.stub(fs, 'writeFile').callsArgWith(2, new Error('Something went wrong')); sandbox.stub(File, 'handleFileWriteError'); @@ -117,16 +144,17 @@ describe( flags: { inlineEdit: true }, - log: sinon.log, - logger: new Logger.constructor(), - write: fs.writeFile + log: _.noop, + logger: new Logger.constructor() } ); - cliInstance.init(); - - assert.isTrue(fs.writeFile.calledOnce, 'fs.write should have been called 3 times'); - assert.isTrue(File.handleFileWriteError.calledOnce, 'File.handleFileWriteError should have been called once'); + return cliInstance.init().then( + function() { + assert.isTrue(fs.writeFile.calledOnce, 'fs.writeFile should have been called once, it was instead called ' + fs.writeFile.callCount + ' times'); + assert.isTrue(File.handleFileWriteError.calledOnce, 'File.handleFileWriteError should have been called once, it was instead called ' + File.handleFileWriteError.callCount + ' times'); + } + ); } ); @@ -140,21 +168,23 @@ describe( var cliInstance = new cli.CLI( { args: ['foo.NOOP'], - log: sinon.log, + log: _.noop, logger: new Logger.constructor() } ); cliInstance.processFileData = processFileData; - cliInstance.init(); - - assert.isFalse(processFileData.called, 'processFileData should not have been called for a non-recognized file'); + return cliInstance.init().then( + function() { + assert.isFalse(processFileData.called, 'processFileData should not have been called for a non-recognized file, it was instead called ' + processFileData.callCount + ' times'); + } + ); } ); it( - 'should handle metadata checking', + 'should check metadata', function() { sandbox.stub(fs, 'readFile').callsArgWith(2, null, ''); sandbox.stub(fs, 'existsSync').returns(true); @@ -165,7 +195,7 @@ describe( flags: { checkMetadata: true }, - log: sinon.log, + log: _.noop, logger: new Logger.constructor() } ); @@ -176,37 +206,53 @@ describe( var metaChecker = require(metaCheckerPath); - var checkMeta = sandbox.stub(metaChecker, 'check').yieldsTo('done'); + var checkMeta = sandbox.stub(metaChecker, 'check'); - cliInstance.init(); + return cliInstance.init().then( + function() { + assert.isTrue(checkMeta.called, 'metaChecker.check should have been called, it was instead called ' + checkMeta.callCount + ' times'); + } + ); + } + ); - assert.isTrue(checkMeta.called, 'metaChecker.check should have been called'); + it( + 'should not check metadata', + function() { + sandbox.stub(fs, 'readFile').callsArgWith(2, null, ''); + sandbox.stub(fs, 'existsSync').returns(true); - cliInstance = new cli.CLI( + var cliInstance = new cli.CLI( { args: ['foo.js'], flags: { checkMetadata: true }, - log: sinon.log, + log: _.noop, logger: new Logger.constructor() } ); + var metaCheckerPath = path.join(__dirname, 'fixture', 'meta.js'); + cliInstance._metaCheckerPath = metaCheckerPath; - checkMeta.reset(); + var metaChecker = require(metaCheckerPath); - cliInstance.init(); + var checkMeta = sandbox.stub(metaChecker, 'check'); - assert.isTrue(checkMeta.notCalled, 'metaChecker.check should not have been called'); + return cliInstance.init().then( + function() { + assert.isTrue(checkMeta.notCalled, 'metaChecker.check should not have been called, it was instead called ' + metaChecker.check.callCount + ' times'); + } + ); } ); it( 'should log results properly', function() { - sandbox.stub(fs, 'readFile', validContentStub); + sandbox.stub(fs, 'readFile').callsFake(validContentStub); var log = sandbox.spy(); @@ -218,15 +264,17 @@ describe( } ); - cliInstance.init(); - - assert.isTrue(log.calledOnce, 'log should have been called only once'); + return cliInstance.init().then( + function() { + assert.isTrue(log.calledOnce, 'log should have been called only once, it was instead called ' + log.callCount + ' times'); - log.reset(); + log.reset(); - cliInstance.logResults(null, 'foo.js'); + cliInstance.logResults(null, 'foo.js'); - assert.isTrue(log.notCalled, 'log should not have been called when logResults gets no input'); + assert.isTrue(log.notCalled, 'log should not have been called when logResults gets no input, it was instead called ' + log.callCount + ' times'); + } + ); } ); @@ -243,6 +291,7 @@ describe( { args: ['foo.js'], flags: { + config: false, verbose: true }, log: log, @@ -250,18 +299,18 @@ describe( } ); - cliInstance.init(); - - assert.isTrue(log.calledTwice, 'log should have been called twice'); + return cliInstance.init().then( + function() { + assert.isTrue(log.calledTwice, 'log should have been called twice, it was instead called ' + log.callCount + ' times'); + } + ); } ); it( 'should log filenames properly', function() { - sandbox.stub( - fs, - 'readFile', + sandbox.stub(fs, 'readFile').callsFake( function(filePath, encoding, callback) { callback(null, MAP_CONTENT[path.basename(filePath)][0]); } @@ -282,12 +331,27 @@ describe( } ); - cliInstance.init(); + return cliInstance.init().then( + function() { + assert.isTrue(log.calledThrice, 'log should have been called 3 times, it was instead called ' + log.callCount + ' times'); + assert.equal(args.join(), log.args.join()); + } + ); + } + ); + + it( + 'should log relative filenames properly', + function() { + sandbox.stub(fs, 'readFile').callsFake( + function(filePath, encoding, callback) { + callback(null, MAP_CONTENT[path.basename(filePath)][0]); + } + ); - assert.isTrue(log.calledThrice, 'log should have been called 3 times'); - assert.equal(args.join(), log.args.join()); + var log = sandbox.spy(); - log.reset(); + var args = ['foo.js', 'bar.html', 'baz.css']; var pathArgs = args.map( function(item, index) { @@ -301,7 +365,7 @@ describe( } ); - cliInstance = new cli.CLI( + var cliInstance = new cli.CLI( { args: pathArgs, cwd: path.join('home', 'liferay', 'scripts', 'tests'), @@ -314,10 +378,12 @@ describe( } ); - cliInstance.init(); - - assert.isTrue(log.calledThrice, 'log should have been called 3 times'); - assert.equal(relativeArgs.join(), log.args.join()); + return cliInstance.init().then( + function() { + assert.isTrue(log.calledThrice, 'log should have been called 3 times, it was instead called ' + log.callCount + ' times'); + assert.equal(relativeArgs.join(), log.args.join()); + } + ); } ); @@ -338,10 +404,41 @@ describe( } ); - cliInstance.init(); + return cliInstance.init().then( + function() { + assert.isTrue(log.calledThrice, 'log should have been called 3 times, it was instead called ' + log.callCount + ' times'); + assert.isTrue(File.handleFileReadError.calledOnce, 'File.handleFileReadError should have been called, it was instead called ' + File.handleFileReadError.callCount + ' times'); + } + ); + } + ); + + it( + 'should not write missing files', + function() { + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); + sandbox.stub(fs, 'writeFile').callsArgWith(2, null); + + sandbox.stub(File, 'handleFileReadError').returns('Missing file'); + + var log = sandbox.spy(); + + var cliInstance = new cli.CLI( + { + args: ['foo.js', 'bar.html', 'not_a_file.css'], + flags: { + inlineEdit: true + }, + log: log, + logger: new Logger.constructor() + } + ); - assert.isTrue(log.calledThrice, 'log should have been called 3 times'); - assert.isTrue(File.handleFileReadError.calledOnce, 'File.handleFileReadError should have been called'); + return cliInstance.init().then( + function() { + assert.isTrue(fs.writeFile.calledTwice, 'writeFile should have been called only 2 times, it was instead called ' + fs.writeFile.callCount + ' times'); + } + ); } ); @@ -367,10 +464,12 @@ describe( } ); - cliInstance.init(); - - assert.isTrue(log.notCalled, 'log should not have been called'); - assert.isTrue(File.handleFileReadError.returned(''), 'File.handleFileReadError should have returned nothing'); + return cliInstance.init().then( + function() { + assert.isTrue(log.notCalled, 'log should not have been called, it was instead called ' + log.callCount + ' times'); + assert.isTrue(File.handleFileReadError.returned(''), 'File.handleFileReadError should have returned nothing'); + } + ); } ); @@ -389,7 +488,7 @@ describe( cliInstance.logGeneralError(new Error('Something general happened....')); - assert.isTrue(log.calledOnce, 'log should have been called once'); + assert.isTrue(log.calledOnce, 'log should have been called once, it was instead called ' + log.callCount + ' times'); assert.startsWith(log.args[0][0], 'Something went wrong'); } ); @@ -397,13 +496,11 @@ describe( it( 'should open files properly', function() { - sandbox.stub(fs, 'readFile', invalidContentStub); + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); var cliModule = require('cli'); - sandbox.stub( - cliModule, - 'exec', + sandbox.stub(cliModule, 'exec').callsFake( function(command, callback) { if (callback) { callback(['sublime']); @@ -424,15 +521,33 @@ describe( } ); - cliInstance.init(); + return cliInstance.init().then( + function() { + assert.isTrue(log.calledOnce, 'log should have been called only once, it was instead called ' + log.callCount + ' times'); + assert.isTrue(cliModule.exec.calledTwice, 'cliModule.exec should have been called 2 times, it was instead called ' + cliModule.exec.callCount + ' times'); + } + ); + } + ); + + it( + 'should not log without arguments', + function() { + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); + + var cliModule = require('cli'); - assert.isTrue(log.calledOnce, 'log should have been called only once'); - assert.isTrue(cliModule.exec.calledTwice, 'log should have been called 2 times'); + sandbox.stub(cliModule, 'exec').callsFake( + function(command, callback) { + if (callback) { + callback(['sublime']); + } + } + ); - log.reset(); - cliModule.exec.reset(); + var log = sandbox.spy(); - cliInstance = new cli.CLI( + var cliInstance = new cli.CLI( { args: [], flags: { @@ -445,21 +560,53 @@ describe( cliInstance.init(); - assert.isTrue(log.notCalled, 'log should not have been called'); - assert.isTrue(cliModule.exec.notCalled, 'log should not have been called'); + assert.isTrue(log.notCalled, 'log should not have been called, it was instead called ' + log.callCount + ' times'); + assert.isTrue(cliModule.exec.notCalled, 'cliModule.exec should not have been called, it was instead called ' + cliModule.exec.callCount + ' times'); + } + ); + + it( + 'should not log files without errors when quiet is set', + function() { + sandbox.stub(fs, 'readFile').callsFake(validContentStub); + + var log = sandbox.spy(); + + var logger = new Logger.constructor(); + + var filterFileErrors = sandbox.spy(logger, 'filterFileErrors'); + + var cliInstance = new cli.CLI( + { + args: ['bar.html'], + flags: { + // config: false, + quiet: true, + }, + log: log, + logger: logger + } + ); + + var spy = sandbox.spy(cliInstance, '_loadConfigs'); + + return cliInstance.init().then( + function() { + assert.isTrue(log.notCalled, 'log should not have been called'); + assert.isTrue(filterFileErrors.called, 'filterFileErrors should have been called'); + } + ); } ); it( 'should call junit generate', function() { - sandbox.stub(fs, 'readFile', invalidContentStub); + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); var junitReporter = require('../lib/junit'); - var junit = sandbox.spy(junitReporter); - - sandbox.stub(junit.prototype, 'generate'); + sandbox.stub(junitReporter.prototype, 'generate').returns(Promise.resolve()); var cliInstance = new cli.CLI( { @@ -467,16 +614,211 @@ describe( flags: { junit: true }, - junit: junit, - log: sinon.log, + junit: junitReporter, + log: _.noop, logger: new Logger.constructor() } ); - cliInstance.init(); + return cliInstance.init().then( + function() { + assert.isTrue(junitReporter.prototype.generate.called, 'junit.prototype.generate should have been called, it was instead called ' + junitReporter.prototype.generate.callCount + ' times'); + } + ); + } + ); + + it( + 'should handle custom config', + function() { + var filePath = path.join(__dirname, 'fixture/config/flags/foo.js'); + + var log = sandbox.spy(); + + var cliInstance = new cli.CLI( + { + args: [filePath], + flags: { + verbose: true + }, + log: log, + logger: new Logger.constructor(), + read: function() { + return new Promise( + function(resolve, reject) { + resolve(''); + } + ); + } + } + ); + + return cliInstance.init().then( + function() { + var configs = cliInstance._configs; + var config = configs[filePath]; + + assert.isObject(configs); + + assert.notDeepEqual(getRule(0, false, _.get(config, 'js.lint', {})), getRule(0)); + + assert.startsWith(log.args[0][0], 'Using local config from '); + } + ); + } + ); + + it( + 'should handle custom config misc', + function() { + sandbox.stub(fs, 'readFile').callsArgWith(2, null, ''); + + var log = sandbox.spy(); + + var cliInstance = new cli.CLI( + { + args: [path.join(__dirname, 'fixture/config/filenames/foo.js')], + flags: { + filenames: true + }, + log: log, + logger: new Logger.constructor() + } + ); + + return cliInstance.init().then( + function() { + assert.isNotTrue(cliInstance.flags.quiet); + assert.isUndefined(log.args[0]); + } + ); + } + ); + + it( + 'should handle invalid config', + function() { + sandbox.stub(fs, 'readFile').callsArgWith(2, null, ''); + + var log = sandbox.spy(); + + var filePath = path.join(__dirname, 'fixture/config/bad_config/foo.js'); + + var cliInstance = new cli.CLI( + { + args: [filePath], + log: log, + logger: new Logger.constructor(), + read: function() { + return Promise.resolve(''); + } + } + ); + + return cliInstance.init().then( + function() { + assert.lengthOf(Object.keys(cliInstance._configs[filePath]), 0); + } + ); + } + ); + + it( + 'should handle config logging', + function() { + var read = function(file, options) { + var retVal; + + if (file === 'foo.js') { + retVal = Promise.resolve(''); + } + else { + retVal = fs.readFileAsync(file, options); + } + + return retVal; + }; + + var files = ['filenames/foo.js', 'flags/bar.js']; + + var cwd = path.join(__dirname, 'fixture/config'); - assert.isTrue(junit.calledWithNew(), 'junit should have been instantiated'); - assert.isTrue(junit.prototype.generate.called, 'junit.prototype.generate should have been called'); + var configs = [ + { + config: { + args: files.slice(0, 1) + }, + msg: 'Using local config from ' + path.join(cwd, 'filenames/csf.config.js') + '\n' + }, + { + config: { + args: files + }, + msg: 'Using local config from 2 files. Pass -v to see all locations\n' + }, + { + config: { + args: files, + flags: { + verbose: true + } + }, + msg: 'Using local config from: \n' + files.map(file => path.join(cwd, path.dirname(file), 'csf.config.js')).join('\n') + '\n' + } + ]; + + return Promise.map( + configs, + function(item, index) { + var log = sandbox.spy(); + + var cfg = _.defaults( + item.config, + { + cwd: cwd, + log: log, + logger: new Logger.constructor(), + read: read + } + ); + + var cliInstance = new cli.CLI(cfg); + + return cliInstance.init().then( + function() { + assert.equal(log.args[0][0], item.msg); + } + ); + } + ); + } + ); + + it( + 'should not load a config when config is false', + function() { + sandbox.stub(fs, 'readFile').callsFake(invalidContentStub); + + var log = sandbox.spy(); + + var cliInstance = new cli.CLI( + { + args: ['foo.js'], + cwd: path.join(__dirname, 'fixture/config/bad_config'), + flags: { + verbose: true + }, + log: log, + logger: new Logger.constructor() + } + ); + + return cliInstance.init().then( + function() { + assert.isTrue(cliInstance.flags.verbose); + assert.notStartsWith(log.args[0][0], 'Could not resolve any local config'); + } + ); } ); } diff --git a/test/config.js b/test/config.js new file mode 100644 index 0000000..e454af1 --- /dev/null +++ b/test/config.js @@ -0,0 +1,64 @@ +var chai = require('chai'); + +var Config = require('../lib/config'); + +chai.use(require('chai-string')); + +var assert = chai.assert; + +describe( + 'Config', + function() { + 'use strict'; + + it( + 'should be a function', + function() { + assert.isTrue(typeof new Config() === 'function'); + } + ); + + it( + 'should exclude _paths property when logging', + function() { + var config = new Config(); + + assert.isTrue(JSON.stringify(config) === '{}', 'Should be an empty object {}'); + assert.isTrue(typeof config._paths === 'object', '_paths should still exists in config'); + } + ); + + it( + 'should return property by key', + function() { + var config = new Config( + { + foo: 1, + bar: function() { + return 'hello world'; + } + } + ); + + assert.isTrue(config('foo') === 1); + assert.isTrue(config('bar') === 'hello world'); + } + ); + + it( + 'should return entire config when called without a key', + function() { + var config = new Config( + { + foo: 1, + bar: function() { + return 'hello world'; + } + } + ); + + assert.isTrue(config() === config); + } + ); + } +); \ No newline at end of file diff --git a/test/css.js b/test/css.js index 9b02151..8ab3e52 100644 --- a/test/css.js +++ b/test/css.js @@ -2,6 +2,13 @@ var _ = require('lodash'); var chai = require('chai'); var fs = require('fs'); var path = require('path'); +var sinon = require('sinon'); + +var Promise = require('bluebird'); + +var Promise = require('bluebird'); + +Promise.promisifyAll(fs); var Formatter = require('../lib/formatter'); var Logger = require('../lib/logger'); @@ -21,231 +28,202 @@ describe( var getFilePath = path.join.bind(path, cssTestsPath); - var testFile = function(filePath, cb, done) { + var testFile = function(filePath) { var cssFormatter = new Formatter.CSS(filePath, cssLogger); - fs.readFile( - filePath, - 'utf-8', - function(err, contents) { - if (!err) { - var newContents = cssFormatter.format(contents); + return fs.readFileAsync(filePath,'utf-8').then( + function(contents) { + var newContents = cssFormatter.format(contents); - cb(cssLogger.fileErrors[filePath], contents, newContents); - } - - if (done) { - done(); - } + return Promise.all([contents, newContents]); + } + ) + .then( + function(arr) { + return [cssLogger.fileErrors[filePath]].concat(arr); } ); }; it( 'should detect lower case hex codes', - function(done) { - testFile( - getFilePath('hex_lower_case.css'), + function() { + return testFile(getFilePath('hex_lower_case.css')).spread( function(errors) { assert.equal(errors.length, 1); - assert.startsWith(errors[0].msg, 'Hex code should be all uppercase'); - }, - done + assert.startsWith(errors[0].msg, 'Expected "#fff" to be "#FFF"'); + } ); } ); it( 'should detect redundant hex codes', - function(done) { - testFile( - getFilePath('hex_redundant.css'), + function() { + return testFile(getFilePath('hex_redundant.css')).spread( function(errors) { assert.equal(errors.length, 1); - assert.startsWith(errors[0].msg, 'Hex code can be reduced to'); - }, - done + assert.startsWith(errors[0].msg, 'Expected "#FFFFFF" to be "#FFF"'); + } ); } ); it( 'should detect invalid border resets', - function(done) { - testFile( - getFilePath('invalid_border_reset.css'), + function() { + return testFile(getFilePath('invalid_border_reset.css')).spread( function(errors, contents, newContents) { assert.isAbove(errors.length, 0); - var borderErrors = errors.filter( - function(item, index) { - return item.line <= 11 && item.msg.indexOf('You should use "border-') === 0; - } - ); - - assert.equal(borderErrors.length, errors.length); - assert.notEqual(contents, newContents); - }, - done + } ); } ); it( 'should detect invalid formatting in property rules', - function(done) { - testFile( - getFilePath('invalid_format.css'), + function() { + return testFile(getFilePath('invalid_format.css')).spread( function(errors, contents, newContents) { assert.isAbove(errors.length, 0); - var formatErrors = errors.filter( - function(item, index) { - return item.line <= 3 && item.msg.indexOf('There should be one space after ":"') === 0; - } - ); - - assert.equal(formatErrors.length, errors.length); - }, - done + assert.notEqual(contents, newContents); + } ); } ); it( 'should detect missing integers', - function(done) { - testFile( - getFilePath('missing_integer.css'), + function() { + return testFile(getFilePath('missing_integer.css')).spread( function(errors, contents, newContents) { - assert.equal(errors.length, 1); + assert.isAbove(errors.length, 0); - assert.startsWith(errors[0].msg, 'Missing integer'); - }, - done + assert.notEqual(contents, newContents); + } ); } ); it( 'should detect missing spaces in list values', - function(done) { - testFile( - getFilePath('missing_list_values_space.css'), + function() { + return testFile(getFilePath('missing_list_values_space.css')).spread( function(errors, contents, newContents) { - assert.equal(errors.length, 1); + assert.isAbove(errors.length, 0); - assert.startsWith(errors[0].msg, 'Needs space between comma-separated values'); - }, - done + assert.notEqual(contents, newContents); + } ); } ); it( 'should detect missing newlines', - function(done) { - testFile( - getFilePath('missing_newlines.css'), + function() { + return testFile(getFilePath('missing_newlines.css')).spread( function(errors, contents, newContents) { assert.isAbove(errors.length, 0); - var formatErrors = errors.filter( - function(item, index) { - return item.msg.indexOf('There should be a newline between') === 0; - } - ); - - assert.equal(formatErrors.length, errors.length); - }, - done + assert.notEqual(contents, newContents); + } ); } ); it( 'should detect missing spaces in selectors', - function(done) { - testFile( - getFilePath('missing_selector_space.css'), + function() { + return testFile(getFilePath('missing_selector_space.css')).spread( function(errors, contents, newContents) { - assert.equal(errors.length, 1); + assert.isAbove(errors.length, 0); - assert.startsWith(errors[0].msg, 'Missing space between selector and bracket'); - }, - done + assert.startsWith(errors[0].msg, 'Expected single space before "{"'); + } ); } ); it( 'should detect needless quotes', - function(done) { - testFile( - getFilePath('needless_quotes.css'), + function() { + return testFile(getFilePath('needless_quotes.css')).spread( function(errors, contents, newContents) { assert.isAbove(errors.length, 0); - var formatErrors = errors.filter( - function(item, index) { - return item.msg.indexOf('Needless quotes') === 0; - } - ); - - assert.equal(formatErrors.length, errors.length); - }, - done + assert.notEqual(contents, newContents); + } ); } ); it( 'should detect needless units', - function(done) { - testFile( - getFilePath('needless_unit.css'), + function() { + return testFile(getFilePath('needless_unit.css')).spread( function(errors, contents, newContents) { - assert.equal(errors.length, 1); + assert.isAbove(errors.length, 0); - assert.startsWith(errors[0].msg, 'Needless unit'); - }, - done + assert.notEqual(contents, newContents); + } ); } ); it( 'should detect property sort', - function(done) { - testFile( - getFilePath('property_sort.css'), + function() { + return testFile(getFilePath('property_sort.css')).spread( function(errors, contents, newContents) { - assert.equal(errors.length, 1); - - assert.startsWith(errors[0].msg, 'Sort'); - }, - done + assert.startsWith(errors[0].msg, 'Expected background to come before padding'); + } ); } ); it( 'should detect trailing commas in selectors', - function(done) { - testFile( - getFilePath('trailing_comma.css'), + function() { + return testFile(getFilePath('trailing_comma.css')).spread( function(errors, contents, newContents) { - assert.equal(errors.length, 1); + assert.isAbove(errors.length, 0); assert.startsWith(errors[0].msg, 'Trailing comma in selector'); - }, - done + + assert.notEqual(contents, newContents); + } ); } ); + + it( + 'should use a custom lint log filter', + function(done) { + var testFilePath = path.join(__dirname, 'fixture', 'css', 'at_rule_empty_line.css'); + + var source = fs.readFileSync(testFilePath, 'utf-8'); + + var cssLoggerFilter = new Logger.constructor(); + var cssFormatterFilter = new Formatter.CSS(testFilePath, cssLoggerFilter); + + var lintLogFilter = sinon.stub().returnsArg(0); + + cssFormatterFilter.lintLogFilter = lintLogFilter; + + var result = cssFormatterFilter.format(source); + + Promise.resolve(result).then( + function(result) { + assert.isTrue(lintLogFilter.called); + } + ).done(done); + } + ); } ); @@ -259,7 +237,7 @@ describe( line: lineNum }; - return _.result(_.findWhere(errors, whereLine), 'msg') || ''; + return _.result(_.find(errors, whereLine), 'msg') || ''; }; it( @@ -284,4 +262,157 @@ describe( } ); } +); + +describe( + 'Formatter.CSS Lint', + function() { + 'use strict'; + + var sandbox; + + beforeEach( + function() { + sandbox = sinon.sandbox.create(); + } + ); + + afterEach( + function() { + sandbox.restore(); + } + ); + + var lintConfig = require('../lib/config/stylelint'); + + var testFilePath = path.join(__dirname, 'fixture', 'css', 'at_rule_empty_line.css'); + + var cssLogger = new Logger.constructor(); + var cssFormatter = new Formatter.CSS(testFilePath, cssLogger); + var source = fs.readFileSync(testFilePath, 'utf-8'); + + var cssLint = function(contents, config, file) { + return Promise.resolve( + { + results: [ + { + warnings: [ + { + line: 1, + message: '', + column: 0, + ruleId: '' + } + ] + } + ] + } + ); + }; + + var lint = require('../lib/lint_css'); + + it( + 'should find at least one lint error', + function(done) { + var response = cssFormatter.format(source, true); + + Promise.resolve(response).then( + function(results) { + var cssErrors = cssLogger.getErrors(testFilePath); + + var foundLintErrors = _.reduce( + cssErrors, + function(res, item, index) { + if (item.type) { + res[item.type] = true; + } + + return res; + }, + {} + ); + + var hasLintError = _.some( + lintConfig.rules, + function(item, index) { + var val = _.isArray(item) ? item[0] : item; + + return val !== false && foundLintErrors[index]; + } + ); + + assert.isTrue(hasLintError); + } + ).done(done); + } + ); + + it( + 'should be able to disable linting', + function(done) { + var testFilePath = path.join(__dirname, 'fixture', 'css', 'at_rule_empty_line.css'); + + var source = fs.readFileSync(testFilePath, 'utf-8'); + + var cssLoggerFilter = new Logger.constructor(); + var cssFormatterFilter = new Formatter.CSS(testFilePath, cssLoggerFilter); + + var result = cssFormatterFilter.format(source, false); + + Promise.resolve(result).then( + function(result) { + var errors = cssLoggerFilter.getErrors()[testFilePath] || []; + + var hasRuleId = errors.some( + function(item, index) { + return !!item.ruleId; + } + ); + + assert.isFalse(hasRuleId); + assert.equal(errors.length, 0); + } + ).done(done); + } + ); + + it( + 'should use default configuration properties', + function() { + var stylelint = lint.stylelint; + + sandbox.stub(stylelint, 'lint').callsFake(cssLint); + + lint.runLinter(source, testFilePath, {}); + + var args = stylelint.lint.args[0]; + + assert.equal(args[0].config.rules['at-rule-no-vendor-prefix'], true); + } + ); + + it( + 'should merge configuration properties', + function() { + + var stylelint = lint.stylelint; + + sandbox.stub(stylelint, 'lint').callsFake(cssLint); + + cssFormatter.format( + source, + { + rules: { + 'at-rule-no-vendor-prefix': false + } + } + ); + + var args = stylelint.lint.args[0]; + + assert.equal(args[0].config.rules['at-rule-no-vendor-prefix'], false); + } + ); + } ); \ No newline at end of file diff --git a/test/deprecation.js b/test/deprecation.js new file mode 100644 index 0000000..62cde33 --- /dev/null +++ b/test/deprecation.js @@ -0,0 +1,72 @@ +var path = require('path'); +var fs = require('fs'); +var chai = require('chai'); +var _ = require('lodash'); + +var deprecationCheck = require('../lib/deprecation'); + +chai.use(require('chai-string')); + +var assert = chai.assert; + +var INTERVAL = deprecationCheck.INTERVAL; + +var configStore = { + get(key) { + return this[key]; + }, + + set(key, value) { + this[key] = value; + } +}; + +var expectedMessage = `----------------------------------------------------------- + Using the check_sf form of this module is deprecated. + Please use the csf command instead. It's easier to type too!`; + +describe( + 'deprecation checking', + function () { + 'use strict'; + + it( + 'should return a deprecation message', + function() { + var config = Object.create(configStore); + + config.set('lastDeprecationCheck', Date.now() - INTERVAL); + + var message = deprecationCheck( + { + config, + scriptName: 'check_sf' + } + ); + + assert.isString(message); + assert.isAbove(message.length, 0); + assert.equal(message, expectedMessage); + } + ); + + it( + 'should not return a deprecation message', + function() { + var config = Object.create(configStore); + + config.set('lastDeprecationCheck', Date.now()); + + var message = deprecationCheck( + { + config, + scriptName: 'check_sf' + } + ); + + assert.isString(message); + assert.equal(message.length, 0); + } + ); + } +); \ No newline at end of file diff --git a/test/engine_rules/css.js b/test/engine_rules/css.js index 3a162f0..740bb67 100644 --- a/test/engine_rules/css.js +++ b/test/engine_rules/css.js @@ -21,7 +21,7 @@ describe( var input = '#fff'; var output = '#FFF'; - var expectedWarning = 'Hex code should be all uppercase'; + // var expectedWarning = 'Hex code should be all uppercase'; var context = { content: input, @@ -32,7 +32,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -55,7 +55,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -77,7 +77,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -99,7 +99,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -146,7 +146,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -174,7 +174,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -218,7 +218,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -253,7 +253,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -297,7 +297,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -319,7 +319,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); + // assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -442,7 +442,6 @@ describe( var lineNum = 1; assert.isArray(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); @@ -474,7 +473,6 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), expectedWarning); assert.equal(output, re.replaceItem(result, rule, context)); } ); diff --git a/test/engine_rules/js.js b/test/engine_rules/js.js index ea75796..ade7e02 100644 --- a/test/engine_rules/js.js +++ b/test/engine_rules/js.js @@ -155,7 +155,7 @@ describe( var lineNum = 1; assert.isTrue(result); - assert.startsWith(re.getMessage(result, rule, context), 'Debugging statement'); + assert.isUndefined(re.getMessage(result, rule, context)); assert.equal(content, re.replaceItem(result, rule, context)); } ); diff --git a/test/fixture/config/bad_config/package.json/.gitkeep b/test/fixture/config/bad_config/package.json/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/fixture/config/filenames/csf.config.js b/test/fixture/config/filenames/csf.config.js new file mode 100644 index 0000000..e180b24 --- /dev/null +++ b/test/fixture/config/filenames/csf.config.js @@ -0,0 +1,2 @@ +module.exports = { +}; \ No newline at end of file diff --git a/test/fixture/config/flags/csf.config.js b/test/fixture/config/flags/csf.config.js new file mode 100644 index 0000000..81636bb --- /dev/null +++ b/test/fixture/config/flags/csf.config.js @@ -0,0 +1,7 @@ +var getRule = require('../../../test_utils').getRule; + +module.exports = { + js: { + lint: getRule(0, true) + } +}; \ No newline at end of file diff --git a/test/fixture/config/path_configs/csf.config.js b/test/fixture/config/path_configs/csf.config.js new file mode 100644 index 0000000..17e24b2 --- /dev/null +++ b/test/fixture/config/path_configs/csf.config.js @@ -0,0 +1,17 @@ +module.exports = { + flags: { + quiet: true + }, + + 'path:**/foo.css': { + flags: { + quiet: false + } + }, + + 'path:**/foo.js': { + flags: { + quiet: true + } + } +}; \ No newline at end of file diff --git a/test/fixture/css/at_rule_empty_line.css b/test/fixture/css/at_rule_empty_line.css new file mode 100644 index 0000000..48060b3 --- /dev/null +++ b/test/fixture/css/at_rule_empty_line.css @@ -0,0 +1,5 @@ +.at-rules { + background: red; + @include fakemixin(); + color: white; +} \ No newline at end of file diff --git a/test/fixture/css/needless_unit.css b/test/fixture/css/needless_unit.css index 1ac4ccb..2d6b292 100644 --- a/test/fixture/css/needless_unit.css +++ b/test/fixture/css/needless_unit.css @@ -1,5 +1,39 @@ +@charset "UTF-8"; + .needless-unit { padding: 0px; + padding: 0; + @include test; + +} + +.needless-unit-2 { + @include foo(1, 3); + @include foo(1, 3); + @include test(2, 3); + + @include ml(3, 3) { + content: ''; + }; + @include xs { + content: ''; + }; + + @media print { + .foo { + border: 1px solid black; + } + } + + @keyframes foo { + 0% { + border: 1px solid red; + } + to { + border: 1px solid green; + } + } + padding: 0; } \ No newline at end of file diff --git a/test/fixture/css/trailing_comma.css b/test/fixture/css/trailing_comma.css index 8efb674..033937d 100644 --- a/test/fixture/css/trailing_comma.css +++ b/test/fixture/css/trailing_comma.css @@ -1,3 +1,8 @@ +.trailing-comma5 { + padding: 1px; + color: #FFF; +} + .trailing-comma1, { color: #FFF; } diff --git a/test/fixture/eslint-plugin-custom-lint.js b/test/fixture/eslint-plugin-custom-lint.js new file mode 100644 index 0000000..9bceadb --- /dev/null +++ b/test/fixture/eslint-plugin-custom-lint.js @@ -0,0 +1,10 @@ +module.exports = { + rules: { + foo: function(context) { + return { + 'Program:exit': function() { + } + }; + } + } +}; \ No newline at end of file diff --git a/test/fixture/test.jsp b/test/fixture/test.jsp index 52c62ac..aac94b5 100644 --- a/test/fixture/test.jsp +++ b/test/fixture/test.jsp @@ -71,5 +71,20 @@
"> + + + + + window.foo = 'foo'; + + + var SOME_OBJ = { + '${foo}': 'bar', + '${bar}': 'baz' + }; + \ No newline at end of file diff --git a/test/formatter.js b/test/formatter.js new file mode 100644 index 0000000..e241cc9 --- /dev/null +++ b/test/formatter.js @@ -0,0 +1,46 @@ +var chai = require('chai'); +var path = require('path'); + +var Config = require('../lib/config'); +var Formatter = require('../lib/formatter'); +var Logger = require('../lib/logger'); + +chai.use(require('chai-string')); + +var assert = chai.assert; + +describe( + 'Formatter', + function() { + 'use strict'; + + var logger = new Logger.constructor(); + + it( + 'should have a config object', + function() { + var formatter = Formatter.get('foo.css', logger, {}); + + assert.isTrue(typeof formatter._config === 'function'); + assert.isObject(formatter._config._paths); + } + ); + + it( + 'should get merged config by path', + function() { + var cwd = path.join(__dirname, 'fixture/config/path_configs'); + + return (new Config.Loader).load(cwd).then( + function(config) { + var formatter = Formatter.get('foo.css', logger, {quiet: true}); + + formatter._config = config; + + assert.isFalse(formatter.config('flags.quiet')); + } + ); + } + ); + } +); \ No newline at end of file diff --git a/test/html.js b/test/html.js index 60a9970..86197b2 100644 --- a/test/html.js +++ b/test/html.js @@ -2,6 +2,7 @@ var _ = require('lodash'); var chai = require('chai'); var fs = require('fs'); var path = require('path'); +var Promise = require('bluebird'); var Formatter = require('../lib/formatter'); var Logger = require('../lib/logger'); @@ -32,7 +33,7 @@ describe( line: lineNum }; - return _.result(_.findWhere(errors, whereLine), 'msg') || ''; + return _.result(_.find(errors, whereLine), 'msg') || ''; }; it( @@ -94,12 +95,20 @@ describe( it( 'should parse script blocks correctly', - function() { + function(done) { var scriptBlocks = htmlFormatter.parseJs(source); assert.isArray(scriptBlocks); - assert.equal(scriptBlocks.length, 4); - scriptBlocks.forEach(assert.isString); + + assert.equal(scriptBlocks.length, 6); + + Promise.all(scriptBlocks).then( + function(scriptBlocks) { + scriptBlocks.forEach(assert.isString); + + done(); + } + ); } ); @@ -119,7 +128,7 @@ describe( var scriptBlocks = htmlFormatter.extractJs(source); assert.isArray(scriptBlocks); - assert.equal(scriptBlocks.length, 4); + assert.equal(scriptBlocks.length, 6); scriptBlocks.forEach(assert.isObject); scriptBlocks = htmlFormatter.extractJs(''); @@ -140,12 +149,19 @@ describe( it( 'should parse style blocks correctly', - function() { + function(done) { var styleBlocks = htmlFormatter.parseCSS(source); assert.isArray(styleBlocks); - assert.equal(styleBlocks.length, 1); - styleBlocks.forEach(assert.isString); + assert.equal(styleBlocks.length, 2); + + Promise.all(styleBlocks).then( + function(styleBlocks) { + styleBlocks.forEach(assert.isString); + + done(); + } + ); } ); @@ -165,7 +181,7 @@ describe( var styleBlocks = htmlFormatter.extractCSS(source); assert.isArray(styleBlocks); - assert.equal(styleBlocks.length, 1); + assert.equal(styleBlocks.length, 2); styleBlocks.forEach(assert.isObject); styleBlocks = htmlFormatter.extractCSS(''); @@ -180,7 +196,7 @@ describe( function() { var msg = getErrorMsgByLine(64, htmlErrors); - assert.startsWith(msg, 'You should use "border-width: 0;": border: none;'); + assert.startsWith(msg, 'Expected indentation of 1 tab'); } ); @@ -454,6 +470,49 @@ describe( assert.equal(contents, '\nvoid 0;\n/* scriptlet block\nvoid 0; */\nvoid 0;\n'); } ); + + // it( + // 'should merge lint config properly', + // function() { + // var ESLINT_CONFIG = require('../lib/config/eslint'); + // var ESLINT_CONFIG_JSP = require('../lib/config/eslint_jsp'); + + // var rules = _.reduce( + // ESLINT_CONFIG.rules, + // function(prev, item, index) { + // var ruleVal = item; + + // if (_.isArray(ruleVal)) { + // ruleVal = ruleVal[0]; + // } + + // var jspRuleVal = ESLINT_CONFIG_JSP.rules[index]; + + // if (_.isArray(jspRuleVal)) { + // jspRuleVal = jspRuleVal[0]; + // } + + // if (ruleVal > 0 && jspRuleVal === 0) { + // prev.push(index); + // } + + // return prev; + // }, + // [] + // ); + + // var results = _.find( + // htmlErrors, + // function(item) { + // var type = item.type; + + // return rules.indexOf(type) > -1; + // } + // ); + + // console.log(results, rules); + // } + // ); } ); @@ -467,7 +526,7 @@ describe( line: lineNum }; - return _.result(_.findWhere(errors, whereLine), 'msg') || ''; + return _.result(_.find(errors, whereLine), 'msg') || ''; }; it( diff --git a/test/js.js b/test/js.js index d292d91..ec050cb 100644 --- a/test/js.js +++ b/test/js.js @@ -16,7 +16,7 @@ var getErrorMsgByLine = function(lineNum, errors) { line: lineNum }; - return _.result(_.findWhere(errors, whereLine), 'msg') || ''; + return _.result(_.find(errors, whereLine), 'msg') || ''; }; describe( @@ -76,13 +76,6 @@ describe( } ); - it( - 'should recognize debugging statements', - function() { - assert.startsWith(getErrorMsgByLine(21, jsErrors), 'Debugging statement:'); - } - ); - it( 'should recognize variable line spacing', function() { @@ -142,7 +135,7 @@ describe( var parseErrors = jsLoggerParse.getErrors(testFilePath); assert.equal(parseErrors.length, 1); - assert.equal(parseErrors[0].msg, 'Could not parse JavaScript: Unexpected token ;'); + assert.startsWith(parseErrors[0].msg, 'Could not parse JavaScript: Unexpected token '); var jsLoggerParseVerbose = new Logger.constructor(); var jsFormatterParseVerbose = new Formatter.JS(testFilePath, jsLoggerParseVerbose); @@ -243,7 +236,21 @@ describe( function() { 'use strict'; - var esLintConfig = require('../lib/eslint_config'); + var sandbox; + + beforeEach( + function() { + sandbox = sinon.sandbox.create(); + } + ); + + afterEach( + function() { + sandbox.restore(); + } + ); + + var lintConfig = require('../lib/config/eslint'); var testFilePath = path.join(__dirname, 'fixture', 'test.js'); @@ -251,13 +258,15 @@ describe( var jsFormatter = new Formatter.JS(testFilePath, jsLogger); var source = fs.readFileSync(testFilePath, 'utf-8'); - jsFormatter.format(source, true); - - var jsErrors = jsLogger.getErrors(testFilePath); + var lint = require('../lib/lint_js'); it( 'should find at least one lint error', function() { + jsFormatter.format(source, true); + + var jsErrors = jsLogger.getErrors(testFilePath); + var foundLintErrors = _.reduce( jsErrors, function(res, item, index) { @@ -271,7 +280,7 @@ describe( ); var hasLintError = _.some( - esLintConfig.rules, + lintConfig.rules, function(item, index) { var val = _.isArray(item) ? item[0] : item; @@ -282,5 +291,153 @@ describe( assert.isTrue(hasLintError); } ); + + it( + 'should use default configuration properties', + function() { + var eslint = lint.eslint; + + var verify = function(contents, config, file) { + return { + line: 1, + message: '', + column: 0, + ruleId: '' + } + }; + + sandbox.stub(eslint.linter, 'verify').callsFake(verify); + + lint.runLinter(source, testFilePath, {}); + + var args = eslint.linter.verify.args[0]; + + assert.isUndefined(args[1].plugins); + } + ); + + it( + 'should merge configuration properties', + function() { + var eslint = lint.eslint; + + var verify = function(contents, config, file) { + return { + line: 1, + message: '', + column: 0, + ruleId: '' + } + }; + + sandbox.stub(eslint.linter, 'verify').callsFake(verify); + + jsFormatter.format( + source, + { + parserOptions: { + ecmaVersion: 6 + } + } + ); + + var args = eslint.linter.verify.args[0]; + + assert.equal(args[1].parserOptions.ecmaVersion, 6); + assert.isArray(args[1].plugins); + } + ); + + it( + 'load a custom eslint plugin', + function() { + var eslint = lint.eslint; + + sandbox.spy(eslint.linter, 'verify'); + + lint.runLinter( + source, + testFilePath, + { + fileConfig: { + _paths: { + obj: { + filepath: path.join(__dirname, '../package.json') + } + } + }, + lintConfig: { + parserOptions: { + ecmaVersion: 7 + }, + plugins: ['dollar-sign'] + } + } + ); + + var linterRules = eslint.linter.getRules(); + + assert.isTrue(linterRules.has('dollar-sign/dollar-sign')); + } + ); + + it( + 'load a custom eslint plugin via path', + function() { + var eslint = lint.eslint; + + var linterRulesPrev = eslint.linter.getRules(); + + lint.runLinter( + source, + testFilePath, + { + fileConfig: { + _paths: { + obj: { + filepath: path.join(__dirname, '../package.json') + } + } + }, + lintConfig: { + parserOptions: { + ecmaVersion: 7 + }, + plugins: ['./test/fixture/eslint-plugin-custom-lint'] + } + } + ); + + var linterRules = eslint.linter.getRules(); + + assert.isTrue(linterRules.has('custom-lint/foo')); + } + ); + + it( + 'ignore non-existent rules', + function() { + var eslint = lint.eslint; + + var linterRulesPrev = eslint.linter.getRules(); + + lint.runLinter( + source, + testFilePath, + { + lintConfig: { + parserOptions: { + ecmaVersion: 7 + }, + plugins: ['non-existent-plugin', './other-non-existent-plugin'] + } + } + ); + + var linterRules = eslint.linter.getRules(); + + assert.equal(linterRulesPrev.size, linterRules.size); + } + ); } ); \ No newline at end of file diff --git a/test/junit.js b/test/junit.js index 5b47906..b197daf 100644 --- a/test/junit.js +++ b/test/junit.js @@ -45,9 +45,7 @@ describe( logger.log(1, 'Content is not valid', 'baz.css', 'error'); logger.log('N/A', 'This file was ignored. Pass the "force" flag if you wish to have it included.', 'bar.min.js', 'ignored'); - sandbox.stub( - fs, - 'readFile', + sandbox.stub(fs, 'readFile').callsFake( function(path, encoding, callback) { if (path.indexOf('junit_report.tpl') > -1) { return callback(null, fs.readFileSync(path, encoding)); @@ -57,34 +55,31 @@ describe( } ); - sandbox.stub( - fs, - 'writeFile', + sandbox.stub(fs, 'writeFile').callsFake( function(path, content, callback) { callback(null, content); } ); - var cb = sandbox.spy(); - var reporter = new junit( { logger: logger } ); - reporter.generate(cb); - - assert.isTrue(fs.writeFile.called, 'writeFile should have been called'); - assert.isTrue(cb.called, 'cb should have been executed'); + return reporter.generate().then( + function(results) { + assert.isTrue(fs.writeFile.called, 'writeFile should have been called'); - assert.equal(cb.args[0][1], fs.readFileSync(path.join(__dirname, 'fixture', 'result.xml'), 'utf-8'), 'The result should match what we expect'); + assert.equal(results, fs.readFileSync(path.join(__dirname, 'fixture', 'result.xml'), 'utf-8'), 'The result should match what we expect'); + } + ); } ); it( 'should generate a valid JUnit report', - function(done) { + function() { var logger = new Logger.constructor(); logger.log(1, 'Content is not valid', 'foo.js'); @@ -92,9 +87,7 @@ describe( logger.log(39, ' -1) { return callback(null, fs.readFileSync(path, encoding)); @@ -104,9 +97,7 @@ describe( } ); - sandbox.stub( - fs, - 'writeFile', + sandbox.stub(fs, 'writeFile').callsFake( function(path, content, callback) { callback(null, content); } @@ -117,22 +108,21 @@ describe( this.timeout(5000); - var cb = sandbox.spy(); - var reporter = new junit( { logger: logger } ); - reporter.generate(cb); - - xsd.validateXML( - cb.args[0][1], - path.join(__dirname, 'fixture', 'junit-4.xsd'), - function(err, result) { - assert.isTrue(result.valid, err); - done(); + return reporter.generate().then( + function(results) { + xsd.validateXML( + results, + path.join(__dirname, 'fixture', 'junit-4.xsd'), + function(err, result) { + assert.isTrue(result.valid, err); + } + ); } ); } @@ -147,21 +137,16 @@ describe( sandbox.stub(fs, 'readFile').callsArgWith(2, null, ''); - sandbox.stub( - fs, - 'writeFile', + sandbox.stub(fs, 'writeFile').callsFake( function(path, content, callback) { callback(null, content); - assert.isTrue(cb.called, 'cb should have been executed'); assert.equal(path, 'custom_result.xml'); done(); } ); - var cb = sandbox.spy(); - var reporter = new junit( { flags: { @@ -170,7 +155,7 @@ describe( } ); - reporter.generate(cb); + reporter.generate(); } ); } diff --git a/test/lint_css_rules/at_rule_empty_line.js b/test/lint_css_rules/at_rule_empty_line.js new file mode 100644 index 0000000..2615f6a --- /dev/null +++ b/test/lint_css_rules/at_rule_empty_line.js @@ -0,0 +1,76 @@ +var path = require('path'); +var ruleUtils = require('../../lib/rule_utils'); +var testRule = require('../stylelint_rule_tester'); + +var stylelint = testRule.stylelint; + +var rule = require('../../lib/lint_css_rules/' + path.basename(__filename)); +var sub = require('string-sub'); + +var stylelintRule = require('stylelint/lib/rules/at-rule-empty-line-before'); + +var path = require('path'); +var fs = require('fs'); +var chai = require('chai'); +var _ = require('lodash'); + +chai.use(require('chai-string')); + +var assert = chai.assert; + +testRule( + rule, + { + ruleName: rule.ruleName, + config: ['always', {except: ['first-nested']}], + accept: [ + { + code: `a { + @include foo; + color: pink; + }`, + description: 'always at rule empty line no first-nested' + }, + { + code: ` + @if $foo != null { + div { + color: blue; + } + } + @else { + div { + color: red; + } + } + `, + description: 'ignore @else blocks' + } + ], + reject: [ + { + code: `a { + color: blue; + @include foo; + }`, + message: stylelintRule.messages.expected + } + ], + syntax: 'scss', + } +); + +testRule( + rule, + { + description: 'should handle invalid options', + config: [], + skipBasicChecks: true, + reject: [ + { + code: 'a {\n}', + message: 'Expected option value for rule "' + rule.ruleName + '"' + } + ], + } +); \ No newline at end of file diff --git a/test/lint_rules/array_spacing.js b/test/lint_js_rules/array_spacing.js similarity index 63% rename from test/lint_rules/array_spacing.js rename to test/lint_js_rules/array_spacing.js index ec19b5e..75c952a 100644 --- a/test/lint_rules/array_spacing.js +++ b/test/lint_js_rules/array_spacing.js @@ -1,13 +1,15 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ '[1, 2, 3]' diff --git a/test/lint_rules/array_spacing_chars.js b/test/lint_js_rules/array_spacing_chars.js similarity index 77% rename from test/lint_rules/array_spacing_chars.js rename to test/lint_js_rules/array_spacing_chars.js index 194f6b7..05dbbd4 100644 --- a/test/lint_rules/array_spacing_chars.js +++ b/test/lint_js_rules/array_spacing_chars.js @@ -1,15 +1,17 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); var STR_ERROR = 'Array items should be separated by exactly one space:'; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ '[1, 2, 3]', diff --git a/test/lint_js_rules/catch_arg_name.js b/test/lint_js_rules/catch_arg_name.js new file mode 100644 index 0000000..351ecbd --- /dev/null +++ b/test/lint_js_rules/catch_arg_name.js @@ -0,0 +1,25 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + 'try{}catch(e){}' + ], + + invalid: [ + { + code: 'try{}catch(err){}', + errors: [ { message: 'Catch statement param should be "e", not "err"' } ] + } + ] + } +); \ No newline at end of file diff --git a/test/lint_rules/catch_format.js b/test/lint_js_rules/catch_format.js similarity index 50% rename from test/lint_rules/catch_format.js rename to test/lint_js_rules/catch_format.js index db256a1..dc58f41 100644 --- a/test/lint_rules/catch_format.js +++ b/test/lint_js_rules/catch_format.js @@ -1,13 +1,15 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ 'try{}catch(e){\n}' diff --git a/test/lint_rules/dot_notation.js b/test/lint_js_rules/dot_notation.js similarity index 64% rename from test/lint_rules/dot_notation.js rename to test/lint_js_rules/dot_notation.js index f36f919..0ddc108 100644 --- a/test/lint_rules/dot_notation.js +++ b/test/lint_js_rules/dot_notation.js @@ -2,11 +2,12 @@ var _ = require('lodash'); var path = require('path'); var base = require('../../lib/base.js'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); var validRules = [ 'document["some-prop"];' @@ -19,8 +20,9 @@ _.forEach( } ); -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: validRules, diff --git a/test/lint_js_rules/format_args.js b/test/lint_js_rules/format_args.js new file mode 100644 index 0000000..46d139b --- /dev/null +++ b/test/lint_js_rules/format_args.js @@ -0,0 +1,238 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var testUtils = require('../test_utils'); + +var nl = testUtils.nl; + +var addES6 = testUtils.addES6(); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); +/* +alert({}, 1); +alert(function() {}, 1); +alert( +function() { +}, +1 +); + +alert(function() { +}, 1, 2); + +alert( +1, 2, 3 +); + +alert( +); + +alert(function() { +}, +1); + +alert(function() { +}, +1 +); + +alert(function() { +}); + +alert(function() {alert('foo');}, 1); +alert({x: 1}, 1); +firstFn(arg1)( + secondFn(arg2)( + thirdFn() + ) +) +*/ + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + 'alert();', + 'alert({}, 1);', + 'alert(function() {}, 1);', + + nl('alert(', + 'function() {', + '},', + '1', + ');'), + + nl('(function foo(){', + '}());'), + + nl('(function(){', + '}(', + '));'), + + nl('alert(', + '{', + 'x: 1', + '}', + ')(foo);'), + nl('firstFn(arg1)(', + 'secondFn(arg2)(', + 'thirdFn(', + 'fourthFn(arg3)(', + 'fifthFn()', + ')', + ')', + ')', + ')'), + nl('firstFn(arg1)(', + 'secondFn(', + '{', + 'x: 1', + '}', + ')(', + 'thirdFn()', + ')', + ')'), + // I need to come back to this test... + // It passes if the identifier is the last argument, + // but fails when it's the first. + // I also wonder about variations of this, like (var, fn, var) or (fn, var, obj, var), etc + // UPDATE: (var, obj), (fn, var, fn), and (fn, var, obj) fail as well + // nl('(function(arg1) {', + // 'return function(){', + // '};', + // '})(', + // 'obj,', + // 'function(exp){', + // 'return "";', + // '}', + // ');') + ].concat( + [ + { code: nl( + 'doSomethingPromisable()', + '.then((foo) => doSomethingMorePromisable(foo))', + '.then((bar) => finish(bar))' + ) + } + ].map(addES6) + ), + + invalid: [ + { + code: nl('alert(function() {', + '}, 1, 2);'), + errors: [ { message: 'Args should each be on their own line (args on same line): alert(...)' } ] + }, + { + code: nl('alert(', + '1, 2, 3', + ');'), + errors: [ { message: 'Function call can be all on one line: alert(...)' } ] + }, + { + code: nl('alert(', + ');'), + errors: [ { message: 'Function call without arguments should be on one line: alert()' } ] + }, + { + code: nl('alert(function() {', + '},', + '1);'), + errors: [ { message: 'Args should each be on their own line (args on end line): alert(...)' } ] + }, + { + code: nl('alert(function() {', + '},', + '1', + ');'), + errors: [ { message: 'Args should each be on their own line (args on start line): alert(...)' } ] + }, + { + code: nl('alert(function() {', + '});'), + errors: [ { message: 'Args should each be on their own line (args on start line): alert(...)' } ] + }, + { + code: nl('alert(function() {alert(\'foo\');}, 1);'), + errors: [ { message: 'Args should each be on their own line (args on same line): alert(...)' } ] + }, + { + code: 'alert({x: 1}, 1);', + errors: [ { message: 'Args should each be on their own line (args on same line): alert(...)' } ] + }, + { + code: nl('AUI()[\'add\'](function(){', + '});'), + errors: [ { message: 'Args should each be on their own line (args on start line): AUI(...)' } ] + }, + { + code: nl('(function(){', + '}(', + '{x: 1},2,3', + '));'), + errors: [ { message: 'Args should each be on their own line (args on same line): (...)' } ] + }, + { + code: nl('alert({', + 'x: 1', + '})(foo);'), + errors: [ { message: 'Args should each be on their own line (args on start line): alert(...)' } ] + }, + { + code: nl('alert()(foo, {', + 'x: 1', + '});'), + errors: [ { message: 'Args should each be on their own line (args on same line): alert(...)' } ] + }, + { + code: nl('firstFn(arg1)(secondFn(arg2)(', + 'thirdFn(', + 'fourthFn(arg3)(', + 'fifthFn()', + ')', + ')', + ')', + ')'), + errors: [ { message: 'Args should each be on their own line (args on start line): firstFn(...)' } ] + }, + { + code: nl('firstFn(arg1)(', + 'secondFn(arg2)(', + 'thirdFn(', + 'fourthFn(arg3)(', + 'fifthFn()', + ')', + ')', + '))'), + errors: [ { message: 'Args should each be on their own line (args on end line): firstFn(...)' } ] + }, + { + code: nl('firstFn(arg1)(', + 'secondFn(arg2)(', + 'thirdFn(', + 'fourthFn(', + '{', + 'x: 1', + '})(', + 'fifthFn()', + ')', + ')', + ')', + ')'), + errors: [ { message: 'Args should each be on their own line (args on end line): fourthFn(...)' } ] + }, + { + code: nl('(function(arg1) {', + 'return function(){};', + '})(obj, function(exp){', + '});'), + errors: [ { message: 'Args should each be on their own line (args on same line): (...)' } ] + } + ] + } +); \ No newline at end of file diff --git a/test/lint_rules/format_constants.js b/test/lint_js_rules/format_constants.js similarity index 63% rename from test/lint_rules/format_constants.js rename to test/lint_js_rules/format_constants.js index a20deb9..7ee73c7 100644 --- a/test/lint_rules/format_constants.js +++ b/test/lint_js_rules/format_constants.js @@ -1,13 +1,15 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ 'var FOO1 = \'\';\n\nvar FOO2 = \'\';' diff --git a/test/lint_rules/format_multiline_vars.js b/test/lint_js_rules/format_multiline_vars.js similarity index 56% rename from test/lint_rules/format_multiline_vars.js rename to test/lint_js_rules/format_multiline_vars.js index 826181f..7302043 100644 --- a/test/lint_rules/format_multiline_vars.js +++ b/test/lint_js_rules/format_multiline_vars.js @@ -1,13 +1,18 @@ var path = require('path'); +var sub = require('string-sub'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +var addES6 = require('../test_utils').addES6(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ 'var FOO1;', @@ -20,7 +25,12 @@ eslintTester.addRuleTest( 'FOO1 = \'something\' +\nLiferay.foo();', 'FOO1 = \'something\' +\nLiferay.foo() + \'foo\';', 'FOO1 = (\nbar && baz\n);' - ], + ].concat( + [ + {code: 'var {\nFOO1,\nFOO2\n} = {FOO1: 1, FOO2: 2};'}, + {code: 'var [\nFOO1,\nFOO2\n] = [1, 2];'}, + ].map(addES6) + ), invalid: [ { @@ -75,6 +85,33 @@ eslintTester.addRuleTest( code: 'FOO1 =\n(\nbar && baz\n);', errors: [ { message: 'Variable values should start on the same line as the variable name "FOO1"' } ] } - ] + ].concat( + [ + { + code: 'var\n{\nFOO1,\nFOO2\n}\n= {FOO1: 1, FOO2: 2};', + errors: [{ message: sub('Destructured assignments should have "{startToken}" on the same line as "{keywordToken}" and "{endToken}" should be on the same line as "{initName}"', {startToken: '{', keywordToken: 'var', endToken: '}', initName: '{FOO1: 1, FOO2: 2}'}) }] + }, + { + code: 'var\n[\nFOO1,\nFOO2\n]\n= [1, 2];', + errors: [{ message: sub('Destructured assignments should have "{startToken}" on the same line as "{keywordToken}" and "{endToken}" should be on the same line as "{initName}"', {startToken: '[', keywordToken: 'var', endToken: ']', initName: '[1, 2]'}) }] + }, + { + code: 'var\n{\nFOO1,\nFOO2\n}\n= FOO;', + errors: [{ message: sub('Destructured assignments should have "{startToken}" on the same line as "{keywordToken}" and "{endToken}" should be on the same line as "{initName}"', {startToken: '{', keywordToken: 'var', endToken: '}', initName: 'FOO'}) }] + }, + { + code: 'var\n[\nFOO1,\nFOO2\n]\n= FOO;', + errors: [{ message: sub('Destructured assignments should have "{startToken}" on the same line as "{keywordToken}" and "{endToken}" should be on the same line as "{initName}"', {startToken: '[', keywordToken: 'var', endToken: ']', initName: 'FOO'}) }] + }, + { + code: 'var\n{\nFOO1,\nFOO2\n} = FOO;', + errors: [{ message: 'Destructured assignments should have "{" on the same line as "var"' }] + }, + { + code: 'var {\nFOO1,\nFOO2\n}\n= FOO;', + errors: [{ message: 'Destructured assignments should have "}" on the same line as "FOO"' }] + }, + ].map(addES6) + ) } ); \ No newline at end of file diff --git a/test/lint_js_rules/function_spacing.js b/test/lint_js_rules/function_spacing.js new file mode 100644 index 0000000..3066a4b --- /dev/null +++ b/test/lint_js_rules/function_spacing.js @@ -0,0 +1,67 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +var STR_END_ERROR = 'There should be exactly one line between the last statement and the end of the function, not '; + +var STR_START_ERROR = 'There should be exactly one line between the start of the function and the first statement, not '; + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + 'function foo() {}', + 'function foo() {\n}', + 'function foo() {\nalert("test");\n}', + 'function foo() {\n/*Test*/\nalert("test");\n}', + 'function foo() {\nalert("test");\n/*Test*/\n}', + 'function foo() {\n/*Test*/\nalert("test");\n/*Test*/\n}', + 'function foo() {\n// Test\nalert("test");\n// Test\n}', + ], + + invalid: [ + { + code: 'function foo() {\n\nalert("test");\n}', + errors: [ { message: STR_START_ERROR + '2 lines' } ] + }, + { + code: 'function foo() {\nalert("test");\n\n}', + errors: [ { message: STR_END_ERROR + '2 lines' } ] + }, + { + code: 'function foo() {alert("test");\n}', + errors: [ { message: STR_START_ERROR + '0 lines' } ] + }, + { + code: 'function foo() {\nalert("test");}', + errors: [ { message: STR_END_ERROR + '0 lines' } ] + }, + { + code: 'function foo() {\n/*Test*/\n\nalert("test");\n}', + errors: [ { message: STR_START_ERROR + '2 lines' } ] + }, + { + code: 'function foo() {\n\n/*Test*/\nalert("test");\n}', + errors: [ { message: STR_START_ERROR + '2 lines' } ] + }, + { + code: 'function foo() {\nalert("test");\n/*Test*/\n\n}', + errors: [ { message: STR_END_ERROR + '2 lines' } ] + }, + // { + // code: 'function foo() {\n/*Test*/\n\n/*Test*/\nalert("test");\n}', + // errors: [ { message: STR_START_ERROR + '2 lines' } ] + // }, + // { + // code: 'function foo() {\nalert("test");\n/*Test*/\n\n/*Test*/\n}', + // errors: [ { message: STR_END_ERROR + '2 lines' } ] + // } + ] + } +); \ No newline at end of file diff --git a/test/lint_rules/liferay_language_get.js b/test/lint_js_rules/liferay_language_get.js similarity index 75% rename from test/lint_rules/liferay_language_get.js rename to test/lint_js_rules/liferay_language_get.js index a1797f5..fe2f67f 100644 --- a/test/lint_rules/liferay_language_get.js +++ b/test/lint_js_rules/liferay_language_get.js @@ -1,10 +1,11 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); var invalidTests = ['1', 'function(){}', '/f/', 'new Date()', 'foo'].map( function(item, index) { @@ -15,8 +16,9 @@ var invalidTests = ['1', 'function(){}', '/f/', 'new Date()', 'foo'].map( } ); -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ 'Liferay.Language.get("foo")', diff --git a/test/lint_rules/liferay_provide_format.js b/test/lint_js_rules/liferay_provide_format.js similarity index 86% rename from test/lint_rules/liferay_provide_format.js rename to test/lint_js_rules/liferay_provide_format.js index 32374f5..ff3159a 100644 --- a/test/lint_rules/liferay_provide_format.js +++ b/test/lint_js_rules/liferay_provide_format.js @@ -1,13 +1,15 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ 'Liferay.provide(window, "foo", function(){}, ["dep"])', diff --git a/test/lint_rules/multiple_vars.js b/test/lint_js_rules/multiple_vars.js similarity index 62% rename from test/lint_rules/multiple_vars.js rename to test/lint_js_rules/multiple_vars.js index 2468e37..18456f9 100644 --- a/test/lint_rules/multiple_vars.js +++ b/test/lint_js_rules/multiple_vars.js @@ -1,13 +1,15 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ 'var x = 1;\nvar y = 2;', diff --git a/test/lint_js_rules/no_extra_semi.js b/test/lint_js_rules/no_extra_semi.js new file mode 100644 index 0000000..95aca79 --- /dev/null +++ b/test/lint_js_rules/no_extra_semi.js @@ -0,0 +1,22 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + ';(function(){});' + ], + + invalid: [ + { code: ';;(function(){});', errors: [{ message: 'Unnecessary semicolon.'}] } + ] + } +); \ No newline at end of file diff --git a/test/lint_rules/no_is_prefix.js b/test/lint_js_rules/no_is_prefix.js similarity index 82% rename from test/lint_rules/no_is_prefix.js rename to test/lint_js_rules/no_is_prefix.js index da9dccf..75362bd 100644 --- a/test/lint_rules/no_is_prefix.js +++ b/test/lint_js_rules/no_is_prefix.js @@ -1,15 +1,17 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); var STR_ERROR = 'Variable/property names should not start with is*: '; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ 'var isString = A.Lang.isString;', diff --git a/test/lint_js_rules/no_multiple_return.js b/test/lint_js_rules/no_multiple_return.js new file mode 100644 index 0000000..99cc2e7 --- /dev/null +++ b/test/lint_js_rules/no_multiple_return.js @@ -0,0 +1,71 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +var addES6 = require('../test_utils').addES6(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + 'function foo() {return 1;}', + 'function foo() {}', + 'function foo() {bar();}', + 'function foo() {var f = function(){return 1;}; return f();}', + 'function foo() {var f = function(){return 1;};}' + ].concat( + [ + { code: 'var foo = () => {return 1;}' }, + { code: 'var foo = () => {}' }, + { code: 'var foo = () => {bar();}' }, + { code: 'var foo = () => {var f = n => {return 1}; return f();}' }, + { code: 'var foo = () => {var f = n => {return 1};}' }, + + ].map(addES6) + ), + + invalid: [ + { + code: 'function foo() {if (x) {return x;} return;}', + errors: [ { message: 'Functions should only have one return statement' } ] + }, + { + code: 'function foo() {if (x) {return x;} else {return 1;}}', + errors: [ { message: 'Functions should only have one return statement' } ] + }, + { + code: 'function foo() {return 1; return 2;}', + errors: [ { message: 'Functions should only have one return statement' } ] + }, + { + code: 'function foo() {var f = function(){if (foo) {return foo;} return 1;};}', + errors: [ { message: 'Functions should only have one return statement' } ] + } + ].concat( + [ + { + code: 'var foo = () => {if (x) {return x;} return;}', + errors: [ { message: 'Functions should only have one return statement' } ] + }, + { + code: 'var foo = () => {if (x) {return x;} else {return 1;}}', + errors: [ { message: 'Functions should only have one return statement' } ] + }, + { + code: 'var foo = () => {return 1; return 2;}', + errors: [ { message: 'Functions should only have one return statement' } ] + }, + { + code: 'var foo = () => {var f = () => {if (foo) {return foo;} return 1;};}', + errors: [ { message: 'Functions should only have one return statement' } ] + } + ] + ).map(addES6) + } +); \ No newline at end of file diff --git a/test/lint_js_rules/no_undef.js b/test/lint_js_rules/no_undef.js new file mode 100644 index 0000000..af15a73 --- /dev/null +++ b/test/lint_js_rules/no_undef.js @@ -0,0 +1,29 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + '_PN_foo()', + '_PN_()', + '_PN_.foo', + 'var a = _PN_;', + 'var b = _EL_EXPRESSION_1' + ], + + invalid: [ + { + code: 'var a = b;', + errors: [ { message: "'b' is not defined." } ] + } + ] + } +); \ No newline at end of file diff --git a/test/lint_js_rules/no_unused_vars.js b/test/lint_js_rules/no_unused_vars.js new file mode 100644 index 0000000..2aa6a98 --- /dev/null +++ b/test/lint_js_rules/no_unused_vars.js @@ -0,0 +1,40 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +var options = [{'jsp': true}]; + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + 'var _PN_xyz = 1;', + { + code: '(function(){ var _PN_xyz = function(){}; });', + options: options + }, + { + code: '(function(){ function _PN_xyz(){} })', + options: options + }, + { + code: '(function(){ function _SCRIPTLET_xyz(){} })', + options: options + }, + ], + + invalid: [ + { + code: '(function(){ var _PN_xyz = 1; });', + errors: [ { message: "'_PN_xyz' is assigned a value but never used." } ], + options: options + } + ] + } +); \ No newline at end of file diff --git a/test/lint_js_rules/no_use_before_define.js b/test/lint_js_rules/no_use_before_define.js new file mode 100644 index 0000000..a0bd9a6 --- /dev/null +++ b/test/lint_js_rules/no_use_before_define.js @@ -0,0 +1,23 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + { code: "function a() { alert(b); } var b = 1;", options: [{'samescope': true}] } + ], + invalid: [ + { code: "function a() { alert(b); } var b = 1;", options: [{'samescope': false}], errors: [{ message: "'b' was used before it was defined.", type: "Identifier" }] }, + { code: "function a() { alert(b); } var b = 1;", options: ['nofunc'], errors: [{ message: "'b' was used before it was defined.", type: "Identifier" }] }, + { code: "function a() { alert(b); var b = 1; }", options: [{'samescope': true}], errors: [{ message: "'b' was used before it was defined.", type: "Identifier" }] } + ] + } +); \ No newline at end of file diff --git a/test/lint_js_rules/sort_constants.js b/test/lint_js_rules/sort_constants.js new file mode 100644 index 0000000..9f1cb0b --- /dev/null +++ b/test/lint_js_rules/sort_constants.js @@ -0,0 +1,50 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +var addES6 = require('../test_utils').addES6(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + 'var ABC = 123;\n\nvar DEF = 456;', + 'var DEF = 456;\n\nvar ABC = "FOO" + DEF;', + 'var DEF = 456;\n\nvar GHI = 789;\n\nvar ABC = DEF;', + 'var DEF = 456;\n\nvar ABC = some.method[DEF];', + 'var DEF = 456;\n\nvar ABC = {key: DEF};', + 'var DEF = 456;\n\nvar ABC = {key: {someOtherKey: DEF}};', + 'var DEF = function(){};\n\nvar ABC = DEF();', + 'var DEF = function(){};\n\nvar ABC = foo(DEF);' + ].concat( + [ + {code: 'var DEF = "Hello";\n\nvar ABC = {[DEF]: 1};'}, + ].map(addES6) + ), + + invalid: [ + { + code: 'var DEF = 456;\n\nvar ABC = 123;', + errors: [ { message: 'Sort constants: DEF ABC' } ] + }, + { + code: 'var DEF = 456;\n\nvar DEF_XYZ = "FOO";\n\nvar ABC = 123;', + errors: [ { message: 'Sort constants: DEF_XYZ ABC' } ] + }, + { + code: 'var DEF = 456;\n\nvar ABC = "DEF";', + errors: [ { message: 'Sort constants: DEF ABC' } ] + }, + { + code: 'var DEF = 456;\n\nvar ABC;', + errors: [ { message: 'Sort constants: DEF ABC' } ] + } + ] + } +); \ No newline at end of file diff --git a/test/lint_rules/sort_props.js b/test/lint_js_rules/sort_props.js similarity index 66% rename from test/lint_rules/sort_props.js rename to test/lint_js_rules/sort_props.js index 22d79b6..2ba886a 100644 --- a/test/lint_rules/sort_props.js +++ b/test/lint_js_rules/sort_props.js @@ -1,13 +1,23 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +var addES6 = require('../test_utils').addES6( + { + ecmaFeatures: { + experimentalObjectRestSpread: true + } + } +); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ '({init: function(){}, initializer: function(){}, renderUI: function(){}, bindUI: function(){}, syncUI: function(){}, destructor: function(){}})', @@ -19,13 +29,19 @@ eslintTester.addRuleTest( '({ ATTRS: {a: 1,\nb: 2,}})', { code: '({initString: 1, initsTriangle: 2})', - args: [2, {'casesensitive': true}] + options: [{'casesensitive': true}] }, { code: '({initsTriangle: 1, initString: 2})', - args: [2, {'casesensitive': false}] + options: [{'casesensitive': false}] } - ], + ].concat( + [ + { code: '({[bar]: 1, [foo]: 1})' }, + { code: '({a: 1, [bar()]: 1, [foo]: 1, [obj.bar()]: 1, [obj.foo]: 1, [str + \'other\']: 1 })' }, + { code: '({...baz, bar: 1, foo})' }, + ].map(addES6) + ), invalid: [ { @@ -64,6 +80,17 @@ eslintTester.addRuleTest( code: '({ ATTRS: {z: 1,\n\nb: {}}})', errors: [ { message: 'Sort properties: z b' } ] } - ] + ].concat( + [ + { + code: '({[foo]: 1, [bar]: 1})', + errors: [ { message: 'Sort properties: [foo] [bar]' } ] + }, + { + code: '({a: 1, [str + \'other\']: 1, [bar()]: 1, [foo]: 1, [obj.bar()]: 1, [obj.foo]: 1 })', + errors: [ { message: 'Sort properties: [str + \'other\'] [bar()]' } ] + }, + ].map(addES6) + ) } ); \ No newline at end of file diff --git a/test/lint_rules/sort_requires.js b/test/lint_js_rules/sort_requires.js similarity index 67% rename from test/lint_rules/sort_requires.js rename to test/lint_js_rules/sort_requires.js index b89bd82..b61cce2 100644 --- a/test/lint_rules/sort_requires.js +++ b/test/lint_js_rules/sort_requires.js @@ -1,13 +1,15 @@ var path = require('path'); -var lint = require('../../lib/lint'); +var lint = require('../../lib/lint_js'); var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); +var RuleTester = lint.eslint.RuleTester; -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), +var ruleTester = new RuleTester(); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), { valid: [ '({requires: []})', diff --git a/test/lint_js_rules/sort_vars.js b/test/lint_js_rules/sort_vars.js new file mode 100644 index 0000000..6122aab --- /dev/null +++ b/test/lint_js_rules/sort_vars.js @@ -0,0 +1,81 @@ +var path = require('path'); + +var lint = require('../../lib/lint_js'); + +var linter = lint.linter; +var RuleTester = lint.eslint.RuleTester; + +var ruleTester = new RuleTester(); + +var addES6 = require('../test_utils').addES6( + { + ecmaFeatures: {}, + sourceType: 'module' + } +); + +ruleTester.run( + path.basename(__filename, '.js'), + require('../../lib/lint_js_rules/' + path.basename(__filename)), + { + valid: [ + 'var xyz = 123;', + 'var abc = 123;\nvar def = 456;', + 'var abc = 123; var def = 456;', + 'var cde = 123;\nvar def = 123;\n\nvar abc = 456;', + 'var cde = 123;\nvar def = foo();\n\nvar abc = bar(def);', + 'var cde = 123;\nvar def = window.foo();\n\nvar abc = window.bar(def);', + 'for (var i = 0; i < 10; i++) {\nvar current = 1;\n}', + 'for (var i in obj) {\nvar current = 1;\n}' + ].concat( + [ + { code: 'const {bar, foo} = refs;' }, + { code: 'import Foo, {bar, baz} from "somefile";' }, + { code: 'import Foo, {bar as doo, baz} from "somefile";' }, + { code: 'import Foo from "somefile";' }, + { code: 'import "somefile";' }, + { code: 'const [foo, bar] = refs;' }/*, + Need to add the below as soon as I figure out what to do about es7/babel-eslint, etc + { code: 'const {foo, ...bar} = refs;' }*/ + ].map(addES6) + ), + + invalid: [ + { + code: 'var def = 456;\nvar abc = 123;', + errors: [ { message: 'Sort variables: def abc' } ] + }, + { + code: 'var def = 456;\n\nvar def_xyz = "FOO";\nvar abc = 123;', + errors: [ { message: 'Sort variables: def_xyz abc' } ] + }, + { + code: 'var def = 456;\n\nvar def_xyz = foo();\nvar abc = def_xyz.bar();', + errors: [ { message: 'Sort variables: def_xyz abc' } ] + }, + { + code: 'var def = 456;\n\nvar def_xyz = window.foo;\nvar abc = def_xyz.bar;', + errors: [ { message: 'Sort variables: def_xyz abc' } ] + }, + { + code: 'var def = 456;\n\nvar def_xyz =[];\nvar abc = [];', + errors: [ { message: 'Sort variables: def_xyz abc' } ] + }, + { + code: 'var def = 456;\n\nvar def_xyz ={};\nvar abc = {};', + errors: [ { message: 'Sort variables: def_xyz abc' } ] + } + ].concat( + [ + { + code: 'const {foo, bar} = refs', + errors: [ { message: 'Sort variables: foo bar' } ] + }, + { + code: 'import Foo, {baz, bar} from "somefile";', + errors: [ { message: 'Sort imported members: baz bar' } ] + } + ].map(addES6) + ) + } +); \ No newline at end of file diff --git a/test/lint_rules/catch_arg_name.js b/test/lint_rules/catch_arg_name.js deleted file mode 100644 index bb3a06f..0000000 --- a/test/lint_rules/catch_arg_name.js +++ /dev/null @@ -1,23 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); - -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - 'try{}catch(e){}' - ], - - invalid: [ - { - code: 'try{}catch(err){}', - errors: [ { message: 'Catch statement param should be "e", not "err"' } ] - } - ] - } -); \ No newline at end of file diff --git a/test/lint_rules/format_args.js b/test/lint_rules/format_args.js deleted file mode 100644 index f2ff31b..0000000 --- a/test/lint_rules/format_args.js +++ /dev/null @@ -1,97 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); -/* -alert({}, 1); -alert(function() {}, 1); -alert( -function() { -}, -1 -); - -alert(function() { -}, 1, 2); - -alert( -1, 2, 3 -); - -alert( -); - -alert(function() { -}, -1); - -alert(function() { -}, -1 -); - -alert(function() { -}); - -alert(function() {alert('foo');}, 1); -alert({x: 1}, 1); -*/ -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - 'alert();', - 'alert({}, 1);', - 'alert(function() {}, 1);', - 'alert(\nfunction() {\n},\n1\n);', - '(function foo(){\n}());', - '(function(){\n}(\n));' - ], - - invalid: [ - { - code: 'alert(function() {\n}, 1, 2);', - errors: [ { message: 'Args should each be on their own line (args on same line): alert(...)' } ] - }, - { - code: 'alert(\n1, 2, 3\n);', - errors: [ { message: 'Function call can be all on one line: alert(...)' } ] - }, - { - code: 'alert(\n);', - errors: [ { message: 'Function call without arguments should be on one line: alert()' } ] - }, - { - code: 'alert(function() {\n},\n1);', - errors: [ { message: 'Args should each be on their own line (args on end line): alert(...)' } ] - }, - { - code: 'alert(function() {\n},\n1\n);', - errors: [ { message: 'Args should each be on their own line (args on start line): alert(...)' } ] - }, - { - code: 'alert(function() {\n});', - errors: [ { message: 'Args should each be on their own line (args on start line): alert(...)' } ] - }, - { - code: 'alert(function() {alert(\'foo\');}, 1);', - errors: [ { message: 'Args should each be on their own line (args on same line): alert(...)' } ] - }, - { - code: 'alert({x: 1}, 1);', - errors: [ { message: 'Args should each be on their own line (args on same line): alert(...)' } ] - }, - { - code: 'AUI()[\'add\'](function(){\n});', - errors: [ { message: 'Args should each be on their own line (args on start line): AUI(...)' } ] - }, - { - code: '(function(){\n}(\n{x: 1},2,3\n));', - errors: [ { message: 'Args should each be on their own line (args on same line): (...)' } ] - } - ] - } -); \ No newline at end of file diff --git a/test/lint_rules/no_extra_semi.js b/test/lint_rules/no_extra_semi.js deleted file mode 100644 index 8ae7322..0000000 --- a/test/lint_rules/no_extra_semi.js +++ /dev/null @@ -1,20 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); - -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - ';(function(){});' - ], - - invalid: [ - { code: ';;(function(){});', errors: [{ message: 'Unnecessary semicolon.'}] } - ] - } -); \ No newline at end of file diff --git a/test/lint_rules/no_undef.js b/test/lint_rules/no_undef.js deleted file mode 100644 index 5b63ff5..0000000 --- a/test/lint_rules/no_undef.js +++ /dev/null @@ -1,26 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); - -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - '_PN_foo()', - '_PN_()', - '_PN_.foo', - 'var a = _PN_;' - ], - - invalid: [ - { - code: 'var a = b;', - errors: [ { message: '"b" is not defined.' } ] - } - ] - } -); \ No newline at end of file diff --git a/test/lint_rules/no_unused_vars.js b/test/lint_rules/no_unused_vars.js deleted file mode 100644 index 84361c1..0000000 --- a/test/lint_rules/no_unused_vars.js +++ /dev/null @@ -1,34 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); - -var args = [2, {'jsp': true}]; - -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - 'var _PN_xyz = 1;', - { - code: '(function(){ var _PN_xyz = function(){}; });', - args: args - }, - { - code: '(function(){ function _PN_xyz(){} })', - args: args - }, - ], - - invalid: [ - { - code: '(function(){ var _PN_xyz = 1; });', - errors: [ { message: '_PN_xyz is defined but never used' } ], - args: args - } - ] - } -); \ No newline at end of file diff --git a/test/lint_rules/no_use_before_define.js b/test/lint_rules/no_use_before_define.js deleted file mode 100644 index 2eacaa3..0000000 --- a/test/lint_rules/no_use_before_define.js +++ /dev/null @@ -1,28 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); - -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - "var a=10; alert(a);", - "function b(a) { alert(a); }", - "Object.hasOwnProperty.call(a);", - "function a() { alert(arguments);}", - { code: "a(); function a() { alert(arguments); }", args: [1, {'nofunc': true}] }, - { code: "function a() { alert(b); } function b() { alert(arguments); }", args: [1, {'samescope': true}] } - ], - invalid: [ - { code: "a++; var a=19;", errors: [{ message: "a was used before it was defined"}] }, - { code: "a(); var a=function() {};", errors: [{ message: "a was used before it was defined"}] }, - { code: "alert(a[1]); var a=[1,3];", errors: [{ message: "a was used before it was defined"}] }, - { code: "a(); function a() { alert(b); var b=10; a(); }", errors: [{ message: "a was used before it was defined"}, { message: "b was used before it was defined"}] }, - { code: "a(); var a=function() {};", args: [1, "nofunc"], errors: [{ message: "a was used before it was defined"}] } - ] - } -); \ No newline at end of file diff --git a/test/lint_rules/sort_constants.js b/test/lint_rules/sort_constants.js deleted file mode 100644 index 9eb4295..0000000 --- a/test/lint_rules/sort_constants.js +++ /dev/null @@ -1,35 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); - -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - 'var ABC = 123;\n\nvar DEF = 456;', - 'var DEF = 456;\n\nvar ABC = "FOO" + DEF;', - 'var DEF = 456;\n\nvar GHI = 789;\n\nvar ABC = DEF;' - ], - - invalid: [ - { - code: 'var DEF = 456;\n\nvar ABC = 123;', - errors: [ { message: 'Sort constants: DEF ABC' } ] - }, - { - code: 'var DEF = 456;\n\nvar DEF_XYZ = "FOO";\n\nvar ABC = 123;', - errors: [ { message: 'Sort constants: DEF_XYZ ABC' } ] - } - // , - // Should add in the future - // { - // code: 'var DEF = 456;\n\nvar ABC = "DEF";', - // errors: [ { message: 'Sort constants: DEF ABC' } ] - // }, - ] - } -); \ No newline at end of file diff --git a/test/lint_rules/sort_vars.js b/test/lint_rules/sort_vars.js deleted file mode 100644 index 55ab366..0000000 --- a/test/lint_rules/sort_vars.js +++ /dev/null @@ -1,32 +0,0 @@ -var path = require('path'); - -var lint = require('../../lib/lint'); - -var linter = lint.linter; -var ESLintTester = require('eslint-tester'); -var eslintTester = new ESLintTester(linter); - -eslintTester.addRuleTest( - path.resolve(__dirname, '../', '../', 'lib/lint_rules/' + path.basename(__filename)), - { - valid: [ - 'var xyz = 123;', - 'var abc = 123;\nvar def = 456;', - 'var abc = 123; var def = 456;', - 'var cde = 123;\nvar def = 123;\n\nvar abc = 456;', - 'for (var i = 0; i < 10; i++) {\nvar current = 1;\n}', - 'for (var i in obj) {\nvar current = 1;\n}' - ], - - invalid: [ - { - code: 'var def = 456;\nvar abc = 123;', - errors: [ { message: 'Sort variables: def abc' } ] - }, - { - code: 'var def = 456;\n\nvar def_xyz = "FOO";\nvar abc = 123;', - errors: [ { message: 'Sort variables: def_xyz abc' } ] - } - ] - } -); \ No newline at end of file diff --git a/test/re.js b/test/re.js index b3ec9fa..d0ddacc 100644 --- a/test/re.js +++ b/test/re.js @@ -55,7 +55,7 @@ describe( it( 'should find extra newlines at end', function() { - var endingNewLine = ['foo', '', '']; + var endingNewLine = ['foo', '']; endingNewLine.forEach( function(item, index, collection) { diff --git a/test/rule_utils.js b/test/rule_utils.js index 96af28e..9c238f3 100644 --- a/test/rule_utils.js +++ b/test/rule_utils.js @@ -13,7 +13,7 @@ var parse = function(contents, cb) { return falafel( contents, { - loc: true, + locations: true, tolerant: true }, cb @@ -48,7 +48,7 @@ describe( function(node) { if (node.type === 'Program') { var constants = ruleUtils.getConstants(node); - var constantNames = _.pluck(_.pluck(constants, 'id'), 'name'); + var constantNames = _.map(_.map(constants, 'id'), 'name'); assert.equal(constants.length, 2); assert.equal(constantNames.join(''), 'XY'); @@ -70,7 +70,7 @@ describe( varStr, function(node) { if (node.type === 'Program') { - var variables = _.where( + var variables = _.filter( node.body, { type: 'VariableDeclaration' diff --git a/test/stylelint_rule_tester.js b/test/stylelint_rule_tester.js new file mode 100644 index 0000000..9c421b6 --- /dev/null +++ b/test/stylelint_rule_tester.js @@ -0,0 +1,38 @@ +var stylelint = require('stylelint'); +var chai = require('chai'); + +chai.use(require('chai-string')); + +var assert = chai.assert; + +function assertEquality(processCss, context) { + const describeFn = (context.only) ? describe.only : describe; + + describeFn( + context.caseDescription, + function() { + it( + context.completeAssertionDescription, + function() { + return processCss.then( + function(comparisons) { + comparisons.forEach( + function(item, index) { + var actual = item.actual; + var expected = item.expected; + var description = item.description; + + assert.equal(actual, expected, description); + } + ); + } + ); + } + ); + } + ); +} + +module.exports = stylelint.createRuleTester(assertEquality); + +module.exports.stylelint = stylelint; \ No newline at end of file diff --git a/test/test_utils/index.js b/test/test_utils/index.js new file mode 100644 index 0000000..fc805f7 --- /dev/null +++ b/test/test_utils/index.js @@ -0,0 +1,37 @@ +var _ = require('lodash'); + +var lintRules = require('../../lib/config/eslint').rules; + +exports.nl = function() { + return _.toArray(arguments).join('\n'); +} + +exports.addES6 = function(config) { + var parserOptions = _.merge({ ecmaVersion: 6 }, config); + + return function(item, index) { + item.parserOptions = parserOptions; + + return item; + }; +}; + +var invertValue = _.cond([[_.partial(_.eq, 0), _.constant(2)], [_.partial(_.eq, 2), _.constant(0)]]); + +exports.getRule = function(ruleName, invert, obj) { + var rule; + + var rules = obj || lintRules; + + if (_.isNumber(ruleName)) { + ruleName = Object.keys(rules)[ruleName]; + } + + var retVal = _.pick(rules, ruleName); + + if (invert) { + retVal[ruleName] = invertValue(retVal[ruleName]); + } + + return retVal; +}; \ No newline at end of file