From bcf5a1bc3446864c036eab5454c612b9c3b00211 Mon Sep 17 00:00:00 2001 From: Hannah Wolfe Date: Wed, 1 Nov 2017 13:44:54 +0000 Subject: [PATCH] Switch to Eslint (#9197) refs #9178 * Add eslint deps, remove old lint deps * Add eslint config, remove old lint configs * Config for server and tests are different * Tweaked rules to suit us * Fix linting in codebase - lots of indent changes. * Fix a real broken test --- .eslintrc.json | 300 ++++++ .jscsrc | 75 -- .jshintrc | 27 - Gruntfile.js | 77 +- core/server/adapters/scheduling/utils.js | 3 +- .../adapters/storage/LocalFileStorage.js | 3 - core/server/adapters/storage/index.js | 6 +- core/server/admin/controller.js | 7 +- core/server/admin/serviceworker.js | 1 - core/server/api/configuration.js | 10 +- core/server/api/db.js | 6 +- core/server/api/notifications.js | 2 +- core/server/api/schedules.js | 6 +- core/server/api/settings.js | 3 +- .../apps/amp/lib/helpers/amp_content.js | 38 +- core/server/apps/default-cards/cards/html.js | 18 +- .../apps/default-cards/cards/markdown.js | 30 +- .../lib/helpers/input_password.js | 6 +- .../subscribers/lib/helpers/input_email.js | 6 +- .../subscribers/lib/helpers/subscribe_form.js | 6 +- core/server/apps/subscribers/lib/router.js | 2 - .../server/controllers/frontend/fetch-data.js | 2 +- core/server/data/importer/handlers/json.js | 3 +- .../server/data/importer/handlers/markdown.js | 1 - .../data/importer/importers/data/posts.js | 4 +- core/server/data/meta/excerpt.js | 1 - core/server/data/meta/index.js | 86 +- core/server/data/meta/paginated_url.js | 4 +- core/server/data/meta/schema.js | 16 +- core/server/data/schema/clients/index.js | 2 +- core/server/data/schema/clients/mysql.js | 8 +- core/server/data/schema/clients/pg.js | 4 +- core/server/data/schema/clients/sqlite3.js | 4 +- core/server/data/validation/index.js | 44 +- core/server/errors.js | 5 +- core/server/helpers/body_class.js | 7 +- core/server/helpers/facebook_url.js | 7 +- core/server/helpers/foreach.js | 10 +- core/server/helpers/ghost_foot.js | 6 +- core/server/helpers/ghost_head.js | 7 +- core/server/helpers/has.js | 10 +- core/server/helpers/img_url.js | 7 +- core/server/helpers/meta_description.js | 11 +- core/server/helpers/meta_title.js | 11 +- core/server/helpers/page_url.js | 9 +- core/server/helpers/pagination.js | 1 - core/server/helpers/post_class.js | 7 +- core/server/helpers/prev_next.js | 2 +- core/server/helpers/twitter_url.js | 7 +- core/server/middleware/api/spam-prevention.js | 176 ++-- core/server/middleware/error-handler.js | 4 +- core/server/middleware/serve-favicon.js | 6 +- core/server/middleware/serve-public-file.js | 2 +- core/server/middleware/static-theme.js | 14 +- core/server/middleware/uncapitalise.js | 6 +- core/server/models/app.js | 1 - core/server/models/base/token.js | 2 +- core/server/models/plugins/include-count.js | 11 +- core/server/models/plugins/pagination.js | 15 +- core/server/models/tag.js | 1 - core/server/models/user.js | 74 +- core/server/permissions/can-this.js | 14 +- core/server/services/apps/proxy.js | 6 +- core/server/services/slack.js | 2 - core/server/themes/Storage.js | 2 - core/server/update-check.js | 22 +- core/server/utils/index.js | 2 + core/server/utils/markdown-converter.js | 65 +- core/server/utils/mobiledoc-converter.js | 18 +- core/server/utils/packages/read-packages.js | 1 - core/server/utils/read-csv.js | 70 +- .../utils/remove-open-redirect-from-url.js | 3 +- core/server/utils/tokens.js | 1 - core/server/utils/url.js | 16 +- core/test/.eslintrc.json | 288 ++++++ .../routes/api/configuration_spec.js | 4 + core/test/functional/routes/frontend_spec.js | 9 +- .../data/importer/importers/data_spec.js | 4 +- core/test/utils/fork.js | 3 +- package.json | 6 +- yarn.lock | 874 ++++++++++-------- 81 files changed, 1608 insertions(+), 1032 deletions(-) create mode 100644 .eslintrc.json delete mode 100644 .jscsrc delete mode 100644 .jshintrc create mode 100644 core/test/.eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..5719e63f6a --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,300 @@ +{ + "env": { + "es6": true, + "node": true + }, + "extends": "eslint:recommended", + "rules": { + "accessor-pairs": "error", + "array-bracket-newline": "off", + "array-bracket-spacing": [ + "error", + "never" + ], + "array-callback-return": "off", + "array-element-newline": "off", + "arrow-body-style": "error", + "arrow-parens": [ + "error", + "always" + ], + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-scoped-var": "error", + "brace-style": [ + "error", + "1tbs", + { + "allowSingleLine": true + } + ], + "callback-return": "error", + "camelcase": [ + "error", + { + "properties": "never" + } + ], + "capitalized-comments": "off", + "class-methods-use-this": "off", + "comma-dangle": "error", + "comma-spacing": "error", + "comma-style": [ + "error", + "last" + ], + "complexity": "off", + "computed-property-spacing": [ + "error", + "never" + ], + "consistent-return": "off", + "consistent-this": "off", + "curly": "error", + "default-case": "error", + "dot-location": [ + "error", + "property" + ], + "dot-notation": "error", + "eol-last": "error", + "eqeqeq": "error", + "for-direction": "error", + "func-call-spacing": "error", + "func-name-matching": "off", + "func-names": "off", + "func-style": "off", + "function-paren-newline": "off", + "generator-star-spacing": "error", + "getter-return": "error", + "global-require": "off", + "guard-for-in": "error", + "handle-callback-err": "error", + "id-blacklist": "error", + "id-length": "off", + "id-match": "error", + "indent": [ + "error", + 4, + { + "SwitchCase": 1 + } + ], + "indent-legacy": "off", + "init-declarations": "off", + "jsx-quotes": "error", + "key-spacing": "error", + "keyword-spacing": "error", + "line-comment-position": "off", + "linebreak-style": [ + "error", + "unix" + ], + "lines-around-comment": "off", + "lines-around-directive": "off", + "lines-between-class-members": [ + "error", + "always" + ], + "max-depth": "error", + "max-len": "off", + "max-lines": "off", + "max-nested-callbacks": "error", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": "off", + "multiline-comment-style": "off", + "multiline-ternary": "off", + "new-parens": "error", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "off", + "no-alert": "error", + "no-array-constructor": "error", + "no-await-in-loop": "error", + "no-bitwise": "off", + "no-buffer-constructor": "off", + "no-caller": "error", + "no-catch-shadow": "error", + "no-confusing-arrow": "error", + "no-continue": "error", + "no-div-regex": "off", + "no-duplicate-imports": "error", + "no-else-return": "off", + "no-empty-function": "off", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-extra-parens": "off", + "no-floating-decimal": "error", + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-inline-comments": "off", + "no-inner-declarations": [ + "error", + "functions" + ], + "no-invalid-this": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "off", + "no-loop-func": "error", + "no-magic-numbers": "off", + "no-mixed-operators": "off", + "no-mixed-requires": "off", + "no-multi-assign": "off", + "no-multi-spaces": "off", + "no-multi-str": "error", + "no-multiple-empty-lines": "error", + "no-native-reassign": "error", + "no-negated-condition": "off", + "no-negated-in-lhs": "error", + "no-nested-ternary": "off", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-param-reassign": "off", + "no-path-concat": "off", + "no-plusplus": "error", + "no-process-env": "off", + "no-process-exit": "off", + "no-proto": "error", + "no-prototype-builtins": "off", + "no-restricted-globals": "error", + "no-restricted-imports": "error", + "no-restricted-modules": "error", + "no-restricted-properties": "error", + "no-restricted-syntax": "error", + "no-return-assign": "error", + "no-return-await": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "off", + "no-shadow-restricted-names": "error", + "no-spaced-func": "error", + "no-sync": "off", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-ternary": "off", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-undefined": "off", + "no-underscore-dangle": "off", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "off", + "no-use-before-define": "off", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "off", + "no-useless-constructor": "error", + "no-useless-escape": "off", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "off", + "no-void": "error", + "no-warning-comments": "off", + "no-whitespace-before-property": "error", + "no-with": "error", + "nonblock-statement-body-position": "error", + "object-curly-newline": [ + "error", + { + "consistent": true + } + ], + "object-curly-spacing": [ + "error", + "never" + ], + "object-property-newline": [ + "error", + { + "allowMultiplePropertiesPerLine": true + } + ], + "object-shorthand": "off", + "one-var": "off", + "one-var-declaration-per-line": "off", + "operator-assignment": "off", + "operator-linebreak": "off", + "padded-blocks": [ + "error", + "never" + ], + "padding-line-between-statements": "error", + "prefer-arrow-callback": "off", + "prefer-const": "off", + "prefer-destructuring": "off", + "prefer-numeric-literals": "error", + "prefer-promise-reject-errors": "off", + "prefer-reflect": "off", + "prefer-rest-params": "off", + "prefer-spread": "off", + "prefer-template": "off", + "quote-props": [ + "error", + "as-needed" + ], + "quotes": ["error", "single"], + "radix": "off", + "require-await": "error", + "require-jsdoc": "off", + "rest-spread-spacing": "error", + "semi": ["error", "always"], + "semi-spacing": "error", + "semi-style": [ + "error", + "last" + ], + "sort-imports": "error", + "sort-keys": "off", + "sort-vars": "off", + "space-before-blocks": "error", + "space-before-function-paren": [ + "error", + { + "anonymous": "always", + "named": "never" + } + ], + "space-in-parens": [ + "error", + "never" + ], + "space-infix-ops": "error", + "space-unary-ops": "error", + "spaced-comment": "error", + "strict": "off", + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": [ + "error", + "never" + ], + "template-tag-spacing": "error", + "unicode-bom": [ + "error", + "never" + ], + "valid-jsdoc": "off", + "vars-on-top": "off", + "wrap-iife": "off", + "wrap-regex": "off", + "yield-star-spacing": "error", + "yoda": "error" + } +} diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index d7aa689539..0000000000 --- a/.jscsrc +++ /dev/null @@ -1,75 +0,0 @@ -{ - "requireCurlyBraces": [ - "if", - "else", - "for", - "while", - "do", - "try", - "catch" - ], - "requireSpaceAfterKeywords": [ - "if", - "else", - "for", - "while", - "do", - "switch", - "case", - "return", - "try", - "catch", - "function", - "typeof" - ], - "requireSpaceBeforeBlockStatements": true, - "requireParenthesesAroundIIFE": true, - "requireSpacesInConditionalExpression": true, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunctionDeclaration": { - "beforeOpeningRoundBrace": true - }, - "requireSpacesInAnonymousFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "requireMultipleVarDecl": "onevar", - "requireBlocksOnNewline": 1, - "disallowPaddingNewlinesInBlocks": true, - "disallowEmptyBlocks": true, - "disallowSpacesInsideObjectBrackets": "all", - "disallowSpacesInsideArrayBrackets": true, - "disallowSpacesInsideParentheses": true, - "disallowQuotedKeysInObjects": true, - "disallowSpaceAfterObjectKeys": true, - "requireCommaBeforeLineBreak": true, - "disallowSpaceAfterPrefixUnaryOperators": true, - "disallowSpaceBeforePostfixUnaryOperators": true, - "disallowSpaceBeforeBinaryOperators": [ - "," - ], - "requireSpaceBeforeBinaryOperators": true, - "requireSpaceAfterBinaryOperators": true, - "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", - "disallowKeywords": [ "with" ], - "disallowMultipleLineBreaks": true, - "validateQuoteMarks": "'", - "validateIndentation": 4, - "disallowMixedSpacesAndTabs": true, - "disallowTrailingWhitespace": true, - "disallowTrailingComma": true, - "disallowKeywordsOnNewLine": [ "else" ], - "requireLineFeedAtFileEnd": true, - "requireCapitalizedConstructors": true, - "safeContextKeyword": ["self"], - "requireDotNotation": true, - "disallowYodaConditions": true, - "jsDoc": { - "checkParamNames": true, - "checkRedundantParams": true, - "requireParamTypes": true - }, - "requireSpaceAfterLineComment": true, - "disallowNewlineBeforeBlockStatements": true -} diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 520812e6cd..0000000000 --- a/.jshintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "node": true, - "browser": false, - "strict": false, - "sub": true, - "eqeqeq": true, - "laxbreak": true, - "bitwise": true, - "curly": true, - "forin": true, - "immed": true, - "latedef": true, - "newcap": true, - "noarg": true, - "noempty": true, - "nonew": true, - "plusplus": true, - "regexp": true, - "undef": true, - "unused": true, - "mocha": true, - "indent": 4, - "predef": [ - "-Promise" - ], - "esversion": 6 -} diff --git a/Gruntfile.js b/Gruntfile.js index 8c5d6367f3..1811fa2ee8 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,9 +6,9 @@ // // **Debug tip:** If you have any problems with any Grunt tasks, try running them with the `--verbose` command -// jshint unused: false -var overrides = require('./core/server/overrides'), - config = require('./core/server/config'), +require('./core/server/overrides'); + +var config = require('./core/server/config'), utils = require('./core/server/utils'), _ = require('lodash'), chalk = require('chalk'), @@ -68,8 +68,8 @@ var overrides = require('./core/server/overrides'), } }, express: { - files: ['core/ghost-server.js', 'core/server/**/*.js', 'config.*.json', '!config.testing.json'], - tasks: ['express:dev'], + files: ['core/ghost-server.js', 'core/server/**/*.js', 'config.*.json', '!config.testing.json'], + tasks: ['express:dev'], options: { nospawn: true, livereload: true @@ -95,42 +95,31 @@ var overrides = require('./core/server/overrides'), } }, - // ### grunt-contrib-jshint + // ### grunt-eslint // Linting rules, run as part of `grunt validate`. See [grunt validate](#validate) and its subtasks for // more information. - jshint: { - options: { - jshintrc: '.jshintrc' - }, - - server: [ - '*.js', - '!config.*.json', // note: i added this, do we want this linted? - 'core/*.js', - 'core/server/**/*.js', - 'core/test/**/*.js', - '!core/test/coverage/**', - '!core/server/public/**/*.js' - ] - }, - - jscs: { - options: { - config: true - }, - + eslint: { server: { - files: { - src: [ - '*.js', - '!config.*.json', // note: i added this, do we want this linted? - 'core/*.js', - 'core/server/**/*.js', - 'core/test/**/*.js', - '!core/test/coverage/**', - '!core/server/public/**/*.js' - ] - } + options: { + config: '.eslintrc.json' + }, + src: [ + '*.js', + 'core/*.js', + 'core/server/*.js', + 'core/server/**/*.js', + '!core/server/public/**/*.js' + ] + }, + test: { + options: { + config: './core/test/.eslintrc.json' + }, + src: [ + 'core/test/*.js', + 'core/test/**/*.js', + '!core/test/coverage/**' + ] } }, @@ -403,7 +392,7 @@ var overrides = require('./core/server/overrides'), grunt.registerTask('help', 'Outputs help information if you type `grunt help` instead of `grunt --help`', function () { - console.log('Type `grunt --help` to get the details of available grunt tasks.'); + grunt.log.writeln('Type `grunt --help` to get the details of available grunt tasks.'); }); // ### Documentation @@ -516,9 +505,9 @@ var overrides = require('./core/server/overrides'), // ### Lint // - // `grunt lint` will run the linter and the code style checker so you can make sure your code is pretty - grunt.registerTask('lint', 'Run the code style checks and linter for server', - ['jshint', 'jscs'] + // `grunt lint` will run the linter + grunt.registerTask('lint', 'Run the code style checks for server & tests', + ['eslint'] ); // ### test-setup *(utility)( @@ -630,11 +619,11 @@ var overrides = require('./core/server/overrides'), grunt.registerTask('master-warn', 'Outputs a warning to runners of grunt prod, that master shouldn\'t be used for live blogs', function () { - console.log(chalk.red( + grunt.log.writeln(chalk.red( 'Use the ' + chalk.bold('stable') + ' branch for live blogs. ' + chalk.bold.underline('Never') + ' master!' )); - console.log('>', 'Always two there are, no more, no less. A master and a ' + chalk.bold('stable') + '.'); + grunt.log.writeln('>', 'Always two there are, no more, no less. A master and a ' + chalk.bold('stable') + '.'); }); // ## Building assets diff --git a/core/server/adapters/scheduling/utils.js b/core/server/adapters/scheduling/utils.js index 73b5eb3a91..f53d3c756d 100644 --- a/core/server/adapters/scheduling/utils.js +++ b/core/server/adapters/scheduling/utils.js @@ -40,9 +40,8 @@ exports.createAdapter = function (options) { // CASE: only throw error if module does exist if (err.code !== 'MODULE_NOT_FOUND') { return Promise.reject(new errors.IncorrectUsageError({err: err})); - } // CASE: if module not found it can be an error within the adapter (cannot find bluebird for example) - else if (err.code === 'MODULE_NOT_FOUND' && err.message.indexOf(contentPath + activeAdapter) === -1) { + } else if (err.code === 'MODULE_NOT_FOUND' && err.message.indexOf(contentPath + activeAdapter) === -1) { return Promise.reject(new errors.IncorrectUsageError({err: err, help: 'Please check the imports are valid in ' + contentPath + activeAdapter})); } } diff --git a/core/server/adapters/storage/LocalFileStorage.js b/core/server/adapters/storage/LocalFileStorage.js index 00ba700aa0..44c1774717 100644 --- a/core/server/adapters/storage/LocalFileStorage.js +++ b/core/server/adapters/storage/LocalFileStorage.js @@ -1,5 +1,3 @@ -// jscs:disable requireMultipleVarDecl - 'use strict'; // # Local File System Image Storage module @@ -18,7 +16,6 @@ var serveStatic = require('express').static, StorageBase = require('ghost-storage-base'); class LocalFileStore extends StorageBase { - constructor() { super(); diff --git a/core/server/adapters/storage/index.js b/core/server/adapters/storage/index.js index abc5203b11..7ceafb3c1e 100644 --- a/core/server/adapters/storage/index.js +++ b/core/server/adapters/storage/index.js @@ -37,16 +37,14 @@ function getStorage() { help: 'Add \'use strict\'; on top of your adapter.', err: err }); - } // CASE: if module not found it can be an error within the adapter (cannot find bluebird for example) - else if (err.code === 'MODULE_NOT_FOUND' && err.message.indexOf(config.getContentPath('storage') + storageChoice) === -1) { + } else if (err.code === 'MODULE_NOT_FOUND' && err.message.indexOf(config.getContentPath('storage') + storageChoice) === -1) { throw new errors.IncorrectUsageError({ message: 'We have detected an error in your custom storage adapter.', err: err }); - } // CASE: only throw error if module does exist - else if (err.code !== 'MODULE_NOT_FOUND') { + } else if (err.code !== 'MODULE_NOT_FOUND') { throw new errors.IncorrectUsageError({ message: 'We have detected an unknown error in your custom storage adapter.', err: err diff --git a/core/server/admin/controller.js b/core/server/admin/controller.js index 23c3dba7b2..b5ab4950bd 100644 --- a/core/server/admin/controller.js +++ b/core/server/admin/controller.js @@ -11,7 +11,6 @@ var debug = require('ghost-ignition').debug('admin:controller'), // Path: /ghost/ // Method: GET module.exports = function adminController(req, res) { - /*jslint unparam:true*/ debug('index called'); updateCheck().then(function then() { @@ -27,7 +26,11 @@ module.exports = function adminController(req, res) { location: 'upgrade.new-version-available', dismissible: false, message: i18n.t('notices.controllers.newVersionAvailable', - {version: updateVersion, link: 'Click here'})}; + { + version: updateVersion, + link: 'Click here' + }) + }; return api.notifications.browse({context: {internal: true}}).then(function then(results) { if (!_.some(results.notifications, {message: notification.message})) { diff --git a/core/server/admin/serviceworker.js b/core/server/admin/serviceworker.js index 65fc56ce26..1224040a29 100644 --- a/core/server/admin/serviceworker.js +++ b/core/server/admin/serviceworker.js @@ -5,7 +5,6 @@ var debug = require('ghost-ignition').debug('admin:serviceworker'), // Path: /ghost/sw.js|sw-registration.js // Method: GET module.exports = function adminController(req, res) { - /*jslint unparam:true*/ debug('serviceworker called'); var sw = path.join(__dirname, '..', '..', 'built', 'assets', 'sw.js'), diff --git a/core/server/api/configuration.js b/core/server/api/configuration.js index 282ae5b239..75c4040245 100644 --- a/core/server/api/configuration.js +++ b/core/server/api/configuration.js @@ -25,11 +25,11 @@ function getAboutConfig() { function getBaseConfig() { return { - useGravatar: !config.isPrivacyDisabled('useGravatar'), - publicAPI: config.get('publicAPI') === true, - blogUrl: apiUtils.url.urlFor('home', true), - blogTitle: settingsCache.get('title'), - routeKeywords: config.get('routeKeywords'), + useGravatar: !config.isPrivacyDisabled('useGravatar'), + publicAPI: config.get('publicAPI') === true, + blogUrl: apiUtils.url.urlFor('home', true), + blogTitle: settingsCache.get('title'), + routeKeywords: config.get('routeKeywords'), clientExtensions: config.get('clientExtensions') }; } diff --git a/core/server/api/db.js b/core/server/api/db.js index ccae26efb9..dca06453db 100644 --- a/core/server/api/db.js +++ b/core/server/api/db.js @@ -123,9 +123,9 @@ db = { return Promise.each(collections, function then(Collection) { return Collection.invokeThen('destroy', queryOpts); }).return({db: []}) - .catch(function (err) { - throw new errors.GhostError({err: err}); - }); + .catch(function (err) { + throw new errors.GhostError({err: err}); + }); } tasks = [ diff --git a/core/server/api/notifications.js b/core/server/api/notifications.js index ad964abde3..ecd3f0dfea 100644 --- a/core/server/api/notifications.js +++ b/core/server/api/notifications.js @@ -93,7 +93,7 @@ notifications = { id: ObjectId.generate() }); - existingNotification = _.find(notificationsStore, {message:notification.message}); + existingNotification = _.find(notificationsStore, {message: notification.message}); if (!existingNotification) { notificationsStore.push(notification); diff --git a/core/server/api/schedules.js b/core/server/api/schedules.js index 0a64024559..7617127ab3 100644 --- a/core/server/api/schedules.js +++ b/core/server/api/schedules.js @@ -59,8 +59,10 @@ exports.publishPost = function publishPost(object, options) { return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.api.job.publishInThePast')})); } - return postsAPI.edit({ - posts: [{status: 'published'}]}, + return postsAPI.edit( + { + posts: [{status: 'published'}] + }, _.pick(cleanOptions, ['context', 'id', 'transacting', 'forUpdate', 'opts']) ); }); diff --git a/core/server/api/settings.js b/core/server/api/settings.js index c9303df409..fe1cdb3257 100644 --- a/core/server/api/settings.js +++ b/core/server/api/settings.js @@ -10,8 +10,9 @@ var Promise = require('bluebird'), settingsCache = require('../settings/cache'), docName = 'settings', settings, + settingsFilter, settingsResult, - canEditAllSettings, + canEditAllSettings; // ## Helpers diff --git a/core/server/apps/amp/lib/helpers/amp_content.js b/core/server/apps/amp/lib/helpers/amp_content.js index 5b376034d6..31ad68ac7e 100644 --- a/core/server/apps/amp/lib/helpers/amp_content.js +++ b/core/server/apps/amp/lib/helpers/amp_content.js @@ -25,26 +25,26 @@ var Promise = require('bluebird'), ampHTML; allowedAMPTags = ['html', 'body', 'article', 'section', 'nav', 'aside', 'h1', 'h2', - 'h3', 'h4', 'h5', 'h6', 'header', 'footer', 'address', 'p', 'hr', - 'pre', 'blockquote', 'ol', 'ul', 'li', 'dl', 'dt', 'dd', 'figure', - 'figcaption', 'div', 'main', 'a', 'em', 'strong', 'small', 's', 'cite', - 'q', 'dfn', 'abbr', 'data', 'time', 'code', 'var', 'samp', 'kbd', 'sub', - 'sup', 'i', 'b', 'u', 'mark', 'ruby', 'rb', 'rt', 'rtc', 'rp', 'bdi', - 'bdo', 'span', 'br', 'wbr', 'ins', 'del', 'source', 'track', 'svg', 'g', - 'path', 'glyph', 'glyphref', 'marker', 'view', 'circle', 'line', 'polygon', - 'polyline', 'rect', 'text', 'textpath', 'tref', 'tspan', 'clippath', - 'filter', 'lineargradient', 'radialgradient', 'mask', 'pattern', 'vkern', - 'hkern', 'defs', 'stop', 'use', 'foreignobject', 'symbol', 'desc', 'title', - 'table', 'caption', 'colgroup', 'col', 'tbody', 'thead', 'tfoot', 'tr', 'td', - 'th', 'button', 'noscript', 'acronym', 'center', 'dir', 'hgroup', 'listing', - 'multicol', 'nextid', 'nobr', 'spacer', 'strike', 'tt', 'xmp', 'amp-img', - 'amp-video', 'amp-ad', 'amp-embed', 'amp-anim', 'amp-iframe', 'amp-pixel', - 'amp-audio', 'O:P']; + 'h3', 'h4', 'h5', 'h6', 'header', 'footer', 'address', 'p', 'hr', + 'pre', 'blockquote', 'ol', 'ul', 'li', 'dl', 'dt', 'dd', 'figure', + 'figcaption', 'div', 'main', 'a', 'em', 'strong', 'small', 's', 'cite', + 'q', 'dfn', 'abbr', 'data', 'time', 'code', 'var', 'samp', 'kbd', 'sub', + 'sup', 'i', 'b', 'u', 'mark', 'ruby', 'rb', 'rt', 'rtc', 'rp', 'bdi', + 'bdo', 'span', 'br', 'wbr', 'ins', 'del', 'source', 'track', 'svg', 'g', + 'path', 'glyph', 'glyphref', 'marker', 'view', 'circle', 'line', 'polygon', + 'polyline', 'rect', 'text', 'textpath', 'tref', 'tspan', 'clippath', + 'filter', 'lineargradient', 'radialgradient', 'mask', 'pattern', 'vkern', + 'hkern', 'defs', 'stop', 'use', 'foreignobject', 'symbol', 'desc', 'title', + 'table', 'caption', 'colgroup', 'col', 'tbody', 'thead', 'tfoot', 'tr', 'td', + 'th', 'button', 'noscript', 'acronym', 'center', 'dir', 'hgroup', 'listing', + 'multicol', 'nextid', 'nobr', 'spacer', 'strike', 'tt', 'xmp', 'amp-img', + 'amp-video', 'amp-ad', 'amp-embed', 'amp-anim', 'amp-iframe', 'amp-pixel', + 'amp-audio', 'O:P']; allowedAMPAttributes = { '*': ['itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype', 'accesskey', 'class', 'dir', 'draggable', - 'id', 'lang', 'tabindex', 'title', 'translate', 'aria-*', 'role', 'placeholder', 'fallback', 'lightbox', - 'overflow', 'amp-access', 'amp-access-*', 'i-amp-access-id'], + 'id', 'lang', 'tabindex', 'title', 'translate', 'aria-*', 'role', 'placeholder', 'fallback', 'lightbox', + 'overflow', 'amp-access', 'amp-access-*', 'i-amp-access-id'], h1: ['align'], h2: ['align'], h3: ['align'], @@ -105,14 +105,14 @@ allowedAMPAttributes = { 'amp-img': ['media', 'noloading', 'alt', 'attribution', 'placeholder', 'src', 'srcset', 'width', 'height', 'layout'], 'amp-pixel': ['src'], 'amp-video': ['src', 'srcset', 'media', 'noloading', 'width', 'height', 'layout', 'alt', 'attribution', - 'autoplay', 'controls', 'loop', 'muted', 'poster', 'preload'], + 'autoplay', 'controls', 'loop', 'muted', 'poster', 'preload'], 'amp-embed': ['media', 'noloading', 'width', 'height', 'layout', 'type', 'data-*', 'json'], 'amp-ad': ['media', 'noloading', 'width', 'height', 'layout', 'type', 'data-*', 'json'], // extended components we support 'amp-anim': ['media', 'noloading', 'alt', 'attribution', 'placeholder', 'src', 'srcset', 'width', 'height', 'layout'], 'amp-audio': ['src', 'width', 'height', 'autoplay', 'loop', 'muted', 'controls'], 'amp-iframe': ['src', 'srcdoc', 'width', 'height', 'layout', 'frameborder', 'allowfullscreen', 'allowtransparency', - 'sandbox', 'referrerpolicy'] + 'sandbox', 'referrerpolicy'] }; function getAmperizeHTML(html, post) { diff --git a/core/server/apps/default-cards/cards/html.js b/core/server/apps/default-cards/cards/html.js index 57a2126b93..c78c73f264 100644 --- a/core/server/apps/default-cards/cards/html.js +++ b/core/server/apps/default-cards/cards/html.js @@ -1,12 +1,12 @@ -var SimpleDom = require('simple-dom'), - tokenizer = require('simple-html-tokenizer').tokenize, +var SimpleDom = require('simple-dom'), + tokenizer = require('simple-html-tokenizer').tokenize, parser; module.exports = { - name: 'card-html', - type: 'dom', - render(opts) { - parser = new SimpleDom.HTMLParser(tokenizer, opts.env.dom, SimpleDom.voidMap); - return parser.parse('
' + opts.payload.html + '
'); - } - }; + name: 'card-html', + type: 'dom', + render(opts) { + parser = new SimpleDom.HTMLParser(tokenizer, opts.env.dom, SimpleDom.voidMap); + return parser.parse('
' + opts.payload.html + '
'); + } +}; diff --git a/core/server/apps/default-cards/cards/markdown.js b/core/server/apps/default-cards/cards/markdown.js index bc52384fd6..f0b382b51b 100644 --- a/core/server/apps/default-cards/cards/markdown.js +++ b/core/server/apps/default-cards/cards/markdown.js @@ -1,19 +1,19 @@ module.exports = { - name: 'card-markdown', - type: 'dom', - render: function (opts) { - var markdownConverter = require('../../../utils/markdown-converter'), - html, element; + name: 'card-markdown', + type: 'dom', + render: function (opts) { + var markdownConverter = require('../../../utils/markdown-converter'), + html, element; - // convert markdown to HTML ready for insertion into dom - html = '
' - + markdownConverter.render(opts.payload.markdown || '') - + '
'; + // convert markdown to HTML ready for insertion into dom + html = '
' + + markdownConverter.render(opts.payload.markdown || '') + + '
'; - // use the SimpleDOM document to create a raw HTML section. - // avoids parsing/rendering of potentially broken or unsupported HTML - element = opts.env.dom.createRawHTMLSection(html); + // use the SimpleDOM document to create a raw HTML section. + // avoids parsing/rendering of potentially broken or unsupported HTML + element = opts.env.dom.createRawHTMLSection(html); - return element; - } - }; + return element; + } +}; diff --git a/core/server/apps/private-blogging/lib/helpers/input_password.js b/core/server/apps/private-blogging/lib/helpers/input_password.js index 3e8bd18ddb..46028fb588 100644 --- a/core/server/apps/private-blogging/lib/helpers/input_password.js +++ b/core/server/apps/private-blogging/lib/helpers/input_password.js @@ -2,16 +2,14 @@ // Usage: `{{input_password}}` // // Password input used on private.hbs for password-protected blogs -// -// We use the name input_password to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers // (less) dirty requires var proxy = require('../../../../helpers/proxy'), SafeString = proxy.SafeString, templates = proxy.templates; -module.exports = function input_password(options) { +// We use the name input_password to match the helper for consistency: +module.exports = function input_password(options) { // eslint-disable-line camelcase options = options || {}; options.hash = options.hash || {}; diff --git a/core/server/apps/subscribers/lib/helpers/input_email.js b/core/server/apps/subscribers/lib/helpers/input_email.js index b6343d4edc..1c5327d162 100644 --- a/core/server/apps/subscribers/lib/helpers/input_email.js +++ b/core/server/apps/subscribers/lib/helpers/input_email.js @@ -2,16 +2,14 @@ // Usage: `{{input_email}}` // // Used by `{{subscribe_form}}` -// -// We use the name input_email to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers // (less) dirty requires var proxy = require('../../../../helpers/proxy'), SafeString = proxy.SafeString, templates = proxy.templates; -module.exports = function input_email(options) { +// We use the name input_email to match the helper for consistency: +module.exports = function input_email(options) { // eslint-disable-line camelcase options = options || {}; options.hash = options.hash || {}; diff --git a/core/server/apps/subscribers/lib/helpers/subscribe_form.js b/core/server/apps/subscribers/lib/helpers/subscribe_form.js index 92ceff3b02..d9e1da46f7 100644 --- a/core/server/apps/subscribers/lib/helpers/subscribe_form.js +++ b/core/server/apps/subscribers/lib/helpers/subscribe_form.js @@ -1,8 +1,5 @@ // # Subscribe Form Helper // Usage: `{{subscribe_form}}` -// -// We use the name subscribe_form to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers var _ = require('lodash'), // (Less) dirty requires @@ -38,7 +35,8 @@ subscribeScript = '})(window,document,\'querySelector\',\'value\');' + ''; -module.exports = function subscribe_form(options) { +// We use the name subscribe_form to match the helper for consistency: +module.exports = function subscribe_form(options) { // eslint-disable-line camelcase var root = options.data.root, data = _.merge({}, options.hash, _.pick(root, params), { action: url.urlJoin('/', url.getSubdir(), config.get('routeKeywords').subscribe, '/'), diff --git a/core/server/apps/subscribers/lib/router.js b/core/server/apps/subscribers/lib/router.js index 5927f1df3c..64485dbaea 100644 --- a/core/server/apps/subscribers/lib/router.js +++ b/core/server/apps/subscribers/lib/router.js @@ -29,8 +29,6 @@ function controller(req, res) { * For success cases, we don't have to worry, because then the input contained a valid email address. */ function errorHandler(error, req, res, next) { - /*jshint unused:false */ - req.body.email = ''; if (error.statusCode !== 404) { diff --git a/core/server/controllers/frontend/fetch-data.js b/core/server/controllers/frontend/fetch-data.js index d6fd6b5a72..8d11bb3933 100644 --- a/core/server/controllers/frontend/fetch-data.js +++ b/core/server/controllers/frontend/fetch-data.js @@ -86,7 +86,7 @@ function processQuery(query, slugParam) { function fetchData(channelOptions) { // @TODO improve this further var pageOptions = channelOptions.isRSS ? - {options: channelOptions.postOptions} : fetchPostsPerPage(channelOptions.postOptions), + {options: channelOptions.postOptions} : fetchPostsPerPage(channelOptions.postOptions), postQuery, props = {}; diff --git a/core/server/data/importer/handlers/json.js b/core/server/data/importer/handlers/json.js index 28870dd117..2b1284c02a 100644 --- a/core/server/data/importer/handlers/json.js +++ b/core/server/data/importer/handlers/json.js @@ -11,8 +11,7 @@ JSONHandler = { contentTypes: ['application/octet-stream', 'application/json'], directories: [], - loadFile: function (files, startDir) { - /*jshint unused:false */ + loadFile: function (files, startDir) { // eslint-disable-line no-unused-vars // @TODO: Handle multiple JSON files var filePath = files[0].path; diff --git a/core/server/data/importer/handlers/markdown.js b/core/server/data/importer/handlers/markdown.js index 38fb3768e5..5dd09dfdda 100644 --- a/core/server/data/importer/handlers/markdown.js +++ b/core/server/data/importer/handlers/markdown.js @@ -87,7 +87,6 @@ MarkdownHandler = { directories: [], loadFile: function (files, startDir) { - /*jshint unused:false */ var startDirRegex = startDir ? new RegExp('^' + startDir + '/') : new RegExp(''), posts = [], ops = []; diff --git a/core/server/data/importer/importers/data/posts.js b/core/server/data/importer/importers/data/posts.js index 6a2cfa157e..b60f0891b1 100644 --- a/core/server/data/importer/importers/data/posts.js +++ b/core/server/data/importer/importers/data/posts.js @@ -132,8 +132,8 @@ class PostsImporter extends BaseImporter { version: '0.3.1', markups: [], atoms: [], - cards: [['card-markdown',{cardName: 'card-markdown',markdown: mobileDocContent}]], - sections:[[10,0]] + cards: [['card-markdown', {cardName: 'card-markdown', markdown: mobileDocContent}]], + sections: [[10, 0]] }); } } diff --git a/core/server/data/meta/excerpt.js b/core/server/data/meta/excerpt.js index f6e31584bb..eb4f6c2043 100644 --- a/core/server/data/meta/excerpt.js +++ b/core/server/data/meta/excerpt.js @@ -8,7 +8,6 @@ function getExcerpt(html, truncateOptions) { // Strip other html excerpt = excerpt.replace(/<\/?[^>]+>/gi, ''); excerpt = excerpt.replace(/(\r\n|\n|\r)+/gm, ' '); - /*jslint regexp:false */ if (!truncateOptions.words && !truncateOptions.characters) { truncateOptions.words = 50; diff --git a/core/server/data/meta/index.js b/core/server/data/meta/index.js index 8605f681ae..989dbead61 100644 --- a/core/server/data/meta/index.js +++ b/core/server/data/meta/index.js @@ -28,50 +28,50 @@ var Promise = require('bluebird'), function getMetaData(data, root) { var metaData = { - url: getUrl(data, true), - canonicalUrl: getCanonicalUrl(data), - ampUrl: getAmpUrl(data), - previousUrl: getPaginatedUrl('prev', data, true), - nextUrl: getPaginatedUrl('next', data, true), - authorUrl: getAuthorUrl(data, true), - rssUrl: getRssUrl(data, true), - metaTitle: getTitle(data, root), - metaDescription: getDescription(data, root) || null, - coverImage: { - url: getCoverImage(data, true) + url: getUrl(data, true), + canonicalUrl: getCanonicalUrl(data), + ampUrl: getAmpUrl(data), + previousUrl: getPaginatedUrl('prev', data, true), + nextUrl: getPaginatedUrl('next', data, true), + authorUrl: getAuthorUrl(data, true), + rssUrl: getRssUrl(data, true), + metaTitle: getTitle(data, root), + metaDescription: getDescription(data, root) || null, + coverImage: { + url: getCoverImage(data, true) + }, + authorImage: { + url: getAuthorImage(data, true) + }, + ogImage: { + url: getOgImage(data, true) + }, + ogTitle: getTitle(data, root, {property: 'og'}), + ogDescription: getDescription(data, root, {property: 'og'}), + twitterImage: getTwitterImage(data, true), + twitterTitle: getTitle(data, root, {property: 'twitter'}), + twitterDescription: getDescription(data, root, {property: 'twitter'}), + authorFacebook: getAuthorFacebook(data), + creatorTwitter: getCreatorTwitter(data), + keywords: getKeywords(data), + publishedDate: getPublishedDate(data), + modifiedDate: getModifiedDate(data), + ogType: getOgType(data), + // @TODO: pass into each meta helper - wrap each helper + blog: { + title: settingsCache.get('title'), + description: settingsCache.get('description'), + url: utils.url.urlFor('home', true), + facebook: settingsCache.get('facebook'), + twitter: settingsCache.get('twitter'), + timezone: settingsCache.get('active_timezone'), + navigation: settingsCache.get('navigation'), + icon: settingsCache.get('icon'), + cover_image: settingsCache.get('cover_image'), + logo: getBlogLogo(), + amp: settingsCache.get('amp') + } }, - authorImage: { - url: getAuthorImage(data, true) - }, - ogImage: { - url: getOgImage(data, true) - }, - ogTitle: getTitle(data, root, {property: 'og'}), - ogDescription: getDescription(data, root, {property: 'og'}), - twitterImage: getTwitterImage(data, true), - twitterTitle: getTitle(data, root, {property: 'twitter'}), - twitterDescription: getDescription(data, root, {property: 'twitter'}), - authorFacebook: getAuthorFacebook(data), - creatorTwitter: getCreatorTwitter(data), - keywords: getKeywords(data), - publishedDate: getPublishedDate(data), - modifiedDate: getModifiedDate(data), - ogType: getOgType(data), - // @TODO: pass into each meta helper - wrap each helper - blog: { - title: settingsCache.get('title'), - description: settingsCache.get('description'), - url: utils.url.urlFor('home', true), - facebook: settingsCache.get('facebook'), - twitter: settingsCache.get('twitter'), - timezone: settingsCache.get('active_timezone'), - navigation: settingsCache.get('navigation'), - icon: settingsCache.get('icon'), - cover_image: settingsCache.get('cover_image'), - logo: getBlogLogo(), - amp: settingsCache.get('amp') - } - }, customExcerpt, metaDescription, fallbackExcerpt; diff --git a/core/server/data/meta/paginated_url.js b/core/server/data/meta/paginated_url.js index 838f9e57bd..bd1a770f2e 100644 --- a/core/server/data/meta/paginated_url.js +++ b/core/server/data/meta/paginated_url.js @@ -1,4 +1,4 @@ -var _ = require('lodash'), +var _ = require('lodash'), config = require('../../config'), utils = require('../../utils'); @@ -30,7 +30,7 @@ function getPaginatedUrl(page, data, absolute) { // baseUrl can be undefined, if there was nothing preceding the pagePath (e.g. first page of the index channel) newRelativeUrl = baseUrl ? utils.url.urlJoin(baseUrl, newRelativeUrl) : newRelativeUrl; - return utils.url.urlFor({relativeUrl: newRelativeUrl, secure: data.secure}, absolute); + return utils.url.urlFor({relativeUrl: newRelativeUrl, secure: data.secure}, absolute); } module.exports = getPaginatedUrl; diff --git a/core/server/data/meta/schema.js b/core/server/data/meta/schema.js index ad5d1c842a..3ad9ceffcb 100644 --- a/core/server/data/meta/schema.js +++ b/core/server/data/meta/schema.js @@ -84,8 +84,8 @@ function getPostSchema(metaData, data) { url: metaData.authorUrl, sameAs: trimSameAs(data, 'post'), description: data.post.author.metaDescription ? - escapeExpression(data.post.author.metaDescription) : - null + escapeExpression(data.post.author.metaDescription) : + null }, headline: escapeExpression(metaData.metaTitle), url: metaData.url, @@ -120,8 +120,8 @@ function getHomeSchema(metaData) { '@id': metaData.blog.url || null }, description: metaData.metaDescription ? - escapeExpression(metaData.metaDescription) : - null + escapeExpression(metaData.metaDescription) : + null }; return trimSchema(schema); } @@ -143,8 +143,8 @@ function getTagSchema(metaData, data) { '@id': metaData.blog.url || null }, description: metaData.metaDescription ? - escapeExpression(metaData.metaDescription) : - null + escapeExpression(metaData.metaDescription) : + null }; return trimSchema(schema); @@ -163,8 +163,8 @@ function getAuthorSchema(metaData, data) { '@id': metaData.blog.url || null }, description: metaData.metaDescription ? - escapeExpression(metaData.metaDescription) : - null + escapeExpression(metaData.metaDescription) : + null }; return trimSchema(schema); diff --git a/core/server/data/schema/clients/index.js b/core/server/data/schema/clients/index.js index dbc17f11cf..d19923a4dc 100644 --- a/core/server/data/schema/clients/index.js +++ b/core/server/data/schema/clients/index.js @@ -1,5 +1,5 @@ var sqlite3 = require('./sqlite3'), - mysql = require('./mysql'); + mysql = require('./mysql'); module.exports = { sqlite3: sqlite3, diff --git a/core/server/data/schema/clients/mysql.js b/core/server/data/schema/clients/mysql.js index e91ad58576..9424c4882f 100644 --- a/core/server/data/schema/clients/mysql.js +++ b/core/server/data/schema/clients/mysql.js @@ -1,4 +1,4 @@ -var _ = require('lodash'), +var _ = require('lodash'), db = require('../../../data/db'), // private @@ -18,7 +18,9 @@ doRawAndFlatten = function doRaw(query, transaction, flattenFn) { getTables = function getTables(transaction) { return doRawAndFlatten('show tables', transaction, function (response) { - return _.map(response[0], function (entry) { return _.values(entry); }); + return _.map(response[0], function (entry) { + return _.values(entry); + }); }); }; @@ -50,7 +52,7 @@ checkPostTable = function checkPostTable(transaction) { module.exports = { checkPostTable: checkPostTable, - getTables: getTables, + getTables: getTables, getIndexes: getIndexes, getColumns: getColumns }; diff --git a/core/server/data/schema/clients/pg.js b/core/server/data/schema/clients/pg.js index 2b67828e9d..b9671f733c 100644 --- a/core/server/data/schema/clients/pg.js +++ b/core/server/data/schema/clients/pg.js @@ -1,4 +1,4 @@ -var _ = require('lodash'), +var _ = require('lodash'), db = require('../../../data/db'), // private @@ -39,7 +39,7 @@ getColumns = function getColumns(table, transaction) { }; module.exports = { - getTables: getTables, + getTables: getTables, getIndexes: getIndexes, getColumns: getColumns }; diff --git a/core/server/data/schema/clients/sqlite3.js b/core/server/data/schema/clients/sqlite3.js index 3920c17b0e..f869ee2e4b 100644 --- a/core/server/data/schema/clients/sqlite3.js +++ b/core/server/data/schema/clients/sqlite3.js @@ -1,4 +1,4 @@ -var _ = require('lodash'), +var _ = require('lodash'), db = require('../../../data/db'), // private @@ -41,7 +41,7 @@ getColumns = function getColumns(table, transaction) { }; module.exports = { - getTables: getTables, + getTables: getTables, getIndexes: getIndexes, getColumns: getColumns }; diff --git a/core/server/data/validation/index.js b/core/server/data/validation/index.js index fcc93d8c4e..e79bc8e3bf 100644 --- a/core/server/data/validation/index.js +++ b/core/server/data/validation/index.js @@ -46,7 +46,6 @@ function characterOccurance(stringToTest) { _.forIn(chars, function (charCount) { if (charCount >= allowedOccurancy) { valid = false; - return; } }); @@ -98,15 +97,15 @@ validatePassword = function validatePassword(password, email, blogTitle) { disallowedPasswords = ['password', 'ghost', 'passw0rd'], blogUrl = utils.urlFor('home', true), badPasswords = [ - '1234567890', - 'qwertyuiop', - 'qwertzuiop', - 'asdfghjkl;', - 'abcdefghij', - '0987654321', - '1q2w3e4r5t', - '12345asdfg' - ]; + '1234567890', + 'qwertyuiop', + 'qwertzuiop', + 'asdfghjkl;', + 'abcdefghij', + '0987654321', + '1q2w3e4r5t', + '12345asdfg' + ]; blogTitle = blogTitle ? blogTitle : settingsCache.get('title'); blogUrl = blogUrl.replace(/^http(s?):\/\//, ''); @@ -195,21 +194,34 @@ validateSchema = function validateSchema(tableName, model) { if (schema[tableName][columnKey].hasOwnProperty('maxlength')) { if (!validator.isLength(strVal, 0, schema[tableName][columnKey].maxlength)) { message = i18n.t('notices.data.validation.index.valueExceedsMaxLength', - {tableName: tableName, columnKey: columnKey, maxlength: schema[tableName][columnKey].maxlength}); - validationErrors.push(new errors.ValidationError({message: message, context: tableName + '.' + columnKey})); + { + tableName: tableName, + columnKey: columnKey, + maxlength: schema[tableName][columnKey].maxlength + }); + validationErrors.push(new errors.ValidationError({ + message: message, + context: tableName + '.' + columnKey + })); } } // check validations objects - if (schema[tableName][columnKey].hasOwnProperty('validations')) { + if (schema[tableName][columnKey].hasOwnProperty('validations')) { validationErrors = validationErrors.concat(validate(strVal, columnKey, schema[tableName][columnKey].validations)); } // check type - if (schema[tableName][columnKey].hasOwnProperty('type')) { + if (schema[tableName][columnKey].hasOwnProperty('type')) { if (schema[tableName][columnKey].type === 'integer' && !validator.isInt(strVal)) { - message = i18n.t('notices.data.validation.index.valueIsNotInteger', {tableName: tableName, columnKey: columnKey}); - validationErrors.push(new errors.ValidationError({message: message, context: tableName + '.' + columnKey})); + message = i18n.t('notices.data.validation.index.valueIsNotInteger', { + tableName: tableName, + columnKey: columnKey + }); + validationErrors.push(new errors.ValidationError({ + message: message, + context: tableName + '.' + columnKey + })); } } } diff --git a/core/server/errors.js b/core/server/errors.js index bb5964aa7f..23d53d55e8 100644 --- a/core/server/errors.js +++ b/core/server/errors.js @@ -9,7 +9,6 @@ function GhostError(options) { errors.IgnitionError.call(this, options); } -// jscs:disable var ghostErrors = { DataExportError: function DataExportError(options) { GhostError.call(this, _.merge({ @@ -58,13 +57,13 @@ var ghostErrors = { DisabledFeatureError: function DisabledFeatureError(options) { GhostError.call(this, _.merge({ statusCode: 409, - errorType: 'DisabledFeatureError', + errorType: 'DisabledFeatureError' }, options)); }, UpdateCollisionError: function UpdateCollisionError(options) { GhostError.call(this, _.merge({ statusCode: 409, - errorType: 'UpdateCollisionError', + errorType: 'UpdateCollisionError' }, options)); } }; diff --git a/core/server/helpers/body_class.js b/core/server/helpers/body_class.js index 3718ef45f1..b5ca80ee7e 100644 --- a/core/server/helpers/body_class.js +++ b/core/server/helpers/body_class.js @@ -2,15 +2,12 @@ // Usage: `{{body_class}}` // // Output classes for the body element -// -// We use the name body_class to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers - var proxy = require('./proxy'), _ = require('lodash'), SafeString = proxy.SafeString; -module.exports = function body_class(options) { +// We use the name body_class to match the helper for consistency: +module.exports = function body_class(options) { // eslint-disable-line camelcase var classes = [], context = options.data.root.context, post = this.post, diff --git a/core/server/helpers/facebook_url.js b/core/server/helpers/facebook_url.js index 0d1bd101d3..e3eefcfade 100644 --- a/core/server/helpers/facebook_url.js +++ b/core/server/helpers/facebook_url.js @@ -2,15 +2,12 @@ // Usage: `{{facebook_url}}` or `{{facebook_url author.facebook}}` // // Output a url for a twitter username -// -// We use the name facebook_url to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers - var proxy = require('./proxy'), socialUrls = proxy.socialUrls, findKey = proxy.utils.findKey; -module.exports = function facebook_url(username, options) { +// We use the name facebook_url to match the helper for consistency: +module.exports = function facebook_url(username, options) { // eslint-disable-line camelcase if (!options) { options = username; username = findKey('facebook', this, options.data.blog); diff --git a/core/server/helpers/foreach.js b/core/server/helpers/foreach.js index 7a18f9208a..39b3b3dcb0 100644 --- a/core/server/helpers/foreach.js +++ b/core/server/helpers/foreach.js @@ -71,15 +71,14 @@ module.exports = function foreach(items, options) { } output = output + fn(items[field], { - data: data, - blockParams: hbsUtils.blockParams([items[field], field], [contextPath + field, null]) - }); + data: data, + blockParams: hbsUtils.blockParams([items[field], field], [contextPath + field, null]) + }); } function iterateCollection(context) { // Context is all posts on the blog - var count = 1, - current = 1; + var current = 1; // For each post, if it is a post number that fits within the from and to // send the key to execIteration to set to be added to the page @@ -92,7 +91,6 @@ module.exports = function foreach(items, options) { if (current <= to) { execIteration(key, current - 1, current === to); } - count += 1; current += 1; }); } diff --git a/core/server/helpers/ghost_foot.js b/core/server/helpers/ghost_foot.js index f11ee4dde4..5e0f45e4a1 100644 --- a/core/server/helpers/ghost_foot.js +++ b/core/server/helpers/ghost_foot.js @@ -2,16 +2,14 @@ // Usage: `{{ghost_foot}}` // // Outputs scripts and other assets at the bottom of a Ghost theme -// -// We use the name ghost_foot to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers var proxy = require('./proxy'), _ = require('lodash'), SafeString = proxy.SafeString, filters = proxy.filters, settingsCache = proxy.settingsCache; -module.exports = function ghost_foot(options) { +// We use the name ghost_foot to match the helper for consistency: +module.exports = function ghost_foot(options) { // eslint-disable-line camelcase var foot = [], globalCodeinjection = settingsCache.get('ghost_foot'), postCodeinjection = options.data.root && options.data.root.post ? options.data.root.post.codeinjection_foot : null; diff --git a/core/server/helpers/ghost_head.js b/core/server/helpers/ghost_head.js index 61522ecf8d..b65c934640 100644 --- a/core/server/helpers/ghost_head.js +++ b/core/server/helpers/ghost_head.js @@ -2,10 +2,6 @@ // Usage: `{{ghost_head}}` // // Outputs scripts and other assets at the top of a Ghost theme -// -// We use the name ghost_head to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers - var proxy = require('./proxy'), _ = require('lodash'), debug = require('ghost-ignition').debug('ghost_head'), @@ -93,7 +89,8 @@ function getAjaxHelper(clientId, clientSecret) { * `blog`, `labs` and `config` are the templateOptions, search for `hbs.updateTemplateOptions` in the code base. * Also see how the root object get's created, https://github.com/wycats/handlebars.js/blob/v4.0.6/lib/handlebars/runtime.js#L259 */ -module.exports = function ghost_head(options) { +// We use the name ghost_head to match the helper for consistency: +module.exports = function ghost_head(options) { // eslint-disable-line camelcase debug('begin'); // if server error page do nothing diff --git a/core/server/helpers/has.js b/core/server/helpers/has.js index a8d920c69d..9ac1e0b358 100644 --- a/core/server/helpers/has.js +++ b/core/server/helpers/has.js @@ -14,11 +14,11 @@ function evaluateTagList(expr, tags) { return v.trim(); }).reduce(function (p, c) { return p || (_.findIndex(tags, function (item) { - // Escape regex special characters - item = item.replace(/[\-\/\\\^$*+?.()|\[\]{}]/g, '\\$&'); - item = new RegExp('^' + item + '$', 'i'); - return item.test(c); - }) !== -1); + // Escape regex special characters + item = item.replace(/[\-\/\\\^$*+?.()|\[\]{}]/g, '\\$&'); + item = new RegExp('^' + item + '$', 'i'); + return item.test(c); + }) !== -1); }, false); } diff --git a/core/server/helpers/img_url.js b/core/server/helpers/img_url.js index 74a272c85a..173608643d 100644 --- a/core/server/helpers/img_url.js +++ b/core/server/helpers/img_url.js @@ -31,9 +31,8 @@ module.exports = function imgUrl(attr, options) { if (attr) { return url.urlFor('image', {image: attr}, absolute); - } else { - // CASE: if you pass e.g. cover_image, but it is not set, then attr is null! - // in this case we don't show a warning - return; } + + // CASE: if you pass e.g. cover_image, but it is not set, then attr is null! + // in this case we don't show a warning }; diff --git a/core/server/helpers/meta_description.js b/core/server/helpers/meta_description.js index 5999fc47d9..05f423b70f 100644 --- a/core/server/helpers/meta_description.js +++ b/core/server/helpers/meta_description.js @@ -2,17 +2,12 @@ // Usage: `{{meta_description}}` // // Page description used for sharing and SEO -// -// We use the name meta_description to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers - var proxy = require('./proxy'), getMetaDataDescription = proxy.metaData.getMetaDataDescription; -function meta_description(options) { +// We use the name meta_description to match the helper for consistency: +module.exports = function meta_description(options) { // eslint-disable-line camelcase options = options || {}; return getMetaDataDescription(this, options.data.root) || ''; -} - -module.exports = meta_description; +}; diff --git a/core/server/helpers/meta_title.js b/core/server/helpers/meta_title.js index ae6b6f64d3..b27928f90e 100644 --- a/core/server/helpers/meta_title.js +++ b/core/server/helpers/meta_title.js @@ -2,15 +2,10 @@ // Usage: `{{meta_title}}` // // Page title used for sharing and SEO -// -// We use the name meta_title to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers - var proxy = require('./proxy'), getMetaDataTitle = proxy.metaData.getMetaDataTitle; -function meta_title(options) { +// We use the name meta_title to match the helper for consistency: +module.exports = function meta_title(options) { // eslint-disable-line camelcase return getMetaDataTitle(this, options.data.root); -} - -module.exports = meta_title; +}; diff --git a/core/server/helpers/page_url.js b/core/server/helpers/page_url.js index 0f796ab955..bbadcf974f 100644 --- a/core/server/helpers/page_url.js +++ b/core/server/helpers/page_url.js @@ -3,15 +3,12 @@ // *Usage example:* // `{{page_url 2}}` // -// Returns the URL for the page specified in the current object -// context. -// -// We use the name page_url to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers +// Returns the URL for the page specified in the current object context. var proxy = require('./proxy'), getPaginatedUrl = proxy.metaData.getPaginatedUrl; -module.exports = function page_url(page, options) { +// We use the name page_url to match the helper for consistency: +module.exports = function page_url(page, options) { // eslint-disable-line camelcase if (!options) { options = page; page = 1; diff --git a/core/server/helpers/pagination.js b/core/server/helpers/pagination.js index 2cfda4a63c..e91d114518 100644 --- a/core/server/helpers/pagination.js +++ b/core/server/helpers/pagination.js @@ -10,7 +10,6 @@ var proxy = require('./proxy'), pagination; pagination = function (options) { - /*jshint unused:false*/ if (!_.isObject(this.pagination) || _.isFunction(this.pagination)) { throw new errors.IncorrectUsageError({ message: i18n.t('warnings.helpers.pagination.invalidData') diff --git a/core/server/helpers/post_class.js b/core/server/helpers/post_class.js index 9eea810e93..f88e5d6154 100644 --- a/core/server/helpers/post_class.js +++ b/core/server/helpers/post_class.js @@ -2,15 +2,12 @@ // Usage: `{{post_class}}` // // Output classes for the body element -// -// We use the name body_class to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers - var proxy = require('./proxy'), _ = require('lodash'), SafeString = proxy.SafeString; -module.exports = function post_class() { +// We use the name post_class to match the helper for consistency: +module.exports = function post_class() { // eslint-disable-line camelcase var classes = ['post'], tags = this.post && this.post.tags ? this.post.tags : this.tags || [], featured = this.post && this.post.featured ? this.post.featured : this.featured || false, diff --git a/core/server/helpers/prev_next.js b/core/server/helpers/prev_next.js index ef551f44f6..77f3f68fea 100644 --- a/core/server/helpers/prev_next.js +++ b/core/server/helpers/prev_next.js @@ -29,7 +29,7 @@ buildApiOptions = function buildApiOptions(options, post) { limit: 1, // This line deliberately uses double quotes because GQL cannot handle either double quotes // or escaped singles, see TryGhost/GQL#34 - filter: "slug:-" + slug + "+published_at:" + op + "'" + publishedAt + "'", // jscs:ignore + filter: "slug:-" + slug + "+published_at:" + op + "'" + publishedAt + "'" // eslint-disable-line quotes }; if (_.get(options, 'hash.in')) { diff --git a/core/server/helpers/twitter_url.js b/core/server/helpers/twitter_url.js index fe1092ed27..bf366d97f4 100644 --- a/core/server/helpers/twitter_url.js +++ b/core/server/helpers/twitter_url.js @@ -2,15 +2,12 @@ // Usage: `{{twitter_url}}` or `{{twitter_url author.twitter}}` // // Output a url for a twitter username -// -// We use the name twitter_url to match the helper for consistency: -// jscs:disable requireCamelCaseOrUpperCaseIdentifiers - var proxy = require('./proxy'), socialUrls = proxy.socialUrls, findKey = proxy.utils.findKey; -module.exports = function twitter_url(username, options) { +// We use the name twitter_url to match the helper for consistency: +module.exports = function twitter_url(username, options) { // eslint-disable-line camelcase if (!options) { options = username; username = findKey('twitter', this, options.data.blog); diff --git a/core/server/middleware/api/spam-prevention.js b/core/server/middleware/api/spam-prevention.js index b7f38325dc..4d3af20fa2 100644 --- a/core/server/middleware/api/spam-prevention.js +++ b/core/server/middleware/api/spam-prevention.js @@ -53,25 +53,25 @@ globalBlock = function globalBlock() { db = require('../../data/db'); store = store || new BruteKnex({ - tablename: 'brute', - createTable: false, - knex: db.knex - }); + tablename: 'brute', + createTable: false, + knex: db.knex + }); globalBlockInstance = globalBlockInstance || new ExpressBrute(store, - _.extend({ - attachResetToRequest: false, - failCallback: function (req, res, next, nextValidRequestDate) { - return next(new errors.TooManyRequestsError({ - message: 'Too many attempts try again in ' + moment(nextValidRequestDate).fromNow(true), - context: i18n.t('errors.middleware.spamprevention.forgottenPasswordIp.error', - {rfa: spamGlobalBlock.freeRetries + 1 || 5, rfp: spamGlobalBlock.lifetime || 60 * 60}), - help: i18n.t('errors.middleware.spamprevention.tooManyAttempts') - })); - }, - handleStoreError: handleStoreError - }, _.pick(spamGlobalBlock, spamConfigKeys)) - ); + _.extend({ + attachResetToRequest: false, + failCallback: function (req, res, next, nextValidRequestDate) { + return next(new errors.TooManyRequestsError({ + message: 'Too many attempts try again in ' + moment(nextValidRequestDate).fromNow(true), + context: i18n.t('errors.middleware.spamprevention.forgottenPasswordIp.error', + {rfa: spamGlobalBlock.freeRetries + 1 || 5, rfp: spamGlobalBlock.lifetime || 60 * 60}), + help: i18n.t('errors.middleware.spamprevention.tooManyAttempts') + })); + }, + handleStoreError: handleStoreError + }, _.pick(spamGlobalBlock, spamConfigKeys)) + ); return globalBlockInstance; }; @@ -82,26 +82,26 @@ globalReset = function globalReset() { db = require('../../data/db'); store = store || new BruteKnex({ - tablename: 'brute', - createTable: false, - knex: db.knex - }); + tablename: 'brute', + createTable: false, + knex: db.knex + }); globalResetInstance = globalResetInstance || new ExpressBrute(store, - _.extend({ - attachResetToRequest: false, - failCallback: function (req, res, next, nextValidRequestDate) { - // TODO use i18n again - return next(new errors.TooManyRequestsError({ - message: 'Too many attempts try again in ' + moment(nextValidRequestDate).fromNow(true), - context: i18n.t('errors.middleware.spamprevention.forgottenPasswordIp.error', - {rfa: spamGlobalReset.freeRetries + 1 || 5, rfp: spamGlobalReset.lifetime || 60 * 60}), - help: i18n.t('errors.middleware.spamprevention.forgottenPasswordIp.context') - })); - }, - handleStoreError: handleStoreError - }, _.pick(spamGlobalReset, spamConfigKeys)) - ); + _.extend({ + attachResetToRequest: false, + failCallback: function (req, res, next, nextValidRequestDate) { + // TODO use i18n again + return next(new errors.TooManyRequestsError({ + message: 'Too many attempts try again in ' + moment(nextValidRequestDate).fromNow(true), + context: i18n.t('errors.middleware.spamprevention.forgottenPasswordIp.error', + {rfa: spamGlobalReset.freeRetries + 1 || 5, rfp: spamGlobalReset.lifetime || 60 * 60}), + help: i18n.t('errors.middleware.spamprevention.forgottenPasswordIp.context') + })); + }, + handleStoreError: handleStoreError + }, _.pick(spamGlobalReset, spamConfigKeys)) + ); return globalResetInstance; }; @@ -116,25 +116,25 @@ userLogin = function userLogin() { db = require('../../data/db'); store = store || new BruteKnex({ - tablename: 'brute', - createTable: false, - knex: db.knex - }); + tablename: 'brute', + createTable: false, + knex: db.knex + }); userLoginInstance = userLoginInstance || new ExpressBrute(store, - _.extend({ - attachResetToRequest: true, - failCallback: function (req, res, next, nextValidRequestDate) { - return next(new errors.TooManyRequestsError({ - message: 'Too many sign-in attempts try again in ' + moment(nextValidRequestDate).fromNow(true), - // TODO add more options to i18n - context: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.context'), - help: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.context') - })); - }, - handleStoreError: handleStoreError - }, _.pick(spamUserLogin, spamConfigKeys)) - ); + _.extend({ + attachResetToRequest: true, + failCallback: function (req, res, next, nextValidRequestDate) { + return next(new errors.TooManyRequestsError({ + message: 'Too many sign-in attempts try again in ' + moment(nextValidRequestDate).fromNow(true), + // TODO add more options to i18n + context: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.context'), + help: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.context') + })); + }, + handleStoreError: handleStoreError + }, _.pick(spamUserLogin, spamConfigKeys)) + ); return userLoginInstance; }; @@ -148,25 +148,25 @@ userReset = function userReset() { db = require('../../data/db'); store = store || new BruteKnex({ - tablename: 'brute', - createTable: false, - knex: db.knex - }); + tablename: 'brute', + createTable: false, + knex: db.knex + }); userResetInstance = userResetInstance || new ExpressBrute(store, - _.extend({ - attachResetToRequest: true, - failCallback: function (req, res, next, nextValidRequestDate) { - return next(new errors.TooManyRequestsError({ - message: 'Too many password reset attempts try again in ' + moment(nextValidRequestDate).fromNow(true), - context: i18n.t('errors.middleware.spamprevention.forgottenPasswordEmail.error', - {rfa: spamUserReset.freeRetries + 1 || 5, rfp: spamUserReset.lifetime || 60 * 60}), - help: i18n.t('errors.middleware.spamprevention.forgottenPasswordEmail.context') - })); - }, - handleStoreError: handleStoreError - }, _.pick(spamUserReset, spamConfigKeys)) - ); + _.extend({ + attachResetToRequest: true, + failCallback: function (req, res, next, nextValidRequestDate) { + return next(new errors.TooManyRequestsError({ + message: 'Too many password reset attempts try again in ' + moment(nextValidRequestDate).fromNow(true), + context: i18n.t('errors.middleware.spamprevention.forgottenPasswordEmail.error', + {rfa: spamUserReset.freeRetries + 1 || 5, rfp: spamUserReset.lifetime || 60 * 60}), + help: i18n.t('errors.middleware.spamprevention.forgottenPasswordEmail.context') + })); + }, + handleStoreError: handleStoreError + }, _.pick(spamUserReset, spamConfigKeys)) + ); return userResetInstance; }; @@ -179,28 +179,28 @@ privateBlog = function privateBlog() { db = require('../../data/db'); store = store || new BruteKnex({ - tablename: 'brute', - createTable: false, - knex: db.knex - }); + tablename: 'brute', + createTable: false, + knex: db.knex + }); privateBlogInstance = privateBlogInstance || new ExpressBrute(store, - _.extend({ - attachResetToRequest: false, - failCallback: function (req, res, next, nextValidRequestDate) { - logging.error(new errors.GhostError({ - message: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.error', - {rfa: spamPrivateBlog.freeRetries + 1 || 5, rfp: spamPrivateBlog.lifetime || 60 * 60}), - context: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.context') - })); + _.extend({ + attachResetToRequest: false, + failCallback: function (req, res, next, nextValidRequestDate) { + logging.error(new errors.GhostError({ + message: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.error', + {rfa: spamPrivateBlog.freeRetries + 1 || 5, rfp: spamPrivateBlog.lifetime || 60 * 60}), + context: i18n.t('errors.middleware.spamprevention.tooManySigninAttempts.context') + })); - return next(new errors.GhostError({ - message: 'Too many private sign-in attempts try again in ' + moment(nextValidRequestDate).fromNow(true) - })); - }, - handleStoreError: handleStoreError - }, _.pick(spamPrivateBlog, spamConfigKeys)) - ); + return next(new errors.GhostError({ + message: 'Too many private sign-in attempts try again in ' + moment(nextValidRequestDate).fromNow(true) + })); + }, + handleStoreError: handleStoreError + }, _.pick(spamPrivateBlog, spamConfigKeys)) + ); return privateBlogInstance; }; diff --git a/core/server/middleware/error-handler.js b/core/server/middleware/error-handler.js index 62eb0c47ea..3e3d8563f8 100644 --- a/core/server/middleware/error-handler.js +++ b/core/server/middleware/error-handler.js @@ -59,7 +59,7 @@ _private.prepareError = function prepareError(err, req, res, next) { next(err); }; -_private.JSONErrorRenderer = function JSONErrorRenderer(err, req, res, /*jshint unused:false */ next) { +_private.JSONErrorRenderer = function JSONErrorRenderer(err, req, res, next) { // eslint-disable-line no-unused-vars // @TODO: jsonapi errors format (http://jsonapi.org/format/#error-objects) res.json({ errors: [{ @@ -115,7 +115,7 @@ _private.HTMLErrorRenderer = function HTMLErrorRender(err, req, res, next) { }); }; -_private.BasicErorRenderer = function BasicErrorRenderer(err, req, res, /*jshint unused:false */ next) { +_private.BasicErorRenderer = function BasicErrorRenderer(err, req, res, next) { // eslint-disable-line no-unused-vars return res.send(res.statusCode + ' ' + err.message); }; diff --git a/core/server/middleware/serve-favicon.js b/core/server/middleware/serve-favicon.js index 73e9bda141..b843ada2d4 100644 --- a/core/server/middleware/serve-favicon.js +++ b/core/server/middleware/serve-favicon.js @@ -58,9 +58,7 @@ function serveFavicon() { res.writeHead(200, content.headers); res.end(content.body); }) - .catch(function (err) { - next(err); - }); + .catch(next); } else { originalExtension = path.extname(filePath).toLowerCase(); @@ -81,7 +79,7 @@ function serveFavicon() { }); } } else { - next(); + return next(); } }; } diff --git a/core/server/middleware/serve-public-file.js b/core/server/middleware/serve-public-file.js index 4d51bade2f..a1cdbac1a7 100644 --- a/core/server/middleware/serve-public-file.js +++ b/core/server/middleware/serve-public-file.js @@ -44,7 +44,7 @@ function servePublicFile(file, type, maxAge) { }); } } else { - next(); + return next(); } }; } diff --git a/core/server/middleware/static-theme.js b/core/server/middleware/static-theme.js index 2f96af2b9d..5a3a1c02d4 100644 --- a/core/server/middleware/static-theme.js +++ b/core/server/middleware/static-theme.js @@ -19,14 +19,14 @@ function isWhiteListedFile(file) { function forwardToExpressStatic(req, res, next) { if (!themeUtils.getActive()) { - next(); - } else { - var configMaxAge = config.get('caching:theme:maxAge'); - - express.static(themeUtils.getActive().path, - {maxAge: (configMaxAge || configMaxAge === 0) ? configMaxAge : utils.ONE_YEAR_MS} - )(req, res, next); + return next(); } + + var configMaxAge = config.get('caching:theme:maxAge'); + + express.static(themeUtils.getActive().path, + {maxAge: (configMaxAge || configMaxAge === 0) ? configMaxAge : utils.ONE_YEAR_MS} + )(req, res, next); } function staticTheme() { diff --git a/core/server/middleware/uncapitalise.js b/core/server/middleware/uncapitalise.js index c7673425c1..ad083a9c2c 100644 --- a/core/server/middleware/uncapitalise.js +++ b/core/server/middleware/uncapitalise.js @@ -36,13 +36,13 @@ uncapitalise = function uncapitalise(req, res, next) { */ if (/[A-Z]/.test(decodeURIComponent(pathToTest))) { redirectPath = ( - utils.removeOpenRedirectFromUrl((req.originalUrl || req.url).replace(pathToTest, pathToTest.toLowerCase())) + utils.removeOpenRedirectFromUrl((req.originalUrl || req.url).replace(pathToTest, pathToTest.toLowerCase())) ); return utils.url.redirect301(res, redirectPath); - } else { - next(); } + + next(); }; module.exports = uncapitalise; diff --git a/core/server/models/app.js b/core/server/models/app.js index 4c57ae24f9..38ab1f2d48 100644 --- a/core/server/models/app.js +++ b/core/server/models/app.js @@ -6,7 +6,6 @@ App = ghostBookshelf.Model.extend({ tableName: 'apps', onSaving: function onSaving(newPage, attr, options) { - /*jshint unused:false*/ var self = this; ghostBookshelf.Model.prototype.onSaving.apply(this, arguments); diff --git a/core/server/models/base/token.js b/core/server/models/base/token.js index c779159a59..162a192676 100644 --- a/core/server/models/base/token.js +++ b/core/server/models/base/token.js @@ -23,7 +23,7 @@ Basetoken = ghostBookshelf.Model.extend({ } }, { - destroyAllExpired: function destroyAllExpired(options) { + destroyAllExpired: function destroyAllExpired(options) { options = this.filterOptions(options, 'destroyAll'); return ghostBookshelf.Collection.forge([], {model: this}) .query('where', 'expires', '<', Date.now()) diff --git a/core/server/models/plugins/include-count.js b/core/server/models/plugins/include-count.js index 105286ca0b..e3a7fed0e3 100644 --- a/core/server/models/plugins/include-count.js +++ b/core/server/models/plugins/include-count.js @@ -1,4 +1,5 @@ -var _ = require('lodash'); +var debug = require('ghost-ignition').debug('models:plugin:include-count'), + _ = require('lodash'); module.exports = function (Bookshelf) { var modelProto = Bookshelf.Model.prototype, @@ -60,9 +61,7 @@ module.exports = function (Bookshelf) { fetch: function () { this.addCounts.apply(this, arguments); - if (this.debug) { - console.log('QUERY', this.query().toQuery()); - } + debug('QUERY', this.query().toQuery()); // Call parent fetch return modelProto.fetch.apply(this, arguments); @@ -70,9 +69,7 @@ module.exports = function (Bookshelf) { fetchAll: function () { this.addCounts.apply(this, arguments); - if (this.debug) { - console.log('QUERY', this.query().toQuery()); - } + debug('QUERY', this.query().toQuery()); // Call parent fetchAll return modelProto.fetchAll.apply(this, arguments); diff --git a/core/server/models/plugins/pagination.js b/core/server/models/plugins/pagination.js index a9523a2d5a..e7dd362fae 100644 --- a/core/server/models/plugins/pagination.js +++ b/core/server/models/plugins/pagination.js @@ -1,7 +1,7 @@ // # Pagination // // Extends Bookshelf.Model with a `fetchPage` method. Handles everything to do with paginated requests. -var _ = require('lodash'), +var _ = require('lodash'), defaults, paginationUtils, pagination; @@ -66,12 +66,12 @@ paginationUtils = { formatResponse: function formatResponse(totalItems, options) { var calcPages = Math.ceil(totalItems / options.limit) || 0, pagination = { - page: options.page || defaults.page, + page: options.page || defaults.page, limit: options.limit, pages: calcPages === 0 ? 1 : calcPages, total: totalItems, - next: null, - prev: null + next: null, + prev: null }; if (pagination.pages > 1) { @@ -126,7 +126,7 @@ pagination = function pagination(bookshelf) { // Extend updates the first object passed to it, no need for an assignment _.extend(bookshelf.Model.prototype, { /** - * ### Fetch page + * ### Fetch page * A `fetch` extension to get a paginated set of items from a collection * * We trigger two queries: @@ -148,11 +148,6 @@ pagination = function pagination(bookshelf) { bookshelf.knex.raw('count(distinct ' + tableName + '.' + idAttribute + ') as aggregate') ); - // the debug flag doesn't work for the raw knex count query! - if (this.debug) { - console.log('COUNT', countPromise.toQuery()); - } - // #### Pre count clauses // Add any where or join clauses which need to be included with the aggregate query diff --git a/core/server/models/tag.js b/core/server/models/tag.js index 83d1cf98d7..45a946060c 100644 --- a/core/server/models/tag.js +++ b/core/server/models/tag.js @@ -31,7 +31,6 @@ Tag = ghostBookshelf.Model.extend({ }, onSaving: function onSaving(newTag, attr, options) { - /*jshint unused:false*/ var self = this; ghostBookshelf.Model.prototype.onSaving.apply(this, arguments); diff --git a/core/server/models/user.js b/core/server/models/user.js index 14b58eb8bd..16f30a8f69 100644 --- a/core/server/models/user.js +++ b/core/server/models/user.js @@ -236,8 +236,9 @@ User = ghostBookshelf.Model.extend({ format: function format(options) { if (!_.isEmpty(options.website) && !validator.isURL(options.website, { - require_protocol: true, - protocols: ['http', 'https']})) { + require_protocol: true, + protocols: ['http', 'https'] + })) { options.website = 'http://' + options.website; } return ghostBookshelf.Model.prototype.format.call(this, options); @@ -575,7 +576,7 @@ User = ghostBookshelf.Model.extend({ options.withRelated = _.union(options.withRelated, options.include); userData.slug = null; - return self.edit.call(self, userData, options); + return self.edit(userData, options); }, /** @@ -792,41 +793,46 @@ User = ghostBookshelf.Model.extend({ var ownerRole, contextUser; - return Promise.join(ghostBookshelf.model('Role').findOne({name: 'Owner'}), - User.findOne({id: options.context.user}, {include: ['roles']})) - .then(function then(results) { - ownerRole = results[0]; - contextUser = results[1]; + return Promise.join( + ghostBookshelf.model('Role').findOne({name: 'Owner'}), + User.findOne({id: options.context.user}, {include: ['roles']}) + ) + .then(function then(results) { + ownerRole = results[0]; + contextUser = results[1]; - // check if user has the owner role - var currentRoles = contextUser.toJSON(options).roles; - if (!_.some(currentRoles, {id: ownerRole.id})) { - return Promise.reject(new errors.NoPermissionError({message: i18n.t('errors.models.user.onlyOwnerCanTransferOwnerRole')})); - } + // check if user has the owner role + var currentRoles = contextUser.toJSON(options).roles; + if (!_.some(currentRoles, {id: ownerRole.id})) { + return Promise.reject(new errors.NoPermissionError({message: i18n.t('errors.models.user.onlyOwnerCanTransferOwnerRole')})); + } - return Promise.join(ghostBookshelf.model('Role').findOne({name: 'Administrator'}), - User.findOne({id: object.id}, {include: ['roles']})); - }).then(function then(results) { - var adminRole = results[0], - user = results[1], - currentRoles = user.toJSON(options).roles; + return Promise.join(ghostBookshelf.model('Role').findOne({name: 'Administrator'}), + User.findOne({id: object.id}, {include: ['roles']})); + }) + .then(function then(results) { + var adminRole = results[0], + user = results[1], + currentRoles = user.toJSON(options).roles; - if (!_.some(currentRoles, {id: adminRole.id})) { - return Promise.reject(new errors.ValidationError({message: i18n.t('errors.models.user.onlyAdmCanBeAssignedOwnerRole')})); - } + if (!_.some(currentRoles, {id: adminRole.id})) { + return Promise.reject(new errors.ValidationError({message: i18n.t('errors.models.user.onlyAdmCanBeAssignedOwnerRole')})); + } - // convert owner to admin - return Promise.join(contextUser.roles().updatePivot({role_id: adminRole.id}), - user.roles().updatePivot({role_id: ownerRole.id}), - user.id); - }).then(function then(results) { - return Users.forge() - .query('whereIn', 'id', [contextUser.id, results[2]]) - .fetch({withRelated: ['roles']}); - }).then(function then(users) { - options.include = ['roles']; - return users.toJSON(options); - }); + // convert owner to admin + return Promise.join(contextUser.roles().updatePivot({role_id: adminRole.id}), + user.roles().updatePivot({role_id: ownerRole.id}), + user.id); + }) + .then(function then(results) { + return Users.forge() + .query('whereIn', 'id', [contextUser.id, results[2]]) + .fetch({withRelated: ['roles']}); + }) + .then(function then(users) { + options.include = ['roles']; + return users.toJSON(options); + }); }, // Get the user by email address, enforces case insensitivity rejects if the user is not found diff --git a/core/server/permissions/can-this.js b/core/server/permissions/can-this.js index a4c3c97c36..3e3b9fb65e 100644 --- a/core/server/permissions/can-this.js +++ b/core/server/permissions/can-this.js @@ -10,19 +10,17 @@ var _ = require('lodash'), CanThisResult; // Base class for canThis call results -CanThisResult = function () { - return; -}; +CanThisResult = function () {}; CanThisResult.prototype.buildObjectTypeHandlers = function (objTypes, actType, context, permissionLoad) { var objectTypeModelMap = { - post: models.Post, - role: models.Role, - user: models.User, + post: models.Post, + role: models.Role, + user: models.User, permission: models.Permission, - setting: models.Settings, + setting: models.Settings, subscriber: models.Subscriber, - invite: models.Invite + invite: models.Invite }; // Iterate through the object types, i.e. ['post', 'tag', 'user'] diff --git a/core/server/services/apps/proxy.js b/core/server/services/apps/proxy.js index 9a83741392..a508389fc4 100644 --- a/core/server/services/apps/proxy.js +++ b/core/server/services/apps/proxy.js @@ -29,7 +29,7 @@ generateProxyFunctions = function (name, permissions, isInternal) { var permValue = getPermissionToMethod(perm, method); if (!permValue) { - throw new Error(i18n.t('errors.apps.accessResourceWithoutPermission.error', {name:name, perm: perm, method: method})); + throw new Error(i18n.t('errors.apps.accessResourceWithoutPermission.error', {name: name, perm: perm, method: method})); } return wrappedFunc.apply(context, args); @@ -41,8 +41,8 @@ generateProxyFunctions = function (name, permissions, isInternal) { }, passThruAppContextToApi = function (perm, apiMethods) { var appContext = { - app: name - }; + app: name + }; return _.reduce(apiMethods, function (memo, apiMethod, methodName) { memo[methodName] = function () { diff --git a/core/server/services/slack.js b/core/server/services/slack.js index 6f2824b127..02f1273032 100644 --- a/core/server/services/slack.js +++ b/core/server/services/slack.js @@ -83,8 +83,6 @@ function ping(post) { // with all the data we have, we're doing the request now makeRequest(reqOptions, slackData); - } else { - return; } } diff --git a/core/server/themes/Storage.js b/core/server/themes/Storage.js index f530ba0025..e479e4d4b8 100644 --- a/core/server/themes/Storage.js +++ b/core/server/themes/Storage.js @@ -1,5 +1,3 @@ -// jscs:disable requireMultipleVarDecl - 'use strict'; var fs = require('fs-extra'), diff --git a/core/server/update-check.js b/core/server/update-check.js index b5d6eb40cb..3082370a58 100644 --- a/core/server/update-check.js +++ b/core/server/update-check.js @@ -63,18 +63,18 @@ function createCustomNotification(message) { } var notification = { - status: 'alert', - type: 'info', - custom: true, - uuid: message.id, - dismissible: true, - message: message.content - }, - getAllNotifications = api.notifications.browse({context: {internal: true}}), - getSeenNotifications = api.settings.read(_.extend({key: 'seen_notifications'}, internal)); + status: 'alert', + type: 'info', + custom: true, + uuid: message.id, + dismissible: true, + message: message.content + }, + getAllNotifications = api.notifications.browse({context: {internal: true}}), + getSeenNotifications = api.settings.read(_.extend({key: 'seen_notifications'}, internal)); return Promise.join(getAllNotifications, getSeenNotifications, function joined(all, seen) { - var isSeen = _.includes(JSON.parse(seen.settings[0].value || []), notification.id), + var isSeen = _.includes(JSON.parse(seen.settings[0].value || []), notification.id), isDuplicate = _.some(all.notifications, {message: notification.message}); if (!isSeen && !isDuplicate) { @@ -233,7 +233,7 @@ function updateCheck() { if (nextUpdateCheck && nextUpdateCheck.value && nextUpdateCheck.value > moment().unix()) { // It's not time to check yet - return; + return; // eslint-disable-line no-useless-return } else { // We need to do a check return updateCheckRequest() diff --git a/core/server/utils/index.js b/core/server/utils/index.js index 3b261aa30f..4c958e915e 100644 --- a/core/server/utils/index.js +++ b/core/server/utils/index.js @@ -21,6 +21,7 @@ utils = { /** * Timespans in seconds and milliseconds for better readability */ + /* eslint-disable key-spacing */ ONE_HOUR_S: 3600, ONE_DAY_S: 86400, ONE_MONTH_S: 2628000, @@ -33,6 +34,7 @@ utils = { ONE_MONTH_MS: 2628000000, SIX_MONTH_MS: 15768000000, ONE_YEAR_MS: 31536000000, + // eslint-enable key-spacing */ /** * Return a unique identifier with the given `len`. diff --git a/core/server/utils/markdown-converter.js b/core/server/utils/markdown-converter.js index bb330409ad..1c42d46bd5 100644 --- a/core/server/utils/markdown-converter.js +++ b/core/server/utils/markdown-converter.js @@ -4,45 +4,42 @@ var MarkdownIt = require('markdown-it'), breaks: true, linkify: true }) - .use(require('markdown-it-footnote')) - .use(require('markdown-it-lazy-headers')) - .use(require('markdown-it-mark')) - .use(function namedHeaders(md) { - // jscs:disable + .use(require('markdown-it-footnote')) + .use(require('markdown-it-lazy-headers')) + .use(require('markdown-it-mark')) + .use(function namedHeaders(md) { + // match legacy Showdown IDs + var slugify = function (inputString, usedHeaders) { + var slug = inputString.replace(/[^\w]/g, '').toLowerCase(); + if (usedHeaders[slug]) { + usedHeaders[slug] += 1; + slug += usedHeaders[slug]; + } + return slug; + }; + var originalHeadingOpen = md.renderer.rules.heading_open; - // match legacy Showdown IDs - var slugify = function (inputString, usedHeaders) { - var slug = inputString.replace(/[^\w]/g, '').toLowerCase(); - if (usedHeaders[slug]) { - usedHeaders[slug] += 1; - slug += usedHeaders[slug]; - } - return slug; - }; - var originalHeadingOpen = md.renderer.rules.heading_open; + // originally from https://github.com/leff/markdown-it-named-headers + // moved here to avoid pulling in http://stringjs.com dependency + md.renderer.rules.heading_open = function (tokens, idx, something, somethingelse, self) { + var usedHeaders = {}; - // originally from https://github.com/leff/markdown-it-named-headers - // moved here to avoid pulling in http://stringjs.com dependency - md.renderer.rules.heading_open = function (tokens, idx, something, somethingelse, self) { - var used_headers = {}; + tokens[idx].attrs = tokens[idx].attrs || []; - tokens[idx].attrs = tokens[idx].attrs || []; + var title = tokens[idx + 1].children.reduce(function (acc, t) { + return acc + t.content; + }, ''); - var title = tokens[idx + 1].children.reduce(function (acc, t) { - return acc + t.content; - }, ''); + var slug = slugify(title, usedHeaders); + tokens[idx].attrs.push(['id', slug]); - var slug = slugify(title, used_headers); - tokens[idx].attrs.push(['id', slug]); - - if (originalHeadingOpen) { - return originalHeadingOpen.apply(this, arguments); - } else { - return self.renderToken.apply(self, arguments); - } - }; - // jscs:enable - }); + if (originalHeadingOpen) { + return originalHeadingOpen.apply(this, arguments); + } else { + return self.renderToken.apply(self, arguments); + } + }; + }); // configure linkify-it converter.linkify.set({ diff --git a/core/server/utils/mobiledoc-converter.js b/core/server/utils/mobiledoc-converter.js index 1537c0e3b9..5476f369f1 100644 --- a/core/server/utils/mobiledoc-converter.js +++ b/core/server/utils/mobiledoc-converter.js @@ -1,9 +1,9 @@ -var SimpleDom = require('simple-dom'), - Renderer = require('mobiledoc-dom-renderer').default, - config = require('../config'), - logging = require('../logging'), - errors = require('../errors'), - defaults = require(config.get('paths').internalAppPath + 'default-cards'), +var SimpleDom = require('simple-dom'), + Renderer = require('mobiledoc-dom-renderer').default, + config = require('../config'), + logging = require('../logging'), + errors = require('../errors'), + defaults = require(config.get('paths').internalAppPath + 'default-cards'), options = { dom: new SimpleDom.Document(), cards: defaults.cards, @@ -38,9 +38,9 @@ var SimpleDom = require('simple-dom'), module.exports = { render: function (mobiledoc) { var renderer = new Renderer(options), - rendered = renderer.render(mobiledoc), - serializer = new SimpleDom.HTMLSerializer(SimpleDom.voidMap), - html = serializer.serializeChildren(rendered.result); + rendered = renderer.render(mobiledoc), + serializer = new SimpleDom.HTMLSerializer(SimpleDom.voidMap), + html = serializer.serializeChildren(rendered.result); return html; } }; diff --git a/core/server/utils/packages/read-packages.js b/core/server/utils/packages/read-packages.js index 6118d20ded..b253ab8fb9 100644 --- a/core/server/utils/packages/read-packages.js +++ b/core/server/utils/packages/read-packages.js @@ -1,7 +1,6 @@ /** * Dependencies */ - var parsePackageJson = require('./parse-package-json'), errors = require('../../errors'), Promise = require('bluebird'), diff --git a/core/server/utils/read-csv.js b/core/server/utils/read-csv.js index bd74b31256..d76229a0b9 100644 --- a/core/server/utils/read-csv.js +++ b/core/server/utils/read-csv.js @@ -13,46 +13,46 @@ function readCSV(options) { readFile.on('err', function (err) { reject(err); }) - .pipe(csvParser()) - .on('data', function (row) { - rows.push(row); - }) - .on('end', function () { - // If CSV is single column - return all values including header - var headers = _.keys(rows[0]), result = {}, columnMap = {}; - if (columnsToExtract.length === 1 && headers.length === 1) { - results = _.map(rows, function (value) { + .pipe(csvParser()) + .on('data', function (row) { + rows.push(row); + }) + .on('end', function () { + // If CSV is single column - return all values including header + var headers = _.keys(rows[0]), result = {}, columnMap = {}; + if (columnsToExtract.length === 1 && headers.length === 1) { + results = _.map(rows, function (value) { + result = {}; + result[columnsToExtract[0].name] = value[headers[0]]; + return result; + }); + + // Add first row result = {}; - result[columnsToExtract[0].name] = value[headers[0]]; - return result; - }); + result[columnsToExtract[0].name] = headers[0]; + results = [result].concat(results); + } else { + // If there are multiple columns in csv file + // try to match headers using lookup value - // Add first row - result = {}; - result[columnsToExtract[0].name] = headers[0]; - results = [result].concat(results); - } else { - // If there are multiple columns in csv file - // try to match headers using lookup value - - _.map(columnsToExtract, function findMatches(column) { - _.each(headers, function checkheader(header) { - if (column.lookup.test(header)) { - columnMap[column.name] = header; - } + _.map(columnsToExtract, function findMatches(column) { + _.each(headers, function checkheader(header) { + if (column.lookup.test(header)) { + columnMap[column.name] = header; + } + }); }); - }); - results = _.map(rows, function evaluateRow(row) { - var result = {}; - _.each(columnMap, function returnMatches(value, key) { - result[key] = row[value]; + results = _.map(rows, function evaluateRow(row) { + var result = {}; + _.each(columnMap, function returnMatches(value, key) { + result[key] = row[value]; + }); + return result; }); - return result; - }); - } - resolve(results); - }); + } + resolve(results); + }); }); } diff --git a/core/server/utils/remove-open-redirect-from-url.js b/core/server/utils/remove-open-redirect-from-url.js index a92f735c6f..a8b6883690 100644 --- a/core/server/utils/remove-open-redirect-from-url.js +++ b/core/server/utils/remove-open-redirect-from-url.js @@ -19,7 +19,8 @@ function removeOpenRedirectFromUrl(urlString) { var parsedUrl = url.parse(urlString); return ( - (parsedUrl.protocol ? parsedUrl.protocol + '//' : '') + // http:// + // http:// + (parsedUrl.protocol ? parsedUrl.protocol + '//' : '') + (parsedUrl.auth || '') + (parsedUrl.host || '') + removeDoubleCharacters('/', parsedUrl.path) + diff --git a/core/server/utils/tokens.js b/core/server/utils/tokens.js index 5056f57291..ad8b2641ea 100644 --- a/core/server/utils/tokens.js +++ b/core/server/utils/tokens.js @@ -43,7 +43,6 @@ exports.resetToken = { email: email }; }, - /*jslint bitwise:true*/ compare: function compare(options) { options = options || {}; diff --git a/core/server/utils/url.js b/core/server/utils/url.js index 9d79dc9278..fd68e47624 100644 --- a/core/server/utils/url.js +++ b/core/server/utils/url.js @@ -227,13 +227,13 @@ function urlFor(context, data, absolute) { knownObjects = ['post', 'tag', 'author', 'image', 'nav'], baseUrl, hostname, - // this will become really big - knownPaths = { - home: '/', - rss: '/rss/', - api: API_PATH, - sitemap_xsl: '/sitemap.xsl' - }; + // this will become really big + knownPaths = { + home: '/', + rss: '/rss/', + api: API_PATH, + sitemap_xsl: '/sitemap.xsl' + }; // Make data properly optional if (_.isBoolean(data)) { @@ -278,7 +278,7 @@ function urlFor(context, data, absolute) { if (urlPath.indexOf(hostname) > -1 && !urlPath.split(hostname)[0].match(/\.|mailto:/) - && urlPath.split(hostname)[1].substring(0,1) !== ':') { + && urlPath.split(hostname)[1].substring(0, 1) !== ':') { // make link relative to account for possible // mismatch in http/https etc, force absolute // do not do so if link is a subdomain of blog url diff --git a/core/test/.eslintrc.json b/core/test/.eslintrc.json new file mode 100644 index 0000000000..ff21bbfd01 --- /dev/null +++ b/core/test/.eslintrc.json @@ -0,0 +1,288 @@ +{ + "env": { + "es6": true, + "node": true, + "mocha": true + }, + "extends": "eslint:recommended", + "rules": { + "accessor-pairs": "error", + "array-bracket-newline": "off", + "array-bracket-spacing": [ + "error", + "never" + ], + "array-callback-return": "off", + "array-element-newline": "off", + "arrow-body-style": "error", + "arrow-parens": [ + "error", + "always" + ], + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-scoped-var": "error", + "brace-style": [ + "error", + "1tbs", + { + "allowSingleLine": true + } + ], + "callback-return": "error", + "camelcase": "off", + "capitalized-comments": "off", + "class-methods-use-this": "off", + "comma-dangle": "error", + "comma-spacing": "error", + "comma-style": [ + "error", + "last" + ], + "complexity": "off", + "computed-property-spacing": [ + "error", + "never" + ], + "consistent-return": "off", + "consistent-this": "off", + "curly": "error", + "default-case": "error", + "dot-location": [ + "error", + "property" + ], + "dot-notation": "off", + "eol-last": "error", + "eqeqeq": "error", + "for-direction": "error", + "func-call-spacing": "error", + "func-name-matching": "off", + "func-names": "off", + "func-style": "off", + "function-paren-newline": "off", + "generator-star-spacing": "error", + "getter-return": "error", + "global-require": "off", + "guard-for-in": "error", + "handle-callback-err": "error", + "id-blacklist": "error", + "id-length": "off", + "id-match": "error", + "indent": "off", + "indent-legacy": "off", + "init-declarations": "off", + "jsx-quotes": "error", + "key-spacing": "off", + "keyword-spacing": "error", + "line-comment-position": "off", + "linebreak-style": [ + "error", + "unix" + ], + "lines-around-comment": "off", + "lines-around-directive": "off", + "lines-between-class-members": [ + "error", + "always" + ], + "max-depth": "error", + "max-len": "off", + "max-lines": "off", + "max-nested-callbacks": "error", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": "off", + "multiline-comment-style": "off", + "multiline-ternary": "off", + "new-parens": "error", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "off", + "no-alert": "error", + "no-array-constructor": "error", + "no-await-in-loop": "error", + "no-bitwise": "off", + "no-buffer-constructor": "off", + "no-caller": "error", + "no-catch-shadow": "error", + "no-confusing-arrow": "error", + "no-console": "off", + "no-continue": "error", + "no-div-regex": "off", + "no-duplicate-imports": "error", + "no-else-return": "off", + "no-empty-function": "off", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-extra-parens": "off", + "no-floating-decimal": "error", + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-inline-comments": "off", + "no-inner-declarations": [ + "error", + "functions" + ], + "no-invalid-this": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "off", + "no-loop-func": "error", + "no-magic-numbers": "off", + "no-mixed-operators": "off", + "no-mixed-requires": "off", + "no-multi-assign": "off", + "no-multi-spaces": "off", + "no-multi-str": "error", + "no-multiple-empty-lines": "error", + "no-native-reassign": "error", + "no-negated-condition": "off", + "no-negated-in-lhs": "error", + "no-nested-ternary": "off", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-param-reassign": "off", + "no-path-concat": "off", + "no-plusplus": "error", + "no-process-env": "off", + "no-process-exit": "error", + "no-proto": "error", + "no-prototype-builtins": "off", + "no-regex-spaces": "off", + "no-restricted-globals": "error", + "no-restricted-imports": "error", + "no-restricted-modules": "error", + "no-restricted-properties": "error", + "no-restricted-syntax": "error", + "no-return-assign": "error", + "no-return-await": "error", + "no-script-url": "off", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "off", + "no-shadow-restricted-names": "error", + "no-spaced-func": "error", + "no-sync": "off", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-ternary": "off", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-undefined": "off", + "no-underscore-dangle": "off", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "off", + "no-unused-vars": "off", + "no-use-before-define": "off", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "off", + "no-useless-constructor": "error", + "no-useless-escape": "off", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "off", + "no-void": "error", + "no-warning-comments": "off", + "no-whitespace-before-property": "error", + "no-with": "error", + "nonblock-statement-body-position": "error", + "object-curly-newline": [ + "error", + { + "consistent": true + } + ], + "object-curly-spacing": [ + "error", + "never" + ], + "object-property-newline": "off", + "object-shorthand": "off", + "one-var": "off", + "one-var-declaration-per-line": "off", + "operator-assignment": "off", + "operator-linebreak": "off", + "padded-blocks": [ + "error", + "never" + ], + "padding-line-between-statements": "error", + "prefer-arrow-callback": "off", + "prefer-const": "off", + "prefer-destructuring": "off", + "prefer-numeric-literals": "error", + "prefer-promise-reject-errors": "off", + "prefer-reflect": "off", + "prefer-rest-params": "off", + "prefer-spread": "off", + "prefer-template": "off", + "quote-props": [ + "error", + "as-needed" + ], + "quotes": "off", + "radix": "off", + "require-await": "error", + "require-jsdoc": "off", + "rest-spread-spacing": "error", + "semi": ["error", "always"], + "semi-spacing": "error", + "semi-style": [ + "error", + "last" + ], + "sort-imports": "error", + "sort-keys": "off", + "sort-vars": "off", + "space-before-blocks": "error", + "space-before-function-paren": [ + "error", + { + "anonymous": "always", + "named": "never" + } + ], + "space-in-parens": [ + "error", + "never" + ], + "space-infix-ops": "error", + "space-unary-ops": "error", + "spaced-comment": "off", + "strict": "off", + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": [ + "error", + "never" + ], + "template-tag-spacing": "error", + "unicode-bom": [ + "error", + "never" + ], + "valid-jsdoc": "off", + "vars-on-top": "off", + "wrap-iife": "off", + "wrap-regex": "off", + "yield-star-spacing": "error", + "yoda": "error" + } +} diff --git a/core/test/functional/routes/api/configuration_spec.js b/core/test/functional/routes/api/configuration_spec.js index dd311eb69a..4bb3be4492 100644 --- a/core/test/functional/routes/api/configuration_spec.js +++ b/core/test/functional/routes/api/configuration_spec.js @@ -38,6 +38,10 @@ describe('Configuration API', function () { .expect('Cache-Control', testUtils.cacheRules.private) .expect(200) .end(function (err, res) { + if (err) { + done(err); + } + should.exist(res.body.configuration); done(); }); diff --git a/core/test/functional/routes/frontend_spec.js b/core/test/functional/routes/frontend_spec.js index 392deef309..262566d0fb 100644 --- a/core/test/functional/routes/frontend_spec.js +++ b/core/test/functional/routes/frontend_spec.js @@ -100,9 +100,12 @@ describe('Frontend Routing', function () { var date = moment().format('YYYY/MM/DD'); request.get('/2016/04/01/welcome/') - .expect('Content-Type', /html/) - .end(function (err, res) { - res.status.should.eql(301); + .expect(301) + .end(function (err) { + if (err) { + return done(err); + } + request.get('/' + date + '/welcome/') .expect(200) .expect('Content-Type', /html/) diff --git a/core/test/integration/data/importer/importers/data_spec.js b/core/test/integration/data/importer/importers/data_spec.js index e7ae02e879..fbc56675be 100644 --- a/core/test/integration/data/importer/importers/data_spec.js +++ b/core/test/integration/data/importer/importers/data_spec.js @@ -54,7 +54,7 @@ describe('Import', function () { it('removes duplicate posts', function (done) { var exportData; - testUtils.fixtures.loadExportFixture('export-003',{lts:true}).then(function (exported) { + testUtils.fixtures.loadExportFixture('export-003', {lts:true}).then(function (exported) { exportData = exported; return dataImporter.doImport(exportData); }).then(function (importResult) { @@ -97,7 +97,7 @@ describe('Import', function () { it('cares about invalid dates', function (done) { var exportData; - testUtils.fixtures.loadExportFixture('export-003',{lts:true}).then(function (exported) { + testUtils.fixtures.loadExportFixture('export-003', {lts:true}).then(function (exported) { exportData = exported; return dataImporter.doImport(exportData); }).then(function (importResult) { diff --git a/core/test/utils/fork.js b/core/test/utils/fork.js index 97a005fc6f..c7ebc8f812 100644 --- a/core/test/utils/fork.js +++ b/core/test/utils/fork.js @@ -137,8 +137,7 @@ function forkGhost(newConfig) { resolve(child); } }); - socket.on('error', function (err) { - /*jshint unused:false*/ + socket.on('error', function () { pingTries = pingTries + 1; // continue checking diff --git a/package.json b/package.json index 5c8126fd1f..f2a5b69444 100644 --- a/package.json +++ b/package.json @@ -95,28 +95,26 @@ "sqlite3": "3.1.8" }, "devDependencies": { + "eslint": "4.10.0", "grunt": "1.0.1", "grunt-bg-shell": "2.3.3", "grunt-cli": "1.2.0", "grunt-contrib-clean": "1.1.0", "grunt-contrib-compress": "1.4.3", "grunt-contrib-copy": "1.0.0", - "grunt-contrib-jshint": "1.1.0", "grunt-contrib-symlink": "^1.0.0", "grunt-contrib-uglify": "2.0.0", "grunt-contrib-watch": "1.0.0", "grunt-cssnano": "2.1.0", "grunt-docker": "0.0.11", + "grunt-eslint": "20.1.0", "grunt-express-server": "0.5.3", - "grunt-jscs": "3.0.1", "grunt-mocha-cli": "2.1.0", "grunt-mocha-istanbul": "5.0.2", "grunt-shell": "1.3.1", "grunt-subgrunt": "1.2.0", "grunt-update-submodules": "0.4.1", "istanbul": "0.4.5", - "jshint": "2.9.5", - "jshint-stylish": "2.2.1", "matchdep": "1.0.1", "minimist": "1.2.0", "mocha": "3.5.3", diff --git a/yarn.lock b/yarn.lock index cd212d8c9d..bb1e17b69d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13,10 +13,6 @@ JSONSelect@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/JSONSelect/-/JSONSelect-0.4.0.tgz#a08edcc67eb3fcbe99ed630855344a0cf282bb8d" -"JSV@>= 4.0.x": - version "4.0.2" - resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" - abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -35,10 +31,28 @@ accepts@~1.3.4: mime-types "~2.1.16" negotiator "0.6.1" +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" + addressparser@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-0.3.2.tgz#59873f35e8fcf6c7361c10239261d76e15348bb2" +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + ajv@^4.9.1: version "4.11.7" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" @@ -46,7 +60,7 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.1.0: +ajv@^5.1.0, ajv@^5.2.0, ajv@^5.2.3: version "5.3.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" dependencies: @@ -106,14 +120,28 @@ analytics-node@2.4.1: superagent "^3.5.0" superagent-retry "^0.6.0" +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.1.0, ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + append-field@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" @@ -189,7 +217,13 @@ array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" -array-uniq@^1.0.2: +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -197,6 +231,10 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -213,10 +251,6 @@ assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" -async@0.2.x, async@~0.2.6, async@~0.2.9: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - async@1.x, async@^1.4.0, async@^1.5.0, async@^1.5.2, async@~1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -237,6 +271,10 @@ async@~0.1.22: version "0.1.22" resolved "https://registry.yarnpkg.com/async/-/async-0.1.22.tgz#0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061" +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -276,17 +314,21 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-runtime@^6.11.6, babel-runtime@^6.6.1, babel-runtime@^6.9.2: +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-runtime@^6.11.6, babel-runtime@^6.6.1: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" dependencies: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babylon@^6.8.1: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" - bal-util@~1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/bal-util/-/bal-util-1.18.0.tgz#4e2e2d90816d1a6b7e37174020042a2ce258421d" @@ -304,6 +346,10 @@ balanced-match@^0.4.1, balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -314,7 +360,7 @@ bcryptjs@2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" -beeper@^1.0.0, beeper@^1.1.0: +beeper@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" @@ -423,6 +469,13 @@ brace-expansion@^1.0.0: balanced-match "^0.4.1" concat-map "0.0.1" +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" @@ -508,10 +561,20 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + caller@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/caller/-/caller-1.0.1.tgz#b851860f70e195db3d277395aa1a7e23ea30ecf5" +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -559,7 +622,7 @@ center-align@^0.1.1: deep-eql "^0.1.3" type-detect "^1.0.0" -chalk@*, chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.0, chalk@~1.1.1: +chalk@*, chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -579,6 +642,14 @@ chalk@1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + cheerio@0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" @@ -600,6 +671,10 @@ cheerio@0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + cjson@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cjson/-/cjson-0.2.1.tgz#73cd8aad65d9e1505f9af1744d3b79c1527682a5" @@ -610,18 +685,15 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" -cli-table@~0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: - colors "1.0.3" + restore-cursor "^2.0.0" -cli@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" - dependencies: - exit "0.1.2" - glob "^7.1.1" +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" cliui@^2.1.0: version "2.1.0" @@ -673,7 +745,7 @@ coffee-script@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.3.3.tgz#150d6b4cb522894369efed6a2101c20bc7f4a4f4" -color-convert@^1.3.0: +color-convert@^1.3.0, color-convert@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: @@ -709,18 +781,14 @@ colors@0.5.x: version "0.5.1" resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" -colors@0.6.x, colors@~0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" - -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - colors@^1.1.2, colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +colors@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" @@ -739,18 +807,12 @@ commander@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" -commander@2.9.0, commander@^2.2.0, commander@^2.9.0, commander@~2.9.0: +commander@2.9.0, commander@^2.2.0, commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" -comment-parser@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.3.1.tgz#fd657aac8c1492d308c9a6100fc9b49d2435aba1" - dependencies: - readable-stream "^2.0.4" - component-emitter@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -790,7 +852,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.0: +concat-stream@1.6.0, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -817,12 +879,6 @@ connect-slashes@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/connect-slashes/-/connect-slashes-1.3.1.tgz#95d61830d0f9d5853c8688f0b5f43988b186ac37" -console-browserify@1.1.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -900,6 +956,14 @@ create-error@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23" +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -977,14 +1041,6 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" -cst@^0.4.3: - version "0.4.9" - resolved "https://registry.yarnpkg.com/cst/-/cst-0.4.9.tgz#51af14213bf5f8e8e715966ac645e1e2a56c6834" - dependencies: - babel-runtime "^6.9.2" - babylon "^6.8.1" - source-map-support "^0.4.0" - csv-parser@1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-1.11.0.tgz#cd92c3f49895a3c1591591035cbfbe6b51c55ab1" @@ -1001,20 +1057,12 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -cycle@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" dependencies: assert-plus "^1.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - dateformat@1.0.2-1.2.3: version "1.0.2-1.2.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.2-1.2.3.tgz#b0220c02de98617433b72851cf47de3df2cdbee9" @@ -1048,7 +1096,7 @@ debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.1.0: +debug@^3.0.1, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -1070,7 +1118,7 @@ deep-eql@^0.1.3: dependencies: type-detect "0.1.1" -deep-equal@*, deep-equal@^1.0.0: +deep-equal@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -1086,6 +1134,18 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1149,6 +1209,13 @@ docker@~0.2.10: pygmentize-bundled "~2.1.0" watchr "~2.3.3" +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -1164,13 +1231,13 @@ domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" -domhandler@2.3, domhandler@^2.3.0: +domhandler@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" dependencies: domelementtype "1" -domutils@1.5, domutils@1.5.1, domutils@^1.5.1: +domutils@1.5.1, domutils@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" dependencies: @@ -1252,10 +1319,6 @@ end-of-stream@^1.0.0: dependencies: once "^1.4.0" -entities@1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" - entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -1309,6 +1372,62 @@ escodegen@^1.8.1: optionalDependencies: source-map "~0.5.6" +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@4.10.0, eslint@^4.0.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.10.0.tgz#f25d0d7955c81968c2309aa5c9a229e045176bb7" + dependencies: + ajv "^5.2.0" + babel-code-frame "^6.22.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.17.0" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + 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.2" + 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.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "^4.0.1" + text-table "~0.2.0" + +espree@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" + dependencies: + acorn "^5.1.1" + acorn-jsx "^3.0.0" + esprima@1.0.x, "esprima@~ 1.0.2", esprima@~1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" @@ -1325,11 +1444,28 @@ esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" -estraverse@^4.1.0, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -1353,7 +1489,7 @@ eventemitter2@~0.4.13: version "0.4.14" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" -exit@0.1.2, exit@0.1.x, exit@~0.1.1, exit@~0.1.2: +exit@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -1485,6 +1621,14 @@ extendr@~2.0.1: dependencies: typechecker "~2.0.1" +external-editor@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -1513,10 +1657,6 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" -eyes@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - fancy-log@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" @@ -1555,6 +1695,19 @@ figures@^1.0.1: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + file-sync-cmp@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz#a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b" @@ -1632,6 +1785,15 @@ flagged-respawn@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -1745,6 +1907,10 @@ function-bind@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + gauge@~2.7.1: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -1851,7 +2017,7 @@ glob@3.2.11, glob@~3.2.9: inherits "2" minimatch "0.3" -glob@5.0.15, glob@^5.0.1, glob@^5.0.15, glob@~5.0.0: +glob@5.0.15, glob@^5.0.15, glob@~5.0.0: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: @@ -1872,7 +2038,7 @@ glob@7.0.5, glob@~7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.1, glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1: +glob@7.1.1, glob@^7.0.0, glob@^7.0.5, glob@~7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -1893,6 +2059,17 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.3, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~3.1.21: version "3.1.21" resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" @@ -1917,6 +2094,21 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" +globals@^9.17.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globule@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f" @@ -2005,14 +2197,6 @@ grunt-contrib-copy@1.0.0: chalk "^1.1.1" file-sync-cmp "^0.1.0" -grunt-contrib-jshint@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz#369d909b2593c40e8be79940b21340850c7939ac" - dependencies: - chalk "^1.1.1" - hooker "^0.2.3" - jshint "~2.9.4" - grunt-contrib-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/grunt-contrib-symlink/-/grunt-contrib-symlink-1.0.0.tgz#c83616c035711a6c0062a2810cf1c77ffc6bed2b" @@ -2049,19 +2233,17 @@ grunt-docker@0.0.11: docker "~0.2.10" grunt "~0.4.0" +grunt-eslint@20.1.0: + version "20.1.0" + resolved "https://registry.yarnpkg.com/grunt-eslint/-/grunt-eslint-20.1.0.tgz#2e5d273546cf36d80d313c1db91d73b805940816" + dependencies: + chalk "^2.1.0" + eslint "^4.0.0" + grunt-express-server@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/grunt-express-server/-/grunt-express-server-0.5.3.tgz#8236cfd16e5b5a14393464fff82a0c57137b74b8" -grunt-jscs@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/grunt-jscs/-/grunt-jscs-3.0.1.tgz#1fae50e3e955df9e3a9d9425aec22accae008092" - dependencies: - hooker "~0.2.3" - jscs "~3.0.5" - lodash "~4.6.1" - vow "~0.4.1" - grunt-known-options@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.0.tgz#a4274eeb32fa765da5a7a3b1712617ce3b144149" @@ -2298,6 +2480,10 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + has-gulplog@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" @@ -2368,7 +2554,7 @@ homedir-polyfill@^1.0.0: dependencies: parse-passwd "^1.0.0" -hooker@^0.2.3, hooker@~0.2.3: +hooker@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959" @@ -2390,16 +2576,6 @@ html-to-text@3.3.0: underscore "^1.8.3" underscore.string "^3.2.3" -htmlparser2@3.8.3, htmlparser2@3.8.x: - version "3.8.3" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" - dependencies: - domelementtype "1" - domhandler "2.3" - domutils "1.5" - entities "1.0" - readable-stream "1.1" - htmlparser2@^3.8.3, htmlparser2@^3.9.0, htmlparser2@^3.9.1, htmlparser2@^3.9.2: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" @@ -2458,15 +2634,11 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -i@0.3.x: - version "0.3.5" - resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5" - iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" -iconv-lite@0.4.19: +iconv-lite@0.4.19, iconv-lite@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -2478,6 +2650,10 @@ iconv-lite@~0.4.13: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" +ignore@^3.3.3: + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + iltorb@^1.0.13: version "1.3.4" resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-1.3.4.tgz#cbe7f73aa5e93527dabdeb19bb4f8d0fbdf04a8f" @@ -2493,6 +2669,10 @@ image-size@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.1.tgz#98122a562d59dcc097ef1b2c8191866eb8f5d663" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -2514,10 +2694,6 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherit@^2.2.2: - version "2.2.6" - resolved "https://registry.yarnpkg.com/inherit/-/inherit-2.2.6.tgz#f1614b06c8544e8128e4229c86347db73ad9788d" - inherits@1: version "1.0.2" resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" @@ -2534,6 +2710,25 @@ ini@^1.3.0, ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + interpret@^0.6.5: version "0.6.6" resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" @@ -2564,10 +2759,6 @@ ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" -irregular-plurals@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" - is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -2616,6 +2807,10 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -2632,6 +2827,22 @@ is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -2644,10 +2855,20 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2678,7 +2899,7 @@ isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" -isarray@1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2692,7 +2913,7 @@ isobject@^2.0.0, isobject@^2.1.0: dependencies: isarray "1.0.0" -isstream@0.1.x, isstream@~0.1.2: +isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2781,6 +3002,10 @@ js-beautify@1.6.8: mkdirp "~0.5.0" nopt "~3.0.1" +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + js-yaml@3.x, js-yaml@~3.5.2: version "3.5.5" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.5.5.tgz#0377c38017cabc7322b0d1fbcd25a491641f2fbe" @@ -2788,6 +3013,13 @@ js-yaml@3.x, js-yaml@~3.5.2: argparse "^1.0.2" esprima "^2.6.0" +js-yaml@^3.9.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-2.0.5.tgz#a25ae6509999e97df278c6719da11bd0687743a8" @@ -2795,14 +3027,6 @@ js-yaml@~2.0.5: argparse "~ 0.1.11" esprima "~ 1.0.2" -js-yaml@~3.4.0: - version "3.4.6" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.4.6.tgz#6be1b23f6249f53d293370fd4d1aaa63ce1b4eb0" - dependencies: - argparse "^1.0.2" - esprima "^2.6.0" - inherit "^2.2.2" - js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -2814,77 +3038,9 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jscs-jsdoc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/jscs-jsdoc/-/jscs-jsdoc-2.0.0.tgz#f53ebce029aa3125bd88290ba50d64d4510a4871" - dependencies: - comment-parser "^0.3.1" - jsdoctypeparser "~1.2.0" - -jscs-preset-wikimedia@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz#fff563342038fc2e8826b7bb7309c3ae3406fc7e" - -jscs@~3.0.5: - version "3.0.7" - resolved "https://registry.yarnpkg.com/jscs/-/jscs-3.0.7.tgz#7141b4dff5b86e32d0e99d764b836767c30d201a" - dependencies: - chalk "~1.1.0" - cli-table "~0.3.1" - commander "~2.9.0" - cst "^0.4.3" - estraverse "^4.1.0" - exit "~0.1.2" - glob "^5.0.1" - htmlparser2 "3.8.3" - js-yaml "~3.4.0" - jscs-jsdoc "^2.0.0" - jscs-preset-wikimedia "~1.0.0" - jsonlint "~1.6.2" - lodash "~3.10.0" - minimatch "~3.0.0" - natural-compare "~1.2.2" - pathval "~0.1.1" - prompt "~0.2.14" - reserved-words "^0.1.1" - resolve "^1.1.6" - strip-bom "^2.0.0" - strip-json-comments "~1.0.2" - to-double-quotes "^2.0.0" - to-single-quotes "^2.0.0" - vow "~0.4.8" - vow-fs "~0.3.4" - xmlbuilder "^3.1.0" - -jsdoctypeparser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz#e7dedc153a11849ffc5141144ae86a7ef0c25392" - dependencies: - lodash "^3.7.0" - -jshint-stylish@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jshint-stylish/-/jshint-stylish-2.2.1.tgz#242082a2c035ae03fd81044e0570cc4208cf6e61" - dependencies: - beeper "^1.1.0" - chalk "^1.0.0" - log-symbols "^1.0.0" - plur "^2.1.0" - string-length "^1.0.0" - text-table "^0.2.0" - -jshint@2.9.5, jshint@~2.9.4: - version "2.9.5" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.5.tgz#1e7252915ce681b40827ee14248c46d34e9aa62c" - dependencies: - cli "~1.0.0" - console-browserify "1.1.x" - exit "0.1.x" - htmlparser2 "3.8.x" - lodash "3.7.x" - minimatch "~3.0.2" - shelljs "0.3.x" - strip-json-comments "1.0.x" +jschardet@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" json-schema-traverse@^0.3.0: version "0.3.1" @@ -2924,13 +3080,6 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" -jsonlint@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/jsonlint/-/jsonlint-1.6.2.tgz#5737045085f55eb455c68b1ff4ebc01bd50e8830" - dependencies: - JSV ">= 4.0.x" - nomnom ">= 1.5.x" - jsonpath@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.0.0.tgz#45cd9d4c4d0d6825d90bd7e40f83f1182b13dd07" @@ -3041,7 +3190,7 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" dependencies: @@ -3252,19 +3401,15 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@3.7.x: - version "3.7.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" - lodash@4.16.3: version "4.16.3" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.3.tgz#0ba761439529127c7a38c439114ca153efa999a2" -lodash@4.17.4, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.4, lodash@^4.17.4, lodash@^4.6.0, lodash@^4.7.0, lodash@^4.8.0, lodash@~4.17.2: +lodash@4.17.4, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.4, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.0, lodash@^4.7.0, lodash@^4.8.0, lodash@~4.17.2: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" -lodash@^3.10.1, lodash@^3.5.0, lodash@^3.7.0, lodash@~3.10.0, lodash@~3.10.1: +lodash@^3.10.1, lodash@~3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -3284,16 +3429,6 @@ lodash@~4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.3.0.tgz#efd9c4a6ec53f3b05412429915c3e4824e4d25a4" -lodash@~4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.6.1.tgz#df00c1164ad236b183cfc3887a5e8d38cc63cbbc" - -log-symbols@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - dependencies: - chalk "^1.0.0" - lolex@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" @@ -3334,6 +3469,13 @@ lru-cache@^4.0.0: pseudomap "^1.0.1" yallist "^2.0.0" +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" @@ -3502,6 +3644,10 @@ mimelib@~0.2.15: addressparser "~0.3.2" encoding "~0.1.7" +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + mimic-response@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" @@ -3519,6 +3665,12 @@ minimatch@0.3: dependencies: brace-expansion "^1.0.0" +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + minimatch@~0.2.11, minimatch@~0.2.12: version "0.2.14" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" @@ -3552,7 +3704,7 @@ mkdirp@0.5.0, mkdirp@^0.5.0: dependencies: minimist "0.0.8" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -3656,7 +3808,7 @@ multipipe@^0.1.2: dependencies: duplexer2 "0.0.2" -mute-stream@~0.0.4: +mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -3694,9 +3846,9 @@ nan@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" -natural-compare@~1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.2.2.tgz#1f96d60e3141cac1b6d05653ce0daeac763af6aa" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" nconf@0.8.4: version "0.8.4" @@ -3716,10 +3868,6 @@ nconf@0.8.5: secure-keys "^1.0.0" yargs "^3.19.0" -ncp@0.4.x: - version "0.4.2" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" - ncp@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" @@ -3815,7 +3963,7 @@ nodemailer@0.7.1: optionalDependencies: readable-stream "~1.1.9" -nomnom@1.5.2, "nomnom@>= 1.5.x": +nomnom@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.5.2.tgz#f4345448a853cfbd5c0d26320f2477ab0526fe2f" dependencies: @@ -3945,6 +4093,12 @@ once@1.x, once@^1.3.0, once@^1.3.3, once@^1.4.0: dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -3952,7 +4106,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -4062,6 +4216,10 @@ path-is-absolute@^1.0.0, path-is-absolute@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + path-key@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" @@ -4091,10 +4249,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -pathval@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-0.1.1.tgz#08f911cdca9cce5942880da7817bc0b723b66d82" - pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" @@ -4129,19 +4283,9 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkginfo@0.3.x: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" - -pkginfo@0.x.x: - version "0.4.0" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" - -plur@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" - dependencies: - irregular-plurals "^1.0.0" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" postcss-calc@^5.2.0: version "5.3.1" @@ -4406,15 +4550,9 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -prompt@~0.2.14: - version "0.2.14" - resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc" - dependencies: - pkginfo "0.x.x" - read "1.0.x" - revalidator "0.1.x" - utile "0.2.x" - winston "0.8.x" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" propagate@0.4.0: version "0.4.0" @@ -4438,7 +4576,7 @@ proxy-addr@~2.0.2: forwarded "~0.1.2" ipaddr.js "1.5.2" -pseudomap@^1.0.1: +pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4554,13 +4692,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read@1.0.x: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - dependencies: - mute-stream "~0.0.4" - -readable-stream@1.1, readable-stream@1.1.x, readable-stream@^1.1.12, readable-stream@~1.1.9: +readable-stream@1.1.x, readable-stream@^1.1.12, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: @@ -4569,7 +4701,7 @@ readable-stream@1.1, readable-stream@1.1.x, readable-stream@^1.1.12, readable-st isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@2.3.3, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@2.3.3, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -4744,9 +4876,12 @@ require-dir@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-0.3.2.tgz#c1d5c75e9fbffde9f2e6b33e383db4f594b5a6a9" -reserved-words@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.1.tgz#6f7c15e5e5614c50da961630da46addc87c0cef2" +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" resolve-dir@^0.1.0: version "0.1.1" @@ -4755,13 +4890,20 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolve@1.1.7, resolve@1.1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@~1.1.0, resolve@~1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -revalidator@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" rewire@2.5.2, rewire@^2.5.2: version "2.5.2" @@ -4773,7 +4915,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -4796,6 +4938,12 @@ rss@1.2.2: mime-types "2.1.13" xml "1.0.1" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + run-sequence@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-1.2.2.tgz#5095a0bebe98733b0140bd08dd80ec030ddacdeb" @@ -4803,6 +4951,16 @@ run-sequence@1.2.2: chalk "*" gulp-util "*" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -4940,9 +5098,15 @@ setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" -shelljs@0.3.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" should-equal@^1.0.0: version "1.0.1" @@ -4992,7 +5156,7 @@ sigmund@^1.0.1, sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -5020,6 +5184,12 @@ sinon@1.17.7: samsam "1.1.2" util ">=0.10.3 <1" +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -5038,12 +5208,6 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" -source-map-support@^0.4.0: - version "0.4.14" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" - dependencies: - source-map "^0.5.6" - "source-map@>= 0.1.2", source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -5129,7 +5293,7 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stack-trace@0.0.9, stack-trace@0.0.x: +stack-trace@0.0.9: version "0.0.9" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" @@ -5155,12 +5319,6 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" -string-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" - dependencies: - strip-ansi "^3.0.0" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -5169,6 +5327,13 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -5195,6 +5360,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -5207,10 +5378,6 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@1.0.x, strip-json-comments@~1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" - strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5291,6 +5458,12 @@ supports-color@^3.1.0, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -5303,6 +5476,17 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" +table@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + tar-pack@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" @@ -5340,7 +5524,7 @@ taskgroup@~2.0.0: ambi "~2.0.0" typechecker "~2.0.1" -text-table@^0.2.0: +text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5358,6 +5542,10 @@ through2@~0.2.1: readable-stream "~1.1.9" xtend "~2.1.1" +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + tildify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.0.0.tgz#2a021db5e8fbde0a8f8b4df37adaa8fb1d39d7dd" @@ -5383,24 +5571,16 @@ tiny-lr@^0.2.1: parseurl "~1.3.0" qs "~5.1.0" -tmp@0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: os-tmpdir "~1.0.2" -to-double-quotes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-double-quotes/-/to-double-quotes-2.0.0.tgz#aaf231d6fa948949f819301bbab4484d8588e4a7" - to-iso-string@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" -to-single-quotes@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/to-single-quotes/-/to-single-quotes-2.0.1.tgz#7cc29151f0f5f2c41946f119f5932fe554170125" - tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" @@ -5417,6 +5597,10 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -5570,17 +5754,6 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1: dependencies: inherits "2.0.1" -utile@0.2.x: - version "0.2.1" - resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7" - dependencies: - async "~0.2.9" - deep-equal "*" - i "0.3.x" - mkdirp "0.x.x" - ncp "0.4.x" - rimraf "2.x.x" - utils-merge@1.0.0, utils-merge@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" @@ -5593,10 +5766,6 @@ uuid@3.1.0, uuid@^3.0.0, uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" -uuid@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - v8flags@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" @@ -5644,25 +5813,6 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vow-fs@~0.3.4: - version "0.3.6" - resolved "https://registry.yarnpkg.com/vow-fs/-/vow-fs-0.3.6.tgz#2d4c59be22e2bf2618ddf597ab4baa923be7200d" - dependencies: - glob "^7.0.5" - uuid "^2.0.2" - vow "^0.4.7" - vow-queue "^0.4.1" - -vow-queue@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/vow-queue/-/vow-queue-0.4.2.tgz#e7fe17160e15c7c4184d1b666a9bc64e18e30184" - dependencies: - vow "~0.4.0" - -vow@^0.4.7, vow@~0.4.0, vow@~0.4.1, vow@~0.4.8: - version "0.4.15" - resolved "https://registry.yarnpkg.com/vow/-/vow-0.4.15.tgz#0579163aff6ba0ae05c456b2c0e4ca6373f111b3" - walkdir@^0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" @@ -5693,6 +5843,12 @@ which@^1.1.1, which@^1.2.12, which@~1.2.1: dependencies: isexe "^2.0.0" +which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + which@~1.0.5: version "1.0.9" resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" @@ -5711,18 +5867,6 @@ window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" -winston@0.8.x: - version "0.8.3" - resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" - dependencies: - async "0.2.x" - colors "0.6.x" - cycle "1.0.x" - eyes "0.1.x" - isstream "0.1.x" - pkginfo "0.3.x" - stack-trace "0.0.x" - wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -5746,6 +5890,12 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + xml2js@0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.6.tgz#d209c4e4dda1fc9c452141ef41c077f5adfdf6c4" @@ -5760,12 +5910,6 @@ xmlbuilder@0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-0.4.2.tgz#1776d65f3fdbad470a08d8604cdeb1c4e540ff83" -xmlbuilder@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-3.1.0.tgz#2c86888f2d4eade850fa38ca7f7223f7209516e1" - dependencies: - lodash "^3.5.0" - xoauth2@~0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/xoauth2/-/xoauth2-0.1.8.tgz#b916ff10ecfb54320f16f24a3e975120653ab0d2" @@ -5788,7 +5932,7 @@ y18n@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.0.0: +yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"