From 1d3c6492783b40ab7fe5036954af49b32adcb0e5 Mon Sep 17 00:00:00 2001 From: Maksim Date: Wed, 25 Jul 2018 20:21:26 +0300 Subject: [PATCH] Add eslint to project --- .eslintrc | 313 ++++++++ lib/parsers/configParser/configNormalizer.js | 19 +- lib/parsers/configParser/index.js | 4 +- lib/parsers/configParser/pathNormalizer.js | 4 +- lib/parsers/styleParser.js | 4 +- lib/replacer/freqAnalyzer.js | 17 +- lib/replacer/getIdentifier.js | 8 +- lib/replacer/index.js | 9 +- lib/utils/dataConstructor.js | 5 +- lib/utils/generateRegExp.js | 4 +- lib/utils/minificationReport.js | 12 +- package-lock.json | 773 +++++++++++++++++++ package.json | 23 +- perf/identifiers.js | 22 +- perf/index.js | 2 +- perf/replacer.js | 5 +- 16 files changed, 1156 insertions(+), 68 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..97183c5 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,313 @@ +{ + "parserOptions": { + "parser": "espree", + "ecmaVersion": 2018, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true, + "impliedStrict": true, + "templateStrings": true + } + }, + "env": { + "node": true, + "browser": true, + "shared-node-browser": true, + "worker": true, + "serviceworker": true, + "commonjs": true, + "jquery": true, + "mongo": true, + "jasmine": true, + "mocha": true, + "es6": true + }, + "rules": { + "lines-between-class-members": [1, "always", { "exceptAfterSingleLine": true }], + "multiline-comment-style": 0, + "for-direction": 2, + "no-await-in-loop": 1, + "function-paren-newline": [1, "multiline"], + "no-compare-neg-zero": 2, + "no-cond-assign": [2, "except-parens"], + "no-console": 0, + "no-constant-condition": 1, + "no-control-regex": 1, + "no-debugger": 1, + "no-dupe-args": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-empty": 1, + "no-empty-function": 1, + "no-empty-character-class": 1, + "no-ex-assign": 2, + "no-extra-boolean-cast": 2, + "no-extra-parens": [1, "all", { "conditionalAssign": true, "returnAssign": true, "nestedBinaryExpressions": true, "ignoreJSX": "all", "enforceForArrowConditionals": false }], + "no-extra-semi": 2, + "no-func-assign": 2, + "no-inner-declarations": [2, "both"], + "no-invalid-regexp": 2, + "no-irregular-whitespace": [2, { "skipComments": true, "skipTemplates": true, "skipStrings": true, "skipRegExps": true }], + "no-obj-calls": 2, + "no-prototype-builtins": 0, + "no-regex-spaces": 2, + "no-sparse-arrays": 2, + "no-template-curly-in-string": 1, + "no-unexpected-multiline": 2, + "no-unreachable": 2, + "no-unsafe-finally": 2, + "no-unsafe-negation": 2, + "use-isnan": 2, + "valid-jsdoc": [ 1, { "requireReturn": false, "prefer": { "arg": "param", "argument": "param", "returns": "return" }, "preferType": { "Boolean": "boolean", "Function": "function", "Array": "array", "Set": "set", "Map": "map", "Number": "number", "Object": "object", "String": "string" } } ], + "valid-typeof": [2, { "requireStringLiterals": true }], + "accessor-pairs": 1, + "array-callback-return": [2, { "allowImplicit": true }], + "block-scoped-var": 2, + "class-methods-use-this": 1, + "complexity": 0, + "consistent-return": 0, + "curly": [1, "all"], + "default-case": 2, + "dot-location": [1, "property"], + "dot-notation": 1, + "eqeqeq": [2, "always"], + "guard-for-in": 1, + "no-alert": 2, + "no-caller": 2, + "no-case-declarations": 2, + "no-div-regex": 1, + "no-else-return": [1, { "allowElseIf": true }], + "no-empty-pattern": 2, + "no-eq-null": 2, + "no-eval": 2, + "no-extend-native": 0, + "no-extra-bind": 2, + "no-extra-label": 2, + "no-fallthrough": 2, + "no-floating-decimal": 2, + "no-global-assign": 2, + "no-implicit-coercion": 2, + "no-implicit-globals": 0, + "no-implied-eval": 2, + "no-invalid-this": 0, + "no-iterator": 2, + "no-labels": 2, + "no-lone-blocks": 2, + "no-loop-func": 2, + "no-magic-numbers": 0, + "no-multi-spaces": [1, { "ignoreEOLComments": true }], + "no-multi-str": 2, + "no-new": 1, + "no-new-func": 2, + "no-new-wrappers": 2, + "no-octal": 2, + "no-octal-escape": 2, + "no-param-reassign": [2, { "props": false }], + "no-proto": 0, + "no-redeclare": [2, { "builtinGlobals": true }], + "no-restricted-properties": 0, + "no-return-assign": [2, "except-parens"], + "no-return-await": 1, + "no-script-url": 2, + "no-self-assign": [2, {"props": true}], + "no-self-compare": 2, + "no-sequences": 2, + "no-throw-literal": 1, + "no-unmodified-loop-condition": 1, + "no-unused-expressions": [2, { "allowTaggedTemplates": true }], + "no-unused-labels": 1, + "no-useless-call": 1, + "no-useless-concat": 1, + "no-useless-escape": 1, + "no-useless-return": 1, + "no-void": 1, + "no-warning-comments": 0, + "no-with": 2, + "prefer-promise-reject-errors": 0, + "radix": 2, + "require-await": 2, + "vars-on-top": 2, + "wrap-iife": [2, "inside", { "functionPrototypeMethods": true }], + "yoda": [2, "never", { "onlyEquality": true } ], + "strict": 0, + "init-declarations": 0, + "no-catch-shadow": 2, + "no-delete-var": 2, + "no-label-var": 2, + "no-restricted-globals": 0, + "no-shadow": [2, { "builtinGlobals": true, "hoist": "all", "allow": ["name", "event", "e", "error", "context"] }], + "no-shadow-restricted-names": 2, + "no-undef": 1, + "no-undef-init": 2, + "no-undefined": 0, + "no-unused-vars": [1, {"caughtErrors": "all", "args": "after-used", "ignoreRestSiblings": true }], + "no-use-before-define": 2, + "callback-return": 0, + "global-require": 0, + "handle-callback-err": [1, "^.*(e|E)rr"], + "no-buffer-constructor": 2, + "no-mixed-requires": 0, + "no-new-require": 2, + "no-path-concat": 2, + "no-process-env": 0, + "no-process-exit": 0, + "no-restricted-modules": 0, + "no-sync": 2, + "array-bracket-newline": [1, { "multiline": true}], + "array-bracket-spacing": [1, "never"], + "array-element-newline": 0, + "block-spacing": [1, "never"], + "brace-style": [1, "stroustrup", { "allowSingleLine": true }], + "camelcase": [1, {"properties": "never"}], + "capitalized-comments": 0, + "comma-dangle": [1, "never"], + "comma-spacing": [1, { "before": false, "after": true }], + "comma-style": [1, "last"], + "computed-property-spacing": [1, "never"], + "consistent-this": [1, "that"], + "eol-last": 0, + "func-call-spacing": [1, "never"], + "func-name-matching": [1, "always"], + "func-names": [1, "as-needed"], + "func-style": [1, "declaration", { "allowArrowFunctions": true }], + "id-blacklist": 0, + "id-length": 0, + "id-match": 0, + "indent": [1, 2, { + "VariableDeclarator": { "var": 2, "let": 2, "const": 3 }, + "FunctionExpression": {"body": 1, "parameters": "first"}, + "FunctionDeclaration": {"body": 1, "parameters": "first"}, + "MemberExpression": 1, + "ArrayExpression": 1, + "ObjectExpression": 1, + "CallExpression": {"arguments": 1}, + "SwitchCase": 1, + "outerIIFEBody": 1 } ], + "jsx-quotes": [1, "prefer-double"], + "key-spacing": [1, { "beforeColon": false, "afterColon": true, "mode": "strict" }], + "keyword-spacing": [1, { "before": true, "after": true }], + "line-comment-position": 0, + "linebreak-style": 0, + "lines-around-comment": 0, + "max-depth": 0, + "max-len": [ + 2, + { + "code": 85, + "ignoreComments": false, + "ignoreTrailingComments": true, + "ignoreTemplateLiterals": true, + "ignoreRegExpLiterals": true, + "ignoreStrings": true, + "ignoreUrls": true, + "tabWidth": 2 + } + ], + "max-lines": 0, + "max-nested-callbacks": [1, 5], + "max-params": [1, 5], + "max-statements": [2, 50], + "max-statements-per-line": [1, { "max": 4 }], + "multiline-ternary": 0, + "new-cap": [1, { "newIsCap": true, "capIsNew": false, "properties": false }], + "new-parens": 2, + "newline-per-chained-call": 0, + "no-array-constructor": 2, + "no-bitwise": [1, { "allow": ["~", ">>>", ">>", "<<"], "int32Hint": true }], + "no-continue": 0, + "no-inline-comments": 0, + "no-lonely-if": 2, + "no-mixed-operators": 0, + "no-mixed-spaces-and-tabs": 2, + "no-multi-assign": 0, + "no-multiple-empty-lines": [1, { "max": 2}], + "no-negated-condition": 0, + "no-nested-ternary": 2, + "no-new-object": 2, + "no-plusplus": 0, + "no-restricted-syntax": 0, + "no-tabs": 0, + "no-ternary": 0, + "no-trailing-spaces": [1, { "skipBlankLines": false, "ignoreComments": true }], + "no-underscore-dangle": 0, + "no-unneeded-ternary": [2, {"defaultAssignment": true}], + "no-whitespace-before-property": 1, + "nonblock-statement-body-position": [1, "beside"], + "object-curly-newline": [1, {"multiline": true, "consistent": true}], + "object-curly-spacing": [1, "never"], + "object-property-newline": [1, { "allowAllPropertiesOnSameLine": true }], + "one-var": 0, + "one-var-declaration-per-line": [1, "initializations"], + "operator-assignment": 0, + "operator-linebreak": [1, "after"], + "padded-blocks": [1, "never"], + "padding-line-between-statements": [ + 1, + { "blankLine": "always", "prev": "*", "next": "return" }, + { "blankLine": "always", "prev": "*", "next": "continue" }, + { "blankLine": "always", "prev": "*", "next": "break" }, + { "blankLine": "always", "prev": "*", "next": "function" }, + { "blankLine": "always", "prev": "function", "next": "*" }, + { "blankLine": "always", "prev": "*", "next": "for" }, + { "blankLine": "always", "prev": "for", "next": "*" }, + { "blankLine": "always", "prev": ["const", "let", "var"], "next": "*"}, + { "blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"]}, + { "blankLine": "always", "prev": "import", "next": "*" }, + { "blankLine": "any", "prev": "import", "next": "import" }, + { "blankLine": "always", "prev": "for", "next": "*" }, + { "blankLine": "always", "prev": "directive", "next": "*" }, + { "blankLine": "always", "prev": "if", "next": "*" }, + { "blankLine": "always", "prev": "*", "next": "if" }, + { "blankLine": "any", "prev": "if", "next": "if" } + ], + "quote-props": [1, "consistent-as-needed", { "numbers": true }], + "quotes": [1, "single", { "avoidEscape": true }], + "require-jsdoc": [1, { "require": { "FunctionDeclaration": false, "MethodDefinition": false, "ClassDeclaration": true, "ArrowFunctionExpression": false, "FunctionExpression": false } }], + "semi": [1, "never"], + "semi-spacing": 0, + "semi-style": 0, + "sort-keys": 0, + "sort-vars": 0, + "space-before-blocks": [1, "always"], + "space-before-function-paren": [1, "always"], + "space-in-parens": [1, "never"], + "space-infix-ops": [1, {"int32Hint": true}], + "space-unary-ops": [1, {"words": true, "nonwords": false}], + "spaced-comment": [1, "always"], + "no-useless-constructor": 1, + "no-useless-rename": 1, + "no-var": 2, + "object-shorthand": [1, "always"], + "switch-colon-spacing": [1, {"after": true, "before": false}], + "template-tag-spacing": [1, "never"], + "unicode-bom": [2, "never"], + "wrap-regex": 1, + "arrow-body-style": [1, "as-needed"], + "arrow-parens": [1, "as-needed"], + "arrow-spacing": [1, { "before": true, "after": true }], + "constructor-super": 2, + "generator-star-spacing": [1, {"before": true, "after": false}], + "no-class-assign": 2, + "no-confusing-arrow": [1, {"allowParens": true}], + "no-const-assign": 2, + "no-dupe-class-members": 2, + "no-duplicate-imports": 1, + "no-new-symbol": 2, + "no-restricted-imports": 0, + "no-this-before-super": 2, + "no-useless-computed-key": 1, + "prefer-arrow-callback": 0, + "prefer-const": [1, {"destructuring": "all"}], + "prefer-destructuring": 0, + "prefer-numeric-literals": 0, + "prefer-rest-params": 1, + "prefer-spread": 1, + "prefer-template": 1, + "require-yield": 2, + "rest-spread-spacing": [1, "never"], + "sort-imports": 0, + "symbol-description": 1, + "template-curly-spacing": [1, "never"], + "yield-star-spacing": [1, "after"] + } +} \ No newline at end of file diff --git a/lib/parsers/configParser/configNormalizer.js b/lib/parsers/configParser/configNormalizer.js index d916991..39110ef 100644 --- a/lib/parsers/configParser/configNormalizer.js +++ b/lib/parsers/configParser/configNormalizer.js @@ -1,19 +1,20 @@ const pathNormalizer = require('./pathNormalizer'), logger = require('../../utils/logger') + /** * Normalizes configuration object - * @param {Object} config Configuration object - * @return {Object} Normalized config object + * @param {object} config Configuration object + * @return {object} Normalized config object */ function configNormalizer (config) { const baseConfig = { - style: '', - files: '', - unused: false, - verbose: false, - exclude: [] - }, - dotRegExp = /\./g + style: '', + files: '', + unused: false, + verbose: false, + exclude: [] + }, + dotRegExp = /\./g const {style, files, unused, verbose, exclude} = config diff --git a/lib/parsers/configParser/index.js b/lib/parsers/configParser/index.js index 3366df2..cf51598 100644 --- a/lib/parsers/configParser/index.js +++ b/lib/parsers/configParser/index.js @@ -4,8 +4,8 @@ const pathNormalizer = require('./pathNormalizer'), /** * Parses config object if any provided - * @param {Object} [configObject] Configuration object - * @return {Object} Resulted config object + * @param {object} [configObject] Configuration object + * @return {object} Resulted config object */ function configParser (configObject) { // Programmatic invoke case diff --git a/lib/parsers/configParser/pathNormalizer.js b/lib/parsers/configParser/pathNormalizer.js index 6f7476d..cb6c62d 100644 --- a/lib/parsers/configParser/pathNormalizer.js +++ b/lib/parsers/configParser/pathNormalizer.js @@ -4,8 +4,8 @@ const path = require('path'), /** * Normalizes relative path - * @param {String} rawPath Path string - * @return {Object} Normalized file path data + * @param {string} rawPath Path string + * @return {object} Normalized file path data */ function pathNormalizer (rawPath) { const {name, ext, base} = path.parse(rawPath), diff --git a/lib/parsers/styleParser.js b/lib/parsers/styleParser.js index 68553a6..6fdeb67 100644 --- a/lib/parsers/styleParser.js +++ b/lib/parsers/styleParser.js @@ -3,8 +3,8 @@ const csstree = require('css-tree'), /** * Parses all class selectors in css file - * @param {String} styleFile Content of css file - * @return {String[]} Array of selectors (class names currently) + * @param {string} styleFile Content of css file + * @return {array} Array of selectors (class names currently) */ function styleParser (styleFile) { const ast = csstree.parse(styleFile, { diff --git a/lib/replacer/freqAnalyzer.js b/lib/replacer/freqAnalyzer.js index 3286b4f..c3e4597 100644 --- a/lib/replacer/freqAnalyzer.js +++ b/lib/replacer/freqAnalyzer.js @@ -2,15 +2,15 @@ const generateRegExp = require('../utils/generateRegExp') /** * Analyzes the frequency of occurrence of classes in files - * @param {String[]} selectors Array of selectors - * @param {Object} data Files/style content - * @param {Object} config Configuration object - * @return {Array[]} Frequency data for each selector + * @param {array} selectors Array of selectors + * @param {object} data Files/style content + * @param {object} config Configuration object + * @return {array} Frequency data for each selector */ function freqAnalyzer (selectors, data, config) { let selectorsData = selectors.map(value => ({ - name: value, count: 0, newName: '' - })) + name: value, count: 0, newName: '' + })) const files = data.files, selectorsCount = selectorsData.length, filesCount = files.length, @@ -21,7 +21,7 @@ function freqAnalyzer (selectors, data, config) { const selector = selectorsData[i], replaceReg = selector.replaceReg = generateRegExp(selector.name, false) - selector.replaceRegWithDot = generateRegExp(selector.name, true) + selector.replaceRegWithDot = generateRegExp(selector.name, true) for (let j = 0; j < filesCount; j++) { const file = files[j].content, @@ -36,7 +36,8 @@ function freqAnalyzer (selectors, data, config) { const usedOnlySelectorsData = selectorsData .filter(selector => selector.count) - data.report.unusedSelectorsCount = selectorsData.length - usedOnlySelectorsData.length + data.report.unusedSelectorsCount = + selectorsData.length - usedOnlySelectorsData.length if (!unused) { selectorsData = usedOnlySelectorsData diff --git a/lib/replacer/getIdentifier.js b/lib/replacer/getIdentifier.js index 3cdbf4f..2d76097 100644 --- a/lib/replacer/getIdentifier.js +++ b/lib/replacer/getIdentifier.js @@ -1,9 +1,9 @@ /** * Generates unique string - * @param {Number[]} bits Array of bits thats represents some number - * @param {String[]} symbols Symbols list - * @param {Number} symbolsLastIndex Last index value in symbols list - * @return {String} Next unique indentifier + * @param {array} bits Array of bits thats represents some number + * @param {array} symbols Symbols list + * @param {number} symbolsLastIndex Last index value in symbols list + * @return {string} Next unique indentifier */ function getIdentifier (bits, symbols, symbolsLastIndex) { const lowerBitIndex = bits.length - 1 diff --git a/lib/replacer/index.js b/lib/replacer/index.js index e49532d..ef9308d 100644 --- a/lib/replacer/index.js +++ b/lib/replacer/index.js @@ -1,10 +1,9 @@ -const getIdentifier = require('./getIdentifier'), - generateRegExp = require('../utils/generateRegExp') +const getIdentifier = require('./getIdentifier') /** * Replaces selectors to more shorter in all files - * @param {Array} selectorsData Frequency data for each selector - * @param {Object} data Object with files/style content + * @param {array} selectorsData Frequency data for each selector + * @param {object} data Object with files/style content * @return {undefined} Returns nothing */ function replacer (selectorsData, data) { @@ -31,7 +30,7 @@ function replacer (selectorsData, data) { for (let n = 0; n < resourcesCount; n++) { const file = files[n] - file.content = file.content.replace(selector.replaceReg, `\$1${newName}`) + file.content = file.content.replace(selector.replaceReg, `$1${newName}`) file.minifiedSize = file.content.length } diff --git a/lib/utils/dataConstructor.js b/lib/utils/dataConstructor.js index 6822c63..1e606fe 100644 --- a/lib/utils/dataConstructor.js +++ b/lib/utils/dataConstructor.js @@ -1,7 +1,7 @@ /** * Constructs from config data object with files/style content - * @param {Object} config Configuration object - * @return {Object} Object with files/style content + * @param {object} config Configuration object + * @return {object} Object with files/style content */ function dataConstructor (config) { const baseData = { @@ -23,6 +23,7 @@ function dataConstructor (config) { for (let i = 0; i < configFilesLength; i++) { const filePath = configFiles[i] + baseFiles.push({ path: filePath.fullPath, fileName: filePath.fileName, diff --git a/lib/utils/generateRegExp.js b/lib/utils/generateRegExp.js index f177983..ea15d4d 100644 --- a/lib/utils/generateRegExp.js +++ b/lib/utils/generateRegExp.js @@ -2,8 +2,8 @@ const escapeRegExp = /[.*+?^${}()|[\]\\]/g /** * Generates regular expression from string - * @param {String} selector Selector - * @param {Boolean} withDot Must be a dot char included in regexp + * @param {string} selector Selector + * @param {boolean} withDot Must be a dot char included in regexp * @return {RegExp} RegExp object */ function generateRegExp (selector, withDot) { diff --git a/lib/utils/minificationReport.js b/lib/utils/minificationReport.js index 6338ea4..615be18 100644 --- a/lib/utils/minificationReport.js +++ b/lib/utils/minificationReport.js @@ -8,12 +8,6 @@ function logTime (startTime) { } function logMinification (data) { - const totalSize = toKB(data.files - .reduce((acc, f) => acc + f.size, 0) + data.style.size), - totalMinifiedSize = toKB(data.files - .reduce((acc, f) => acc + f.minifiedSize, 0) + data.style.minifiedSize), - totalDiff = (totalSize - totalMinifiedSize).toFixed(2) - function toKB (num) { return parseFloat(num / 1024).toFixed(2) } @@ -26,6 +20,12 @@ function logMinification (data) { logger.info(`${fileName} ${sizeKb}KB -> ${minifiedSizeKb}KB | diff: ${diff}KB`) } + const totalSize = toKB(data.files + .reduce((acc, f) => acc + f.size, 0) + data.style.size), + totalMinifiedSize = toKB(data.files + .reduce((acc, f) => acc + f.minifiedSize, 0) + data.style.minifiedSize), + totalDiff = (totalSize - totalMinifiedSize).toFixed(2) + logFileMinification(data.style) data.files.forEach(logFileMinification) diff --git a/package-lock.json b/package-lock.json index 14bd5c9..9c5b37c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,15 @@ "acorn": "^5.0.0" } }, + "acorn-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", + "dev": true, + "requires": { + "acorn": "^5.0.3" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -57,6 +66,12 @@ "json-schema-traverse": "^0.3.0" } }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -175,6 +190,21 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -645,6 +675,23 @@ "unset-value": "^1.0.0" } }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + }, + "dependencies": { + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + } + } + }, "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", @@ -694,12 +741,24 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", "dev": true }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -723,6 +782,21 @@ } } }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -830,6 +904,29 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.5.tgz", + "integrity": "sha512-94j37OtvxS5w7qr7Ta6dt67tWdnOxigBVN4VnSxNXFez9o18PGQ0D33SchKP17r9LAcWVTYV72G6vDayAUBFIg==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, "cross-env": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", @@ -990,6 +1087,21 @@ } } }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1017,6 +1129,15 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1102,12 +1223,150 @@ } } }, + "eslint": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.2.0.tgz", + "integrity": "sha512-zlggW1qp7/TBjwLfouRoY7eWXrXwJZFqCdIxxh0/LVB/QuuKuIMkzyUZEcDo6LBadsry5JcEMxIqd3H/66CXVg==", + "dev": true, + "requires": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.1.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "string.prototype.matchall": "^2.0.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "dev": true, + "requires": { + "acorn": "^5.6.0", + "acorn-jsx": "^4.1.1" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -1281,6 +1540,17 @@ } } }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -1385,6 +1655,25 @@ "bser": "^2.0.0" } }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -1433,6 +1722,18 @@ "locate-path": "^2.0.0" } }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2021,12 +2322,24 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -2087,6 +2400,20 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -2167,6 +2494,12 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2235,12 +2568,149 @@ "sshpk": "^1.7.0" } }, + "husky": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.0.0-rc.13.tgz", + "integrity": "sha512-ZNNoaBgfOHRA05UHS/etBoWFDu65mjPoohPYQwOqb5155KOovBp8LMkMoNK0kn3VYdsm+HWdtuHbD4XjfzlfpQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.2", + "execa": "^0.9.0", + "find-up": "^3.0.0", + "get-stdin": "^6.0.0", + "is-ci": "^1.1.0", + "pkg-dir": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "read-pkg": "^4.0.1", + "run-node": "^1.0.0", + "slash": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, + "ignore": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.2.tgz", + "integrity": "sha512-uoxnT7PYpyEnsja+yX+7v49B7LXxmzDJ2JALqHH3oEGzpM2U1IGcbfnOr8Dt57z3B/UWs7/iAgPFbmye8m4I0g==", + "dev": true + }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", @@ -2273,6 +2743,27 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -2367,6 +2858,12 @@ } } }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", @@ -2433,6 +2930,30 @@ "kind-of": "^3.0.2" } }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2454,6 +2975,12 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -2463,6 +2990,12 @@ "has": "^1.0.1" } }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3085,6 +3618,12 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3097,6 +3636,12 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3443,6 +3988,12 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -3636,6 +4187,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -3766,6 +4326,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -3825,6 +4391,21 @@ "find-up": "^2.1.0" } }, + "please-upgrade-node": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", + "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -3879,6 +4460,12 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, "prompts": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.12.tgz", @@ -4029,6 +4616,21 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -4133,6 +4735,24 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -4160,6 +4780,16 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -4191,6 +4821,30 @@ "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4276,6 +4930,12 @@ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -4344,6 +5004,15 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -4596,6 +5265,19 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.matchall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", + "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4634,6 +5316,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -4642,12 +5330,58 @@ "has-flag": "^3.0.0" } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", "dev": true }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, "test-exclude": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", @@ -4690,12 +5424,33 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "throat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -4906,6 +5661,15 @@ } } }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -5110,6 +5874,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", diff --git a/package.json b/package.json index 136f7af..e90cf19 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,15 @@ "scripts": { "test": "cross-env NODE_ENV=TEST jest", "test:cover": "cross-env NODE_ENV=TEST jest --coverage", - "perf": "node --allow-natives-syntax ./perf" + "perf": "node --allow-natives-syntax ./perf", + "lint": "eslint --color --max-warnings 0 perf bin lib tests", + "lint:fix": "eslint --fix --color --max-warnings 0 perf bin lib tests", + "prepublishOnly": "npm run lint" + }, + "husky": { + "hooks": { + "pre-commit": "npm run lint" + } }, "files": [ "bin", @@ -44,6 +52,8 @@ }, "devDependencies": { "cross-env": "^5.2.0", + "eslint": "^5.2.0", + "husky": "^1.0.0-rc.13", "jest": "^23.4.1", "v8-natives": "^1.1.0" }, @@ -55,16 +65,5 @@ ], "engines": { "node": ">=7.0.0" - }, - "eslintConfig": { - "env": { - "browser": true, - "node": true, - "jest": true - }, - "globals": { - "Promise": true, - "Set": true - } } } diff --git a/perf/identifiers.js b/perf/identifiers.js index b6bbc7d..4c1a879 100644 --- a/perf/identifiers.js +++ b/perf/identifiers.js @@ -1,18 +1,18 @@ const getIdentifier = require('../lib/replacer/getIdentifier'), - v8 = require('v8-natives'); + v8 = require('v8-natives') const bits = [0], - symbols = [ - 'a', - 'b', - 'c' - ], - symbolsLastIndex = symbols.length - 1 + symbols = [ + 'a', + 'b', + 'c' + ], + symbolsLastIndex = symbols.length - 1 + +for (let i = 0; i <= 7; i++) { + getIdentifier(bits, symbols, symbolsLastIndex) +} - for (let i = 0; i <= 7; i++) { - getIdentifier(bits, symbols, symbolsLastIndex) - } - getIdentifier(bits, symbols, symbolsLastIndex) v8.optimizeFunctionOnNextCall(getIdentifier) getIdentifier(bits, symbols, symbolsLastIndex) diff --git a/perf/index.js b/perf/index.js index 2cc416b..89336d4 100644 --- a/perf/index.js +++ b/perf/index.js @@ -3,7 +3,7 @@ const modules = [ 'identifiers' ] -function invokeModule(name) { +function invokeModule (name) { require(`./${name}.js`) } diff --git a/perf/replacer.js b/perf/replacer.js index 6eb2dfc..0a22a3d 100644 --- a/perf/replacer.js +++ b/perf/replacer.js @@ -1,9 +1,9 @@ const replacer = require('../lib/replacer'), freqAnalyzer = require('../lib/replacer/freqAnalyzer'), styleParser = require('../lib/parsers/styleParser'), - v8 = require('v8-natives'); + v8 = require('v8-natives') -function getData() { +function getData () { return { style: { path: 'somepath.css', @@ -22,6 +22,7 @@ function getData() { } } } + const data = getData(), data1 = getData(), selectors = styleParser(data.style.content),