diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..9f89f364 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# editorconfig.org + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = true +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..d6444abd --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +/node_modules +/lib/url/escape.js +/lib/css-base.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..f5064a31 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + root: true, + plugins: ['prettier'], + extends: ['@webpack-contrib/eslint-config-webpack'], + rules: { + 'prettier/prettier': [ + 'error', + { singleQuote: true, trailingComma: 'es5', arrowParens: 'always' }, + ], + }, +}; diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index ff314c41..00000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,247 +0,0 @@ -env: - es6: true - node: true -extends: 'eslint:recommended' -parserOptions: - sourceType: module -rules: - accessor-pairs: error - array-bracket-spacing: 'off' - array-callback-return: error - arrow-body-style: error - arrow-parens: error - arrow-spacing: error - block-scoped-var: 'off' - block-spacing: - - error - - always - brace-style: - - error - - 1tbs - - allowSingleLine: true - callback-return: 'off' - camelcase: - - error - - properties: never - capitalized-comments: 'off' - class-methods-use-this: error - comma-dangle: 'off' - comma-spacing: - - error - - after: true - before: false - comma-style: - - error - - last - complexity: error - computed-property-spacing: - - error - - never - consistent-return: 'off' - consistent-this: error - curly: 'off' - default-case: 'off' - dot-location: error - dot-notation: - - error - - allowKeywords: true - eol-last: error - eqeqeq: 'off' - func-call-spacing: error - func-name-matching: 'off' - func-names: 'off' - func-style: - - error - - declaration - generator-star-spacing: error - global-require: 'off' - guard-for-in: error - handle-callback-err: error - id-blacklist: error - id-length: 'off' - id-match: error - indent: 'off' - init-declarations: 'off' - jsx-quotes: error - key-spacing: error - keyword-spacing: 'off' - line-comment-position: 'off' - linebreak-style: - - error - - unix - lines-around-comment: error - lines-around-directive: error - max-depth: error - max-len: 'off' - max-lines: error - max-nested-callbacks: error - max-params: 'off' - max-statements: 'off' - max-statements-per-line: error - multiline-ternary: 'off' - new-cap: error - 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: error - no-caller: error - no-catch-shadow: error - no-confusing-arrow: error - no-continue: error - no-div-regex: error - no-duplicate-imports: error - no-else-return: 'off' - no-empty-function: error - no-eq-null: 'off' - 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: 'off' - no-iterator: error - no-label-var: error - no-labels: error - no-lone-blocks: error - no-lonely-if: error - no-loop-func: error - no-magic-numbers: 'off' - no-mixed-operators: error - no-mixed-requires: error - no-multi-assign: error - 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: error - 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: error - no-plusplus: - - error - - allowForLoopAfterthoughts: true - no-process-env: error - no-process-exit: error - no-proto: error - no-prototype-builtins: error - 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: error - no-shadow-restricted-names: error - no-spaced-func: error - no-sync: 'off' - no-tabs: 'off' - no-template-curly-in-string: error - no-ternary: 'off' - no-throw-literal: error - no-trailing-spaces: - - error - - skipBlankLines: true - no-undef-init: error - no-undefined: 'off' - no-underscore-dangle: error - no-unmodified-loop-condition: error - no-unneeded-ternary: error - no-unused-expressions: error - no-use-before-define: 'off' - no-useless-call: error - no-useless-computed-key: error - no-useless-concat: error - no-useless-constructor: error - no-useless-escape: error - no-useless-rename: error - no-useless-return: error - no-var: 'off' - no-void: error - no-warning-comments: error - no-whitespace-before-property: error - no-with: error - object-curly-newline: 'off' - object-curly-spacing: 'off' - object-property-newline: - - error - - allowMultiplePropertiesPerLine: true - object-shorthand: 'off' - one-var: 'off' - one-var-declaration-per-line: error - operator-assignment: error - operator-linebreak: 'off' - padded-blocks: 'off' - prefer-arrow-callback: 'off' - prefer-const: error - prefer-destructuring: - - error - - array: false - object: false - prefer-numeric-literals: error - prefer-promise-reject-errors: error - prefer-reflect: 'off' - prefer-rest-params: error - prefer-spread: error - prefer-template: 'off' - quote-props: 'off' - quotes: 'off' - radix: - - error - - always - require-await: error - require-jsdoc: 'off' - rest-spread-spacing: error - semi: 'off' - semi-spacing: - - error - - after: true - before: false - sort-imports: error - sort-keys: 'off' - sort-vars: error - space-before-blocks: 'off' - space-before-function-paren: 'off' - space-in-parens: - - error - - never - space-infix-ops: error - space-unary-ops: error - spaced-comment: 'off' - strict: error - symbol-description: error - template-curly-spacing: error - unicode-bom: - - error - - never - valid-jsdoc: error - vars-on-top: 'off' - wrap-iife: - - error - - any - wrap-regex: 'off' - yield-star-spacing: error - yoda: - - error - - never diff --git a/.gitattributes b/.gitattributes index b1c30adb..70df4c97 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ -yarn.lock -diff +package-lock.json -diff * text=auto bin/* eol=lf diff --git a/.gitignore b/.gitignore index 2e544caf..d81a67f1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,18 @@ -node_modules -coverage -npm-debug.log +logs +*.log +npm-debug.log* +.eslintcache + +/coverage +/dist +/local +/reports +/node_modules + +.DS_Store +Thumbs.db .idea +*.iml +.vscode +*.sublime-project +*.sublime-workspace diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..e537c8ad --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "always" +} diff --git a/lib/compile-exports.js b/lib/compile-exports.js index 19ca14f1..581a65b6 100644 --- a/lib/compile-exports.js +++ b/lib/compile-exports.js @@ -1,51 +1,60 @@ -var camelCase = require("lodash/camelCase"); +const camelCase = require('lodash/camelCase'); function dashesCamelCase(str) { - return str.replace(/-+(\w)/g, function(match, firstLetter) { - return firstLetter.toUpperCase(); - }); + return str.replace(/-+(\w)/g, (match, firstLetter) => + firstLetter.toUpperCase() + ); } -module.exports = function compileExports(result, importItemMatcher, camelCaseKeys) { +module.exports = function compileExports( + result, + importItemMatcher, + camelCaseKeys +) { if (!Object.keys(result.exports).length) { - return ""; + return ''; } - var exportJs = Object.keys(result.exports).reduce(function(res, key) { - var valueAsString = JSON.stringify(result.exports[key]); - valueAsString = valueAsString.replace(result.importItemRegExpG, importItemMatcher); - function addEntry(k) { - res.push("\t" + JSON.stringify(k) + ": " + valueAsString); - } + const exportJs = Object.keys(result.exports) + .reduce((res, key) => { + let valueAsString = JSON.stringify(result.exports[key]); + valueAsString = valueAsString.replace( + result.importItemRegExpG, + importItemMatcher + ); + function addEntry(k) { + res.push(`\t${JSON.stringify(k)}: ${valueAsString}`); + } - var targetKey; - switch(camelCaseKeys) { - case true: - addEntry(key); - targetKey = camelCase(key); - if (targetKey !== key) { - addEntry(targetKey); - } - break; - case 'dashes': - addEntry(key); - targetKey = dashesCamelCase(key); - if (targetKey !== key) { - addEntry(targetKey); - } - break; - case 'only': - addEntry(camelCase(key)); - break; - case 'dashesOnly': - addEntry(dashesCamelCase(key)); - break; - default: - addEntry(key); - break; - } - return res; - }, []).join(",\n"); + let targetKey; + switch (camelCaseKeys) { + case true: + addEntry(key); + targetKey = camelCase(key); + if (targetKey !== key) { + addEntry(targetKey); + } + break; + case 'dashes': + addEntry(key); + targetKey = dashesCamelCase(key); + if (targetKey !== key) { + addEntry(targetKey); + } + break; + case 'only': + addEntry(camelCase(key)); + break; + case 'dashesOnly': + addEntry(dashesCamelCase(key)); + break; + default: + addEntry(key); + break; + } + return res; + }, []) + .join(',\n'); - return "{\n" + exportJs + "\n}"; + return `{\n${exportJs}\n}`; }; diff --git a/lib/css-base.js b/lib/css-base.js index 7b9a4b4b..2bcd040d 100644 --- a/lib/css-base.js +++ b/lib/css-base.js @@ -1,76 +1,82 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra */ // css base code, injected by the css-loader module.exports = function(useSourceMap) { - var list = []; + var list = []; - // return the list of modules as css string - list.toString = function toString() { - return this.map(function (item) { - var content = cssWithMappingToString(item, useSourceMap); - if(item[2]) { - return "@media " + item[2] + "{" + content + "}"; - } else { - return content; - } - }).join(""); - }; + // return the list of modules as css string + list.toString = function toString() { + return this.map(function(item) { + var content = cssWithMappingToString(item, useSourceMap); + if (item[2]) { + return '@media ' + item[2] + '{' + content + '}'; + } else { + return content; + } + }).join(''); + }; - // import a list of modules into the list - list.i = function(modules, mediaQuery) { - if(typeof modules === "string") - modules = [[null, modules, ""]]; - var alreadyImportedModules = {}; - for(var i = 0; i < this.length; i++) { - var id = this[i][0]; - if(id != null) - alreadyImportedModules[id] = true; - } - for(i = 0; i < modules.length; i++) { - var item = modules[i]; - // skip already imported module - // this implementation is not 100% perfect for weird media query combinations - // when a module is imported multiple times with different media queries. - // I hope this will never occur (Hey this way we have smaller bundles) - if(item[0] == null || !alreadyImportedModules[item[0]]) { - if(mediaQuery && !item[2]) { - item[2] = mediaQuery; - } else if(mediaQuery) { - item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; - } - list.push(item); - } - } - }; - return list; + // import a list of modules into the list + list.i = function(modules, mediaQuery) { + if (typeof modules === 'string') { + modules = [[null, modules, '']]; + } + var alreadyImportedModules = {}; + for (var i = 0; i < this.length; i++) { + var id = this[i][0]; + if (id != null) { + alreadyImportedModules[id] = true; + } + } + for (i = 0; i < modules.length; i++) { + var item = modules[i]; + // skip already imported module + // this implementation is not 100% perfect for weird media query combinations + // when a module is imported multiple times with different media queries. + // I hope this will never occur (Hey this way we have smaller bundles) + if (item[0] == null || !alreadyImportedModules[item[0]]) { + if (mediaQuery && !item[2]) { + item[2] = mediaQuery; + } else if (mediaQuery) { + item[2] = '(' + item[2] + ') and (' + mediaQuery + ')'; + } + list.push(item); + } + } + }; + return list; }; function cssWithMappingToString(item, useSourceMap) { - var content = item[1] || ''; - var cssMapping = item[3]; - if (!cssMapping) { - return content; - } + var content = item[1] || ''; + var cssMapping = item[3]; + if (!cssMapping) { + return content; + } - if (useSourceMap && typeof btoa === 'function') { - var sourceMapping = toComment(cssMapping); - var sourceURLs = cssMapping.sources.map(function (source) { - return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */' - }); + if (useSourceMap && typeof btoa === 'function') { + var sourceMapping = toComment(cssMapping); + var sourceURLs = cssMapping.sources.map(function(source) { + return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'; + }); - return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); - } + return [content] + .concat(sourceURLs) + .concat([sourceMapping]) + .join('\n'); + } - return [content].join('\n'); + return [content].join('\n'); } // Adapted from convert-source-map (MIT) function toComment(sourceMap) { - // eslint-disable-next-line no-undef - var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); - var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; + // eslint-disable-next-line no-undef + var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); + var data = + 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; - return '/*# ' + data + ' */'; + return '/*# ' + data + ' */'; } diff --git a/lib/getImportPrefix.js b/lib/getImportPrefix.js index 5d3be772..fdadcfc0 100644 --- a/lib/getImportPrefix.js +++ b/lib/getImportPrefix.js @@ -1,14 +1,19 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra */ module.exports = function getImportPrefix(loaderContext, query) { - if(query.importLoaders === false) - return ""; - var importLoaders = parseInt(query.importLoaders, 10) || 0; - var loadersRequest = loaderContext.loaders.slice( - loaderContext.loaderIndex, - loaderContext.loaderIndex + 1 + importLoaders - ).map(function(x) { return x.request; }).join("!"); - return "-!" + loadersRequest + "!"; + if (query.importLoaders === false) { + return ''; + } + + const importLoaders = parseInt(query.importLoaders, 10) || 0; + const loadersRequest = loaderContext.loaders + .slice( + loaderContext.loaderIndex, + loaderContext.loaderIndex + 1 + importLoaders + ) + .map((x) => x.request) + .join('!'); + return `-!${loadersRequest}!`; }; diff --git a/lib/getLocalIdent.js b/lib/getLocalIdent.js index 79c7ab57..dbc1ecab 100644 --- a/lib/getLocalIdent.js +++ b/lib/getLocalIdent.js @@ -1,23 +1,43 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra */ -var loaderUtils = require("loader-utils"); -var path = require("path"); +const path = require('path'); -module.exports = function getLocalIdent(loaderContext, localIdentName, localName, options) { - if(!options.context) { - if (loaderContext.rootContext) { - options.context = loaderContext.rootContext; - } else if (loaderContext.options && typeof loaderContext.options.context === "string") { - options.context = loaderContext.options.context; - } else { - options.context = loaderContext.context; - } - } - var request = path.relative(options.context, loaderContext.resourcePath); - options.content = options.hashPrefix + request + "+" + localName; - localIdentName = localIdentName.replace(/\[local\]/gi, localName); - var hash = loaderUtils.interpolateName(loaderContext, localIdentName, options); - return hash.replace(new RegExp("[^a-zA-Z0-9\\-_\u00A0-\uFFFF]", "g"), "-").replace(/^((-?[0-9])|--)/, "_$1"); +const loaderUtils = require('loader-utils'); + +module.exports = function getLocalIdent( + loaderContext, + localIdentName, + localName, + options +) { + if (!options.context) { + if (loaderContext.rootContext) { + // eslint-disable-next-line no-param-reassign + options.context = loaderContext.rootContext; + } else if ( + loaderContext.options && + typeof loaderContext.options.context === 'string' + ) { + // eslint-disable-next-line no-param-reassign + options.context = loaderContext.options.context; + } else { + // eslint-disable-next-line no-param-reassign + options.context = loaderContext.context; + } + } + const request = path.relative(options.context, loaderContext.resourcePath); + // eslint-disable-next-line no-param-reassign + options.content = `${options.hashPrefix + request}+${localName}`; + // eslint-disable-next-line no-param-reassign + localIdentName = localIdentName.replace(/\[local\]/gi, localName); + const hash = loaderUtils.interpolateName( + loaderContext, + localIdentName, + options + ); + return hash + .replace(new RegExp('[^a-zA-Z0-9\\-_\u00A0-\uFFFF]', 'g'), '-') + .replace(/^((-?[0-9])|--)/, '_$1'); }; diff --git a/lib/loader.js b/lib/loader.js index c31d5dea..3604a560 100644 --- a/lib/loader.js +++ b/lib/loader.js @@ -1,144 +1,195 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra */ -var loaderUtils = require("loader-utils"); -var processCss = require("./processCss"); -var getImportPrefix = require("./getImportPrefix"); -var compileExports = require("./compile-exports"); - - -module.exports = function(content, map) { - var callback = this.async(); - var query = loaderUtils.getOptions(this) || {}; - var moduleMode = query.modules; - var camelCaseKeys = query.camelCase; - var sourceMap = query.sourceMap || false; - - if(sourceMap) { - if (map) { - if (typeof map === "string") { - map = JSON.stringify(map); - } - - if (map.sources) { - map.sources = map.sources.map(function (source) { - return source.replace(/\\/g, '/'); - }); - map.sourceRoot = ''; - } - } - } else { - // Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it - map = null; - } - - processCss(content, map, { - mode: moduleMode ? "local" : "global", - from: loaderUtils.getRemainingRequest(this).split("!").pop(), - to: loaderUtils.getCurrentRequest(this).split("!").pop(), - query: query, - loaderContext: this, - sourceMap: sourceMap - }, function(err, result) { - if(err) return callback(err); - - var cssAsString = JSON.stringify(result.source); - - // for importing CSS - var importUrlPrefix = getImportPrefix(this, query); - - var alreadyImported = {}; - var importJs = result.importItems.map(function(imp) { - // fixes #781 when importing `url(filename.css )` - imp.url = imp.url.trim(); - return imp; - }).filter(function(imp) { - if(!imp.mediaQuery) { - if(alreadyImported[imp.url]) - return false; - alreadyImported[imp.url] = true; - } - return true; - }).map(function(imp) { - if(!loaderUtils.isUrlRequest(imp.url)) { - return "exports.push([module.id, " + - JSON.stringify("@import url(" + imp.url + ");") + ", " + - JSON.stringify(imp.mediaQuery) + "]);"; - } else { - var importUrl = importUrlPrefix + imp.url; - return "exports.i(require(" + loaderUtils.stringifyRequest(this, importUrl) + "), " + JSON.stringify(imp.mediaQuery) + ");"; - } - }, this).join("\n"); - - function importItemMatcher(item) { - var match = result.importItemRegExp.exec(item); - var idx = +match[1]; - var importItem = result.importItems[idx]; - var importUrl = importUrlPrefix + importItem.url; - return "\" + require(" + loaderUtils.stringifyRequest(this, importUrl) + ").locals" + - "[" + JSON.stringify(importItem.export) + "] + \""; - } - - cssAsString = cssAsString.replace(result.importItemRegExpG, importItemMatcher.bind(this)); - - // helper for ensuring valid CSS strings from requires - var urlEscapeHelper = ""; - - if(query.url !== false && result.urlItems.length > 0) { - urlEscapeHelper = "var escape = require(" + loaderUtils.stringifyRequest(this, require.resolve("./url/escape.js")) + ");\n"; - - cssAsString = cssAsString.replace(result.urlItemRegExpG, function(item) { - var match = result.urlItemRegExp.exec(item); - var idx = +match[1]; - var urlItem = result.urlItems[idx]; - var url = urlItem.url; - idx = url.indexOf("?#"); - if(idx < 0) idx = url.indexOf("#"); - var urlRequest; - if(idx > 0) { // idx === 0 is catched by isUrlRequest - // in cases like url('webfont.eot?#iefix') - urlRequest = url.substr(0, idx); - return "\" + escape(require(" + loaderUtils.stringifyRequest(this, urlRequest) + ")) + \"" + - url.substr(idx); - } - urlRequest = url; - return "\" + escape(require(" + loaderUtils.stringifyRequest(this, urlRequest) + ")) + \""; - }.bind(this)); - } - - var exportJs = compileExports(result, importItemMatcher.bind(this), camelCaseKeys); - if (exportJs) { - exportJs = "exports.locals = " + exportJs + ";"; - } - - var moduleJs; - if(sourceMap && result.map) { - // add a SourceMap - map = result.map; - if(map.sources) { - map.sources = map.sources.map(function(source) { - return source.split("!").pop().replace(/\\/g, '/'); - }, this); - map.sourceRoot = ""; - } - map.file = map.file.split("!").pop().replace(/\\/g, '/'); - map = JSON.stringify(map); - moduleJs = "exports.push([module.id, " + cssAsString + ", \"\", " + map + "]);"; - } else { - moduleJs = "exports.push([module.id, " + cssAsString + ", \"\"]);"; - } - - // embed runtime - callback(null, urlEscapeHelper + - "exports = module.exports = require(" + - loaderUtils.stringifyRequest(this, require.resolve("./css-base.js")) + - ")(" + sourceMap + ");\n" + - "// imports\n" + - importJs + "\n\n" + - "// module\n" + - moduleJs + "\n\n" + - "// exports\n" + - exportJs); - }.bind(this)); +const loaderUtils = require('loader-utils'); + +const processCss = require('./processCss'); +const getImportPrefix = require('./getImportPrefix'); +const compileExports = require('./compile-exports'); + +module.exports = function loader(content, map) { + const callback = this.async(); + const query = loaderUtils.getOptions(this) || {}; + const moduleMode = query.modules; + const camelCaseKeys = query.camelCase; + const sourceMap = query.sourceMap || false; + + /* eslint-disable no-param-reassign */ + if (sourceMap) { + if (map) { + if (typeof map === 'string') { + map = JSON.stringify(map); + } + + if (map.sources) { + map.sources = map.sources.map((source) => source.replace(/\\/g, '/')); + map.sourceRoot = ''; + } + } + } else { + // Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it + map = null; + } + /* eslint-enable no-param-reassign */ + + processCss( + content, + map, + { + mode: moduleMode ? 'local' : 'global', + from: loaderUtils + .getRemainingRequest(this) + .split('!') + .pop(), + to: loaderUtils + .getCurrentRequest(this) + .split('!') + .pop(), + query, + loaderContext: this, + sourceMap, + }, + (err, result) => { + if (err) { + return callback(err); + } + + let cssAsString = JSON.stringify(result.source); + + // for importing CSS + const importUrlPrefix = getImportPrefix(this, query); + + const alreadyImported = {}; + const importJs = result.importItems + .map((imp) => { + // fixes #781 when importing `url(filename.css )` + // eslint-disable-next-line no-param-reassign + imp.url = imp.url.trim(); + return imp; + }) + .filter((imp) => { + if (!imp.mediaQuery) { + if (alreadyImported[imp.url]) { + return false; + } + alreadyImported[imp.url] = true; + } + return true; + }) + .map((imp) => { + if (!loaderUtils.isUrlRequest(imp.url)) { + return `exports.push([module.id, ${JSON.stringify( + `@import url(${imp.url});` + )}, ${JSON.stringify(imp.mediaQuery)}]);`; + } + const importUrl = importUrlPrefix + imp.url; + return `exports.i(require(${loaderUtils.stringifyRequest( + this, + importUrl + )}), ${JSON.stringify(imp.mediaQuery)});`; + }, this) + .join('\n'); + + function importItemMatcher(item) { + const match = result.importItemRegExp.exec(item); + const idx = +match[1]; + const importItem = result.importItems[idx]; + const importUrl = importUrlPrefix + importItem.url; + return `" + require(${loaderUtils.stringifyRequest( + this, + importUrl + )}).locals[${JSON.stringify(importItem.export)}] + "`; + } + + cssAsString = cssAsString.replace( + result.importItemRegExpG, + importItemMatcher.bind(this) + ); + + // helper for ensuring valid CSS strings from requires + let urlEscapeHelper = ''; + + if (query.url !== false && result.urlItems.length > 0) { + urlEscapeHelper = `var escape = require(${loaderUtils.stringifyRequest( + this, + require.resolve('./url/escape.js') + )});\n`; + + cssAsString = cssAsString.replace(result.urlItemRegExpG, (item) => { + const match = result.urlItemRegExp.exec(item); + let idx = +match[1]; + const urlItem = result.urlItems[idx]; + const { url } = urlItem; + idx = url.indexOf('?#'); + if (idx < 0) { + idx = url.indexOf('#'); + } + let urlRequest; + if (idx > 0) { + // idx === 0 is catched by isUrlRequest + // in cases like url('webfont.eot?#iefix') + urlRequest = url.substr(0, idx); + return `" + escape(require(${loaderUtils.stringifyRequest( + this, + urlRequest + )})) + "${url.substr(idx)}`; + } + urlRequest = url; + return `" + escape(require(${loaderUtils.stringifyRequest( + this, + urlRequest + )})) + "`; + }); + } + + let exportJs = compileExports( + result, + importItemMatcher.bind(this), + camelCaseKeys + ); + if (exportJs) { + exportJs = `exports.locals = ${exportJs};`; + } + + let moduleJs; + if (sourceMap && result.map) { + /* eslint-disable no-param-reassign */ + // Add a SourceMap + ({ map } = result); + if (map.sources) { + map.sources = map.sources.map( + (source) => + source + .split('!') + .pop() + .replace(/\\/g, '/'), + this + ); + map.sourceRoot = ''; + } + map.file = map.file + .split('!') + .pop() + .replace(/\\/g, '/'); + map = JSON.stringify(map); + /* eslint-enable no-param-reassign */ + moduleJs = `exports.push([module.id, ${cssAsString}, "", ${map}]);`; + } else { + moduleJs = `exports.push([module.id, ${cssAsString}, ""]);`; + } + + // embed runtime + return callback( + null, + `${urlEscapeHelper}exports = module.exports = require(${loaderUtils.stringifyRequest( + this, + require.resolve('./css-base.js') + )})(${sourceMap});\n` + + `// imports\n${importJs}\n\n` + + `// module\n${moduleJs}\n\n` + + `// exports\n${exportJs}` + ); + } + ); }; diff --git a/lib/localsLoader.js b/lib/localsLoader.js index e12546e8..f601c613 100644 --- a/lib/localsLoader.js +++ b/lib/localsLoader.js @@ -1,44 +1,56 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra */ -var loaderUtils = require("loader-utils"); -var processCss = require("./processCss"); -var getImportPrefix = require("./getImportPrefix"); -var compileExports = require("./compile-exports"); - - -module.exports = function(content) { - var callback = this.async(); - var query = loaderUtils.getOptions(this) || {}; - var moduleMode = query.modules; - var camelCaseKeys = query.camelCase; - - processCss(content, null, { - mode: moduleMode ? "local" : "global", - query: query, - loaderContext: this, - }, function(err, result) { - if(err) return callback(err); - - // for importing CSS - var importUrlPrefix = getImportPrefix(this, query); - - function importItemMatcher(item) { - var match = result.importItemRegExp.exec(item); - var idx = +match[1]; - var importItem = result.importItems[idx]; - var importUrl = importUrlPrefix + importItem.url; - return "\" + require(" + loaderUtils.stringifyRequest(this, importUrl) + ")" + - "[" + JSON.stringify(importItem.export) + "] + \""; - } - - var exportJs = compileExports(result, importItemMatcher.bind(this), camelCaseKeys); - if (exportJs) { - exportJs = "module.exports = " + exportJs + ";"; - } - - - callback(null, exportJs); - }.bind(this)); +const loaderUtils = require('loader-utils'); + +const processCss = require('./processCss'); +const getImportPrefix = require('./getImportPrefix'); +const compileExports = require('./compile-exports'); + +module.exports = function loader(content) { + const callback = this.async(); + const query = loaderUtils.getOptions(this) || {}; + const moduleMode = query.modules; + const camelCaseKeys = query.camelCase; + + processCss( + content, + null, + { + mode: moduleMode ? 'local' : 'global', + query, + loaderContext: this, + }, + (err, result) => { + if (err) { + return callback(err); + } + + // for importing CSS + const importUrlPrefix = getImportPrefix(this, query); + + function importItemMatcher(item) { + const match = result.importItemRegExp.exec(item); + const idx = +match[1]; + const importItem = result.importItems[idx]; + const importUrl = importUrlPrefix + importItem.url; + return ( + `" + require(${loaderUtils.stringifyRequest(this, importUrl)})` + + `[${JSON.stringify(importItem.export)}] + "` + ); + } + + let exportJs = compileExports( + result, + importItemMatcher.bind(this), + camelCaseKeys + ); + if (exportJs) { + exportJs = `module.exports = ${exportJs};`; + } + + return callback(null, exportJs); + } + ); }; diff --git a/lib/processCss.js b/lib/processCss.js index 61eb7ce5..400f57c4 100644 --- a/lib/processCss.js +++ b/lib/processCss.js @@ -1,243 +1,271 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra */ -var formatCodeFrame = require("babel-code-frame"); -var Tokenizer = require("css-selector-tokenizer"); -var postcss = require("postcss"); -var loaderUtils = require("loader-utils"); -var getLocalIdent = require("./getLocalIdent"); - -var icssUtils = require('icss-utils'); -var localByDefault = require("postcss-modules-local-by-default"); -var extractImports = require("postcss-modules-extract-imports"); -var modulesScope = require("postcss-modules-scope"); -var modulesValues = require("postcss-modules-values"); -var valueParser = require('postcss-value-parser'); - -var parserPlugin = postcss.plugin("css-loader-parser", function(options) { - return function(css) { - var imports = {}; - var exports = {}; - var importItems = []; - var urlItems = []; - - function replaceImportsInString(str) { - if(options.import) { - var tokens = valueParser(str); - tokens.walk(function (node) { - if (node.type !== 'word') { - return; - } - var token = node.value; - var importIndex = imports["$" + token]; - if(typeof importIndex === "number") { - node.value = "___CSS_LOADER_IMPORT___" + importIndex + "___"; - } - }) - return tokens.toString(); - } - return str; - } - - if(options.import) { - css.walkAtRules(/^import$/i, function(rule) { - var values = Tokenizer.parseValues(rule.params); - var url = values.nodes[0].nodes[0]; - if(url && url.type === "url") { - url = url.url; - } else if(url && url.type === "string") { - url = url.value; - } else throw rule.error("Unexpected format " + rule.params); - if (!url.replace(/\s/g, '').length) { - return; - } - values.nodes[0].nodes.shift(); - var mediaQuery = Tokenizer.stringifyValues(values); - - if(loaderUtils.isUrlRequest(url)) { - url = loaderUtils.urlToRequest(url); - } - - importItems.push({ - url: url, - mediaQuery: mediaQuery - }); - rule.remove(); - }); - } - - var icss = icssUtils.extractICSS(css); - exports = icss.icssExports; - Object.keys(icss.icssImports).forEach(function(key) { - var url = loaderUtils.parseString(key); - Object.keys(icss.icssImports[key]).forEach(function(prop) { - imports["$" + prop] = importItems.length; - importItems.push({ - url: url, - export: icss.icssImports[key][prop] - }); - }) - }); - - Object.keys(exports).forEach(function(exportName) { - exports[exportName] = replaceImportsInString(exports[exportName]); - }); - - function processNode(item) { - switch (item.type) { - case "value": - item.nodes.forEach(processNode); - break; - case "nested-item": - item.nodes.forEach(processNode); - break; - case "item": - var importIndex = imports["$" + item.name]; - if (typeof importIndex === "number") { - item.name = "___CSS_LOADER_IMPORT___" + importIndex + "___"; - } - break; - case "url": - if (options.url && item.url.replace(/\s/g, '').length && !/^#/.test(item.url) && loaderUtils.isUrlRequest(item.url)) { - // Strip quotes, they will be re-added if the module needs them - item.stringType = ""; - delete item.innerSpacingBefore; - delete item.innerSpacingAfter; - var url = item.url; - item.url = "___CSS_LOADER_URL___" + urlItems.length + "___"; - urlItems.push({ - url: url - }); - } - break; - } - } - - css.walkDecls(function(decl) { - var values = Tokenizer.parseValues(decl.value); - values.nodes.forEach(function(value) { - value.nodes.forEach(processNode); - }); - decl.value = Tokenizer.stringifyValues(values); - }); - css.walkAtRules(function(atrule) { - if(typeof atrule.params === "string") { - atrule.params = replaceImportsInString(atrule.params); - } - }); - - options.importItems = importItems; - options.urlItems = urlItems; - options.exports = exports; - }; +const formatCodeFrame = require('babel-code-frame'); +const Tokenizer = require('css-selector-tokenizer'); +const postcss = require('postcss'); +const loaderUtils = require('loader-utils'); + +const icssUtils = require('icss-utils'); +const localByDefault = require('postcss-modules-local-by-default'); +const extractImports = require('postcss-modules-extract-imports'); +const modulesScope = require('postcss-modules-scope'); +const modulesValues = require('postcss-modules-values'); +const valueParser = require('postcss-value-parser'); + +const getLocalIdent = require('./getLocalIdent'); + +const parserPlugin = postcss.plugin('css-loader-parser', (options) => (css) => { + const imports = {}; + let exports = {}; + const importItems = []; + const urlItems = []; + + function replaceImportsInString(str) { + if (options.import) { + const tokens = valueParser(str); + tokens.walk((node) => { + if (node.type !== 'word') { + return; + } + const token = node.value; + const importIndex = imports[`$${token}`]; + if (typeof importIndex === 'number') { + // eslint-disable-next-line no-param-reassign + node.value = `___CSS_LOADER_IMPORT___${importIndex}___`; + } + }); + return tokens.toString(); + } + return str; + } + + if (options.import) { + css.walkAtRules(/^import$/i, (rule) => { + const values = Tokenizer.parseValues(rule.params); + let [url] = values.nodes[0].nodes; + if (url && url.type === 'url') { + ({ url } = url); + } else if (url && url.type === 'string') { + url = url.value; + } else throw rule.error(`Unexpected format ${rule.params}`); + if (!url.replace(/\s/g, '').length) { + return; + } + values.nodes[0].nodes.shift(); + const mediaQuery = Tokenizer.stringifyValues(values); + + if (loaderUtils.isUrlRequest(url)) { + url = loaderUtils.urlToRequest(url); + } + + importItems.push({ + url, + mediaQuery, + }); + rule.remove(); + }); + } + + const icss = icssUtils.extractICSS(css); + exports = icss.icssExports; + Object.keys(icss.icssImports).forEach((key) => { + const url = loaderUtils.parseString(key); + Object.keys(icss.icssImports[key]).forEach((prop) => { + imports[`$${prop}`] = importItems.length; + importItems.push({ + url, + export: icss.icssImports[key][prop], + }); + }); + }); + + Object.keys(exports).forEach((exportName) => { + exports[exportName] = replaceImportsInString(exports[exportName]); + }); + + function processNode(item) { + switch (item.type) { + case 'value': + item.nodes.forEach(processNode); + break; + case 'nested-item': + item.nodes.forEach(processNode); + break; + case 'item': { + const importIndex = imports[`$${item.name}`]; + if (typeof importIndex === 'number') { + // eslint-disable-next-line no-param-reassign + item.name = `___CSS_LOADER_IMPORT___${importIndex}___`; + } + break; + } + case 'url': + if ( + options.url && + item.url.replace(/\s/g, '').length && + !/^#/.test(item.url) && + loaderUtils.isUrlRequest(item.url) + ) { + // Strip quotes, they will be re-added if the module needs them + /* eslint-disable no-param-reassign */ + item.stringType = ''; + delete item.innerSpacingBefore; + delete item.innerSpacingAfter; + const { url } = item; + item.url = `___CSS_LOADER_URL___${urlItems.length}___`; + /* eslint-enable no-param-reassign */ + urlItems.push({ + url, + }); + } + break; + // no default + } + } + + css.walkDecls((decl) => { + const values = Tokenizer.parseValues(decl.value); + values.nodes.forEach((value) => { + value.nodes.forEach(processNode); + }); + // eslint-disable-next-line no-param-reassign + decl.value = Tokenizer.stringifyValues(values); + }); + css.walkAtRules((atrule) => { + if (typeof atrule.params === 'string') { + // eslint-disable-next-line no-param-reassign + atrule.params = replaceImportsInString(atrule.params); + } + }); + + /* eslint-disable no-param-reassign */ + options.importItems = importItems; + options.urlItems = urlItems; + options.exports = exports; + /* eslint-enable no-param-reassign */ }); module.exports = function processCss(inputSource, inputMap, options, callback) { - var query = options.query; - var context = query.context; - var localIdentName = query.localIdentName || "[hash:base64]"; - var localIdentRegExp = query.localIdentRegExp; - - var customGetLocalIdent = query.getLocalIdent || getLocalIdent; - - var parserOptions = { - mode: options.mode, - url: query.url !== false, - import: query.import !== false, - resolve: options.resolve - }; - - var pipeline = postcss([ - modulesValues, - localByDefault({ - mode: options.mode, - rewriteUrl: function(global, url) { - if(parserOptions.url){ - url = url.trim(); - - if(!url.replace(/\s/g, '').length || !loaderUtils.isUrlRequest(url)) { - return url; - } - if(global) { - return loaderUtils.urlToRequest(url); - } - } - return url; - } - }), - extractImports(), - modulesScope({ - generateScopedName: function generateScopedName (exportName) { - return customGetLocalIdent(options.loaderContext, localIdentName, exportName, { - regExp: localIdentRegExp, - hashPrefix: query.hashPrefix || "", - context: context - }); - } - }), - parserPlugin(parserOptions) - ]); - - pipeline.process(inputSource, { - // we need a prefix to avoid path rewriting of PostCSS - from: "/css-loader!" + options.from, - to: options.to, - map: options.sourceMap ? { - prev: inputMap, - sourcesContent: true, - inline: false, - annotation: false - } : null - }).then(function(result) { - callback(null, { - source: result.css, - map: result.map && result.map.toJSON(), - exports: parserOptions.exports, - importItems: parserOptions.importItems, - importItemRegExpG: /___CSS_LOADER_IMPORT___([0-9]+)___/g, - importItemRegExp: /___CSS_LOADER_IMPORT___([0-9]+)___/, - urlItems: parserOptions.urlItems, - urlItemRegExpG: /___CSS_LOADER_URL___([0-9]+)___/g, - urlItemRegExp: /___CSS_LOADER_URL___([0-9]+)___/ - }); - }).catch(function(err) { - if (err.name === 'CssSyntaxError') { - var wrappedError = new CSSLoaderError( - 'Syntax Error', - err.reason, - err.line != null && err.column != null - ? {line: err.line, column: err.column} - : null, - err.input.source - ); - callback(wrappedError); - } else { - callback(err); - } - }); + const { query } = options; + const { context, localIdentRegExp } = query; + const localIdentName = query.localIdentName || '[hash:base64]'; + const customGetLocalIdent = query.getLocalIdent || getLocalIdent; + + const parserOptions = { + mode: options.mode, + url: query.url !== false, + import: query.import !== false, + resolve: options.resolve, + }; + + const pipeline = postcss([ + modulesValues, + localByDefault({ + mode: options.mode, + rewriteUrl(global, url) { + if (parserOptions.url) { + // eslint-disable-next-line no-param-reassign + url = url.trim(); + + if ( + !url.replace(/\s/g, '').length || + !loaderUtils.isUrlRequest(url) + ) { + return url; + } + if (global) { + return loaderUtils.urlToRequest(url); + } + } + return url; + }, + }), + extractImports(), + modulesScope({ + generateScopedName: function generateScopedName(exportName) { + return customGetLocalIdent( + options.loaderContext, + localIdentName, + exportName, + { + regExp: localIdentRegExp, + hashPrefix: query.hashPrefix || '', + context, + } + ); + }, + }), + parserPlugin(parserOptions), + ]); + + pipeline + .process(inputSource, { + // we need a prefix to avoid path rewriting of PostCSS + from: `/css-loader!${options.from}`, + to: options.to, + map: options.sourceMap + ? { + prev: inputMap, + sourcesContent: true, + inline: false, + annotation: false, + } + : null, + }) + .then((result) => { + callback(null, { + source: result.css, + map: result.map && result.map.toJSON(), + exports: parserOptions.exports, + importItems: parserOptions.importItems, + importItemRegExpG: /___CSS_LOADER_IMPORT___([0-9]+)___/g, + importItemRegExp: /___CSS_LOADER_IMPORT___([0-9]+)___/, + urlItems: parserOptions.urlItems, + urlItemRegExpG: /___CSS_LOADER_URL___([0-9]+)___/g, + urlItemRegExp: /___CSS_LOADER_URL___([0-9]+)___/, + }); + }) + .catch((err) => { + if (err.name === 'CssSyntaxError') { + const wrappedError = new CSSLoaderError( + 'Syntax Error', + err.reason, + err.line != null && err.column != null + ? { line: err.line, column: err.column } + : null, + err.input.source + ); + callback(wrappedError); + } else { + callback(err); + } + }); }; function formatMessage(message, loc, source) { - var formatted = message; - if (loc) { - formatted = formatted - + ' (' + loc.line + ':' + loc.column + ')'; - } - if (loc && source) { - formatted = formatted - + '\n\n' + formatCodeFrame(source, loc.line, loc.column) + '\n'; - } - return formatted; + let formatted = message; + if (loc) { + formatted = `${formatted} (${loc.line}:${loc.column})`; + } + if (loc && source) { + formatted = `${formatted}\n\n${formatCodeFrame( + source, + loc.line, + loc.column + )}\n`; + } + return formatted; } function CSSLoaderError(name, message, loc, source, error) { - Error.call(this); - Error.captureStackTrace(this, CSSLoaderError); - this.name = name; - this.error = error; - this.message = formatMessage(message, loc, source); - this.hideStack = true; + Error.call(this); + Error.captureStackTrace(this, CSSLoaderError); + this.name = name; + this.error = error; + this.message = formatMessage(message, loc, source); + this.hideStack = true; } CSSLoaderError.prototype = Object.create(Error.prototype); diff --git a/lib/url/escape.js b/lib/url/escape.js index 25074a6e..c2b69273 100644 --- a/lib/url/escape.js +++ b/lib/url/escape.js @@ -1,16 +1,17 @@ module.exports = function escape(url) { - if (typeof url !== 'string') { - return url - } - // If url is already wrapped in quotes, remove them - if (/^['"].*['"]$/.test(url)) { - url = url.slice(1, -1); - } - // Should url be wrapped? - // See https://drafts.csswg.org/css-values-3/#urls - if (/["'() \t\n]/.test(url)) { - return '"' + url.replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"' - } + if (typeof url !== 'string') { + return url; + } - return url -} + // If url is already wrapped in quotes, remove them + if (/^['"].*['"]$/.test(url)) { + url = url.slice(1, -1); + } + // Should url be wrapped? + // See https://drafts.csswg.org/css-values-3/#urls + if (/["'() \t\n]/.test(url)) { + return '"' + url.replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"'; + } + + return url; +}; diff --git a/package-lock.json b/package-lock.json index c1eebf57..74fb4c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -390,6 +390,43 @@ "find-up": "^2.1.0" } }, + "@iamstarkov/listr-update-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz", + "integrity": "sha512-IJyxQWsYDEkf8C8QthBn5N8tIUR9V9je6j3sMIpAkonaadjbvxmRC6RAhpa3RKxndhNnU2M6iNbtJwd7usQYIA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + } + } + }, "@marionebl/sander": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/@marionebl/sander/-/sander-0.6.1.tgz", @@ -401,6 +438,21 @@ "rimraf": "^2.5.2" } }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@webpack-contrib/eslint-config-webpack": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@webpack-contrib/eslint-config-webpack/-/eslint-config-webpack-3.0.0.tgz", + "integrity": "sha512-3f0dwuTZ1JZpnoGQ6tAKBWluZKZZBXr1ADoaOAbPiW0OvSN7o0wXFLGyfw6J+fW756xIkZLZ8JDYP5zInIRvBA==", + "dev": true + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -464,6 +516,12 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -479,6 +537,24 @@ "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", "dev": true }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -491,6 +567,27 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "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", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -512,6 +609,12 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -524,6 +627,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -581,6 +690,61 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -605,6 +769,35 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -623,6 +816,40 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -679,12 +906,41 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "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", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -694,6 +950,44 @@ "restore-cursor": "^2.0.0" } }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -730,6 +1024,16 @@ "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } } } }, @@ -752,6 +1056,16 @@ "urlgrey": "^0.4.4" } }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -778,8 +1092,7 @@ "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, - "optional": true + "dev": true }, "compare-func": { "version": "1.3.2", @@ -791,6 +1104,12 @@ "dot-prop": "^3.0.0" } }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -809,6 +1128,12 @@ "typedarray": "^0.0.6" } }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "conventional-changelog": { "version": "1.1.24", "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", @@ -1294,6 +1619,12 @@ } } }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", @@ -1373,6 +1704,12 @@ "assert-plus": "^1.0.0" } }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -1412,12 +1749,79 @@ } } }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1468,11 +1872,26 @@ "safer-buffer": "^2.1.0" } }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1616,25 +2035,190 @@ } } }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "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", + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.0.tgz", + "integrity": "sha512-4g11opzhqq/8+AMmo5Vc2Gn7z9alZ4JqrbZ+D4i8KlSyxeQhZHlmIrY8U9Akf514MoEhogPa87Jgkq87aZ2Ohw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "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 }, @@ -1685,30 +2269,67 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "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=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -1718,6 +2339,27 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "external-editor": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", @@ -1729,6 +2371,71 @@ "tmp": "^0.0.33" } }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1741,6 +2448,12 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -1777,6 +2490,35 @@ "object-assign": "^4.0.1" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -1798,6 +2540,12 @@ "write": "^0.2.1" } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1815,6 +2563,15 @@ "mime-types": "^2.1.12" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fs-access": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", @@ -1830,18 +2587,41 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "g-status": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", + "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "matcher": "^1.0.0", + "simple-git": "^1.85.0" + } + }, "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-own-enumerable-property-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", + "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==", + "dev": true + }, "get-pkg-repo": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", @@ -2032,9 +2812,18 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { @@ -2163,6 +2952,27 @@ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", "dev": true }, + "globby": { + "version": "6.1.0", + "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", @@ -2214,10 +3024,19 @@ "har-schema": "^2.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" } @@ -2227,6 +3046,38 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -2250,6 +3101,107 @@ "sshpk": "^1.7.0" } }, + "husky": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.2.0.tgz", + "integrity": "sha512-/ib3+iycykXC0tYIxsyqierikVa9DA2DrT32UEirqNEFVqOj1bFMTgP3jAz8HM7FgC/C8pc/BTUa9MV2GEkZaA==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.6", + "execa": "^1.0.0", + "find-up": "^3.0.0", + "get-stdin": "^6.0.0", + "is-ci": "^1.2.1", + "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": { + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2287,6 +3239,33 @@ "minimatch": "^3.0.4" } }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2394,12 +3373,38 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-builtin-module": { "version": "1.0.0", "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", @@ -2409,12 +3414,72 @@ "builtin-modules": "^1.0.0" } }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -2430,24 +3495,101 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-obj": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "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-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -2487,6 +3629,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2499,6 +3647,12 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -2552,6 +3706,12 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -2584,6 +3744,55 @@ "semver": "^5.5.0" } }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -2663,6 +3872,12 @@ "verror": "1.10.0" } }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2672,14 +3887,215 @@ "invert-kv": "^1.0.0" } }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lint-staged": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.0.tgz", + "integrity": "sha512-yfSkyJy7EuVsaoxtUSEhrD81spdJOe/gMTGea3XaV7HyoRhTb9Gdlp6/JppRZERvKSEYXP9bjcmq6CA5oL2lYQ==", + "dev": true, + "requires": { + "@iamstarkov/listr-update-renderer": "0.4.1", + "chalk": "^2.3.1", + "commander": "^2.14.1", + "cosmiconfig": "5.0.6", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "del": "^3.0.0", + "execa": "^1.0.0", + "find-parent-dir": "^0.3.0", + "g-status": "^2.0.2", + "is-glob": "^4.0.0", + "is-windows": "^1.0.2", + "jest-validate": "^23.5.0", + "listr": "^0.14.2", + "lodash": "^4.17.5", + "log-symbols": "^2.2.0", + "micromatch": "^3.1.8", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", + "please-upgrade-node": "^3.0.2", + "staged-git-files": "1.1.2", + "string-argv": "^0.0.2", + "stringify-object": "^3.2.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cosmiconfig": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", + "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "p-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", + "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "load-json-file": { @@ -2804,6 +4220,57 @@ "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", "dev": true }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + } + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -2824,12 +4291,36 @@ "yallist": "^3.0.2" } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matcher": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", + "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.4" + } + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", @@ -2856,6 +4347,27 @@ "yargs-parser": "^10.0.0" } }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", @@ -2902,6 +4414,27 @@ "is-plain-obj": "^1.1.0" } }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3002,6 +4535,25 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3035,6 +4587,15 @@ "validate-npm-package-license": "^3.0.1" } }, + "npm-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "dev": true, + "requires": { + "which": "^1.2.10" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -3044,6 +4605,17 @@ "path-key": "^2.0.0" } }, + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "dev": true, + "requires": { + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" + } + }, "null-check": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", @@ -4207,6 +5779,55 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4272,6 +5893,40 @@ "execa": "^0.7.0", "lcid": "^1.0.0", "mem": "^1.1.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.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } } }, "os-tmpdir": { @@ -4304,6 +5959,12 @@ "p-limit": "^1.1.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -4326,6 +5987,12 @@ "json-parse-better-errors": "^1.0.1" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -4350,6 +6017,12 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -4386,12 +6059,57 @@ "pinkie": "^2.0.0" } }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.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 }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "postcss": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", @@ -4476,6 +6194,48 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prettier": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.2.tgz", + "integrity": "sha512-YgPLFFA0CdKL4Eg2IHtUSjzj/BWgszDHiNQAe0VAIBse34148whfdzLagRL+QiKS+YfK5ftB6X4v/MBw8yCoug==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -4500,6 +6260,16 @@ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -4581,6 +6351,16 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -4610,6 +6390,18 @@ "jsesc": "~0.5.0" } }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -4684,10 +6476,13 @@ } }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } }, "resolve-from": { "version": "4.0.0", @@ -4704,6 +6499,12 @@ "global-dirs": "^0.1.0" } }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "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", @@ -4714,6 +6515,12 @@ "signal-exit": "^3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -4732,6 +6539,12 @@ "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": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", @@ -4747,6 +6560,15 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4759,12 +6581,41 @@ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "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", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -4840,6 +6691,21 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-git": { + "version": "1.107.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.107.0.tgz", + "integrity": "sha512-t4OK1JRlp4ayKRfcW6owrWcRVLyHRUlhGd0uN6ZZTqfDq8a5XpcUdOKiGRNobHEuMtNqzp0vcJNvhYWwh5PsQA==", + "dev": true, + "requires": { + "debug": "^4.0.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", @@ -4849,6 +6715,134 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -4859,6 +6853,25 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", @@ -4900,6 +6913,15 @@ "through": "2" } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", @@ -4932,6 +6954,12 @@ "tweetnacl": "~0.14.0" } }, + "staged-git-files": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", + "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", + "dev": true + }, "standard-version": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.4.0.tgz", @@ -4960,6 +6988,33 @@ } } }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "string-argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", + "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -4996,6 +7051,17 @@ "safe-buffer": "~5.1.0" } }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -5033,6 +7099,12 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, "table": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", @@ -5088,6 +7160,48 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -5171,6 +7285,81 @@ "source-map": "~0.6.1" } }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -5180,12 +7369,24 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "urlgrey": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", "dev": true }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5241,33 +7442,28 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^3.0.0" } } } diff --git a/package.json b/package.json index 074a22ce..d6c597aa 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,14 @@ "devDependencies": { "@commitlint/cli": "^7.2.1", "@commitlint/config-conventional": "^7.1.2", + "@webpack-contrib/eslint-config-webpack": "^3.0.0", "codecov": "^3.1.0", "eslint": "^5.9.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-prettier": "^3.0.0", + "husky": "^1.2.0", + "lint-staged": "^8.1.0", + "prettier": "^1.15.2", "istanbul": "^0.4.5", "mocha": "^5.2.0", "should": "^13.2.3", @@ -58,6 +64,17 @@ "homepage": "https://github.com/webpack-contrib/css-loader", "repository": "https://github.com/webpack-contrib/css-loader.git", "bugs": "https://github.com/webpack-contrib/css-loader/issues", + "lint-staged": { + "*.js": [ + "eslint --fix", + "git add" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, "commitlint": { "extends": [ "@commitlint/config-conventional" diff --git a/test/camelCaseTest.js b/test/camelCaseTest.js index cf4b0dfc..0a233b3c 100644 --- a/test/camelCaseTest.js +++ b/test/camelCaseTest.js @@ -1,47 +1,82 @@ -/*globals describe */ +/* globals describe */ -var test = require("./helpers").test; -var testRaw = require("./helpers").testRaw; +const { test, testRaw } = require('./helpers'); -describe("camelCase", function() { - var css = ".btn-info_is-disabled { color: blue; }"; - var cssMultipleDashes = ".btn--info_is-disabled { color: blue; }"; - var mixedCss = ".btn-info_is-disabled { color: blue; } .simple { color: red; }"; - var exports = { - with: [ - [1, "._1L-rnCOXCE_7H94L5XT4uB { color: blue; }", ""] - ], - without: [ - [1, "._1L-rnCOXCE_7H94L5XT4uB { color: blue; }", ""] - ], - dashes: [ - [1, "._1L-rnCOXCE_7H94L5XT4uB { color: blue; }", ""] - ], - multipleDashes: [ - [1, "._3JUlsKrl__OF70Fq391jEw { color: blue; }", ""] - ], - withoutOnly: [ - [1, "._1L-rnCOXCE_7H94L5XT4uB { color: blue; } .KKtodWG-IuEaequFjAsoJ { color: red; }", ""] - ], - dashesOnly: [ - [1, "._1L-rnCOXCE_7H94L5XT4uB { color: blue; } .KKtodWG-IuEaequFjAsoJ { color: red; }", ""] - ] - }; - exports.with.locals = {'btn-info_is-disabled': '_1L-rnCOXCE_7H94L5XT4uB'}; - exports.without.locals = {btnInfoIsDisabled: '_1L-rnCOXCE_7H94L5XT4uB', 'btn-info_is-disabled': '_1L-rnCOXCE_7H94L5XT4uB'}; - exports.dashes.locals = {btnInfo_isDisabled: '_1L-rnCOXCE_7H94L5XT4uB', 'btn-info_is-disabled': '_1L-rnCOXCE_7H94L5XT4uB'}; - exports.multipleDashes.locals = {btnInfo_isDisabled: '_3JUlsKrl__OF70Fq391jEw', 'btn--info_is-disabled': '_3JUlsKrl__OF70Fq391jEw'}; - exports.withoutOnly.locals = {btnInfoIsDisabled: '_1L-rnCOXCE_7H94L5XT4uB', simple: 'KKtodWG-IuEaequFjAsoJ'}; - exports.dashesOnly.locals = {btnInfo_isDisabled: '_1L-rnCOXCE_7H94L5XT4uB', simple: 'KKtodWG-IuEaequFjAsoJ'}; - test("with", css, exports.with, "?modules"); - test("without", css, exports.without, "?modules&camelCase"); - test("dashes", css, exports.dashes, "?modules&camelCase=dashes"); - test("multipleDashes", cssMultipleDashes, exports.multipleDashes, "?modules&camelCase=dashes"); - // Remove this option in v1.0.0 and make the removal of the original classname the default behaviour. See #440. - test("withoutOnly", mixedCss, exports.withoutOnly, "?modules&camelCase=only"); - // Remove this option in v1.0.0 and make the removal of the original classname the default behaviour. See #440. - test("dashesOnly", mixedCss, exports.dashesOnly, "?modules&camelCase=dashesOnly"); +describe('camelCase', () => { + const css = '.btn-info_is-disabled { color: blue; }'; + const cssMultipleDashes = '.btn--info_is-disabled { color: blue; }'; + const mixedCss = + '.btn-info_is-disabled { color: blue; } .simple { color: red; }'; + const exports = { + with: [[1, '._1L-rnCOXCE_7H94L5XT4uB { color: blue; }', '']], + without: [[1, '._1L-rnCOXCE_7H94L5XT4uB { color: blue; }', '']], + dashes: [[1, '._1L-rnCOXCE_7H94L5XT4uB { color: blue; }', '']], + multipleDashes: [[1, '._3JUlsKrl__OF70Fq391jEw { color: blue; }', '']], + withoutOnly: [ + [ + 1, + '._1L-rnCOXCE_7H94L5XT4uB { color: blue; } .KKtodWG-IuEaequFjAsoJ { color: red; }', + '', + ], + ], + dashesOnly: [ + [ + 1, + '._1L-rnCOXCE_7H94L5XT4uB { color: blue; } .KKtodWG-IuEaequFjAsoJ { color: red; }', + '', + ], + ], + }; + exports.with.locals = { 'btn-info_is-disabled': '_1L-rnCOXCE_7H94L5XT4uB' }; + exports.without.locals = { + btnInfoIsDisabled: '_1L-rnCOXCE_7H94L5XT4uB', + 'btn-info_is-disabled': '_1L-rnCOXCE_7H94L5XT4uB', + }; + exports.dashes.locals = { + btnInfo_isDisabled: '_1L-rnCOXCE_7H94L5XT4uB', + 'btn-info_is-disabled': '_1L-rnCOXCE_7H94L5XT4uB', + }; + exports.multipleDashes.locals = { + btnInfo_isDisabled: '_3JUlsKrl__OF70Fq391jEw', + 'btn--info_is-disabled': '_3JUlsKrl__OF70Fq391jEw', + }; + exports.withoutOnly.locals = { + btnInfoIsDisabled: '_1L-rnCOXCE_7H94L5XT4uB', + simple: 'KKtodWG-IuEaequFjAsoJ', + }; + exports.dashesOnly.locals = { + btnInfo_isDisabled: '_1L-rnCOXCE_7H94L5XT4uB', + simple: 'KKtodWG-IuEaequFjAsoJ', + }; + test('with', css, exports.with, '?modules'); + test('without', css, exports.without, '?modules&camelCase'); + test('dashes', css, exports.dashes, '?modules&camelCase=dashes'); + test( + 'multipleDashes', + cssMultipleDashes, + exports.multipleDashes, + '?modules&camelCase=dashes' + ); + // Remove this option in v1.0.0 and make the removal of the original classname the default behaviour. See #440. + test('withoutOnly', mixedCss, exports.withoutOnly, '?modules&camelCase=only'); + // Remove this option in v1.0.0 and make the removal of the original classname the default behaviour. See #440. + test( + 'dashesOnly', + mixedCss, + exports.dashesOnly, + '?modules&camelCase=dashesOnly' + ); - testRaw("withoutRaw", '.a {}', 'exports.locals = {\n\t"a": "_1buUQJccBRS2-2i27LCoDf"\n};', "?modules&camelCase"); - testRaw("dashesRaw", '.a {}', 'exports.locals = {\n\t"a": "_1buUQJccBRS2-2i27LCoDf"\n};', "?modules&camelCase=dashes"); + testRaw( + 'withoutRaw', + '.a {}', + 'exports.locals = {\n\t"a": "_1buUQJccBRS2-2i27LCoDf"\n};', + '?modules&camelCase' + ); + testRaw( + 'dashesRaw', + '.a {}', + 'exports.locals = {\n\t"a": "_1buUQJccBRS2-2i27LCoDf"\n};', + '?modules&camelCase=dashes' + ); }); diff --git a/test/cssBaseTest.js b/test/cssBaseTest.js index fa43cd96..61e43de1 100644 --- a/test/cssBaseTest.js +++ b/test/cssBaseTest.js @@ -1,95 +1,107 @@ -/*eslint-env mocha*/ +/* eslint-env mocha*/ -var base = require("../lib/css-base"); +const base = require('../lib/css-base'); -describe("css-base", function() { - before(function() { - global.btoa = function btoa(str) { - var buffer = null; +describe('css-base', () => { + before(() => { + global.btoa = function btoa(str) { + let buffer = null; - if (str instanceof Buffer) { - buffer = str; - } else { - buffer = new Buffer(str.toString(), 'binary'); - } + if (str instanceof Buffer) { + buffer = str; + } else { + buffer = new Buffer(str.toString(), 'binary'); + } - return buffer.toString('base64'); - } - }) + return buffer.toString('base64'); + }; + }); - after(function () { - global.btoa = null; - }) + after(() => { + global.btoa = null; + }); - it("should toString a single module", function() { - var m = base(); - m.push([1, "body { a: 1; }", ""]); - m.toString().should.be.eql("body { a: 1; }"); - }); - it("should toString multiple modules", function() { - var m = base(); - m.push([2, "body { b: 2; }", ""]); - m.push([1, "body { a: 1; }", ""]); - m.toString().should.be.eql("body { b: 2; }body { a: 1; }"); - }); - it("should toString with media query", function() { - var m = base(); - m.push([1, "body { a: 1; }", "screen"]); - m.toString().should.be.eql("@media screen{body { a: 1; }}"); - }); - it("should import modules", function() { - var m = base(); - var m1 = [1, "body { a: 1; }", "screen"]; - var m2 = [2, "body { b: 2; }", ""]; - var m3 = [3, "body { c: 3; }", ""]; - var m4 = [4, "body { d: 4; }", ""]; - m.i([m2, m3], ""); - m.i([m2], ""); - m.i([m2, m4], "print"); - m.push(m1); - m.toString().should.be.eql("body { b: 2; }" + - "body { c: 3; }" + - "@media print{body { d: 4; }}" + - "@media screen{body { a: 1; }}"); - }); - it("should import named modules", function() { - var m = base(); - var m1 = ["./module1", "body { a: 1; }", "screen"]; - var m2 = ["./module2", "body { b: 2; }", ""]; - var m3 = ["./module3", "body { c: 3; }", ""]; - var m4 = ["./module4", "body { d: 4; }", ""]; - m.i([m2, m3], ""); - m.i([m2], ""); - m.i([m2, m4], "print"); - m.push(m1); - m.toString().should.be.eql("body { b: 2; }" + - "body { c: 3; }" + - "@media print{body { d: 4; }}" + - "@media screen{body { a: 1; }}"); - }); - it("should toString with source mapping", function() { - var m = base(true); - m.push([1, "body { a: 1; }", "", { - file: "test.scss", - sources: [ - './path/to/test.scss' - ], - mappings: "AAAA;", - sourceRoot: "webpack://" - }]); - m.toString().should.be.eql("body { a: 1; }\n/*# sourceURL=webpack://./path/to/test.scss */\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoidGVzdC5zY3NzIiwic291cmNlcyI6WyIuL3BhdGgvdG8vdGVzdC5zY3NzIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290Ijoid2VicGFjazovLyJ9 */"); - }); - it("should toString without source mapping if btoa not avalibale", function() { - global.btoa = null; - var m = base(true); - m.push([1, "body { a: 1; }", "", { - file: "test.scss", - sources: [ - './path/to/test.scss' - ], - mappings: "AAAA;", - sourceRoot: "webpack://" - }]); - m.toString().should.be.eql("body { a: 1; }"); - }); + it('should toString a single module', () => { + const m = base(); + m.push([1, 'body { a: 1; }', '']); + m.toString().should.be.eql('body { a: 1; }'); + }); + it('should toString multiple modules', () => { + const m = base(); + m.push([2, 'body { b: 2; }', '']); + m.push([1, 'body { a: 1; }', '']); + m.toString().should.be.eql('body { b: 2; }body { a: 1; }'); + }); + it('should toString with media query', () => { + const m = base(); + m.push([1, 'body { a: 1; }', 'screen']); + m.toString().should.be.eql('@media screen{body { a: 1; }}'); + }); + it('should import modules', () => { + const m = base(); + const m1 = [1, 'body { a: 1; }', 'screen']; + const m2 = [2, 'body { b: 2; }', '']; + const m3 = [3, 'body { c: 3; }', '']; + const m4 = [4, 'body { d: 4; }', '']; + m.i([m2, m3], ''); + m.i([m2], ''); + m.i([m2, m4], 'print'); + m.push(m1); + m.toString().should.be.eql( + 'body { b: 2; }' + + 'body { c: 3; }' + + '@media print{body { d: 4; }}' + + '@media screen{body { a: 1; }}' + ); + }); + it('should import named modules', () => { + const m = base(); + const m1 = ['./module1', 'body { a: 1; }', 'screen']; + const m2 = ['./module2', 'body { b: 2; }', '']; + const m3 = ['./module3', 'body { c: 3; }', '']; + const m4 = ['./module4', 'body { d: 4; }', '']; + m.i([m2, m3], ''); + m.i([m2], ''); + m.i([m2, m4], 'print'); + m.push(m1); + m.toString().should.be.eql( + 'body { b: 2; }' + + 'body { c: 3; }' + + '@media print{body { d: 4; }}' + + '@media screen{body { a: 1; }}' + ); + }); + it('should toString with source mapping', () => { + const m = base(true); + m.push([ + 1, + 'body { a: 1; }', + '', + { + file: 'test.scss', + sources: ['./path/to/test.scss'], + mappings: 'AAAA;', + sourceRoot: 'webpack://', + }, + ]); + m.toString().should.be.eql( + 'body { a: 1; }\n/*# sourceURL=webpack://./path/to/test.scss */\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoidGVzdC5zY3NzIiwic291cmNlcyI6WyIuL3BhdGgvdG8vdGVzdC5zY3NzIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290Ijoid2VicGFjazovLyJ9 */' + ); + }); + it('should toString without source mapping if btoa not avalibale', () => { + global.btoa = null; + const m = base(true); + m.push([ + 1, + 'body { a: 1; }', + '', + { + file: 'test.scss', + sources: ['./path/to/test.scss'], + mappings: 'AAAA;', + sourceRoot: 'webpack://', + }, + ]); + m.toString().should.be.eql('body { a: 1; }'); + }); }); diff --git a/test/customGetLocalIdentTest.js b/test/customGetLocalIdentTest.js index ce581497..44a6b1e4 100644 --- a/test/customGetLocalIdentTest.js +++ b/test/customGetLocalIdentTest.js @@ -1,19 +1,20 @@ -/*globals describe */ +/* globals describe */ -var testLocals = require("./helpers").testLocals; +const { testLocals } = require('./helpers'); -describe("customGetLocalIdent", function() { - testLocals("should return only locals", - ".abc :local(.def) { color: red; } :local .ghi .jkl { color: blue; }", - { - def: "foo", - ghi: "foo", - jkl: "foo" - }, - { - getLocalIdent: function () { - return 'foo' - } - } - ); +describe('customGetLocalIdent', () => { + testLocals( + 'should return only locals', + '.abc :local(.def) { color: red; } :local .ghi .jkl { color: blue; }', + { + def: 'foo', + ghi: 'foo', + jkl: 'foo', + }, + { + getLocalIdent() { + return 'foo'; + }, + } + ); }); diff --git a/test/helpers.js b/test/helpers.js index 61d33d87..171edd5d 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,157 +1,221 @@ -/*globals it */ +/* globals it */ -require("should"); -var cssLoader = require("../index.js"); -var cssLoaderLocals = require("../locals.js"); -var vm = require("vm"); +require('should'); +const vm = require('vm'); + +const cssLoader = require('../index.js'); +const cssLoaderLocals = require('../locals.js'); function getEvaluated(output, modules) { - try { - var fn = vm.runInThisContext("(function(module, exports, require) {" + output + "})", "testcase.js"); - var m = { exports: {}, id: 1 }; - fn(m, m.exports, function(module) { - if(module.indexOf("css-base") >= 0) - return require("../lib/css-base"); - if(module.indexOf("url/escape") >= 0) - return require("../lib/url/escape"); - if(module.indexOf("-!/path/css-loader!") === 0) - module = module.substr(19); - if(modules && module in modules) - return modules[module]; - return "{" + module + "}"; - }); - } catch(e) { - console.error(output); // eslint-disable-line no-console - throw e; - } - delete m.exports.toString; - delete m.exports.i; - return m.exports; + let m; + try { + const fn = vm.runInThisContext( + `(function(module, exports, require) {${output}})`, + 'testcase.js' + ); + m = { exports: {}, id: 1 }; + fn(m, m.exports, (module) => { + if (module.indexOf('css-base') >= 0) { + // eslint-disable-next-line global-require + return require('../lib/css-base'); + } + if (module.indexOf('url/escape') >= 0) { + // eslint-disable-next-line global-require + return require('../lib/url/escape'); + } + if (module.indexOf('-!/path/css-loader!') === 0) { + // eslint-disable-next-line no-param-reassign + module = module.substr(19); + } + if (modules && module in modules) { + return modules[module]; + } + return `{${module}}`; + }); + } catch (e) { + console.error(output); // eslint-disable-line no-console + throw e; + } + delete m.exports.toString; + delete m.exports.i; + return m.exports; } function assetEvaluated(output, result, modules) { - var exports = getEvaluated(output, modules); - exports.should.be.eql(result); + const exports = getEvaluated(output, modules); + exports.should.be.eql(result); } function assertRaw(output, result) { - output.should.containEql(result); + output.should.containEql(result); } function runLoader(loader, input, map, addOptions, callback) { - var opt = { - options: { - context: "" - }, - callback: callback, - async: function() { - return callback; - }, - loaders: [{request: "/path/css-loader"}], - loaderIndex: 0, - context: "", - resource: "test.css", - resourcePath: "test.css", - request: "css-loader!test.css", - emitError: function(message) { - throw new Error(message); - } - }; - Object.keys(addOptions).forEach(function(key) { - opt[key] = addOptions[key]; - }); - loader.call(opt, input, map); + const opt = { + options: { + context: '', + }, + callback, + async() { + return callback; + }, + loaders: [{ request: '/path/css-loader' }], + loaderIndex: 0, + context: '', + resource: 'test.css', + resourcePath: 'test.css', + request: 'css-loader!test.css', + emitError(message) { + throw new Error(message); + }, + }; + Object.keys(addOptions).forEach((key) => { + opt[key] = addOptions[key]; + }); + loader.call(opt, input, map); } exports.test = function test(name, input, result, query, modules) { - it(name, function(done) { - runLoader(cssLoader, input, undefined, !query || typeof query === "string" ? { - query: query - } : query, function(err, output) { - if(err) return done(err); - assetEvaluated(output, result, modules); - done(); - }); - }); + it(name, (done) => { + runLoader( + cssLoader, + input, + null, + !query || typeof query === 'string' + ? { + query, + } + : query, + (err, output) => { + if (err) { + return done(err); + } + assetEvaluated(output, result, modules); + return done(); + } + ); + }); }; exports.testRaw = function testRaw(name, input, result, query) { - it(name, function(done) { - runLoader(cssLoader, input, undefined, !query || typeof query === "string" ? { - query: query - } : query, function(err, output) { - if(err) return done(err); - assertRaw(output, result); - done(); - }); - }); -} + it(name, (done) => { + runLoader( + cssLoader, + input, + null, + !query || typeof query === 'string' + ? { + query, + } + : query, + (err, output) => { + if (err) { + return done(err); + } + assertRaw(output, result); + return done(); + } + ); + }); +}; exports.testError = function test(name, input, onError) { - it(name, function(done) { - runLoader(cssLoader, input, undefined, {}, function(err, output) { // eslint-disable-line no-unused-vars + it(name, (done) => { + runLoader(cssLoader, input, null, {}, (err) => { + // eslint-disable-line no-unused-vars if (!err) { - done(new Error('Expected error to be thrown')); - } else { - try { - onError(err); - } catch (error) { - return done(error); - } - done(); + return done(new Error('Expected error to be thrown')); + } + try { + onError(err); + } catch (error) { + return done(error); } - }); - }); + return done(); + }); + }); }; exports.testWithMap = function test(name, input, map, result, query, modules) { - it(name, function(done) { - runLoader(cssLoader, input, map, { - query: query - }, function(err, output) { - if(err) return done(err); - assetEvaluated(output, result, modules); - done(); - }); - }); + it(name, (done) => { + runLoader( + cssLoader, + input, + map, + { + query, + }, + (err, output) => { + if (err) { + return done(err); + } + assetEvaluated(output, result, modules); + return done(); + } + ); + }); }; exports.testMap = function test(name, input, map, addOptions, result, modules) { - it(name, function(done) { - runLoader(cssLoader, input, map, addOptions, function(err, output) { - if(err) return done(err); - assetEvaluated(output, result, modules); - done(); - }); - }); + it(name, (done) => { + runLoader(cssLoader, input, map, addOptions, (err, output) => { + if (err) { + return done(err); + } + assetEvaluated(output, result, modules); + return done(); + }); + }); }; exports.testLocals = function testLocals(name, input, result, query, modules) { - it(name, function(done) { - runLoader(cssLoaderLocals, input, undefined, { - query: query - }, function(err, output) { - if(err) return done(err); - assetEvaluated(output, result, modules); - done(); - }); - }); + it(name, (done) => { + runLoader( + cssLoaderLocals, + input, + null, + { + query, + }, + (err, output) => { + if (err) { + return done(err); + } + assetEvaluated(output, result, modules); + return done(); + } + ); + }); }; -exports.testSingleItem = function testSingleItem(name, input, result, query, modules) { - it(name, function(done) { - runLoader(cssLoader, input, undefined, { - query: query - }, function(err, output) { - if(err) return done(err); - var exports = getEvaluated(output, modules); - Array.isArray(exports).should.be.eql(true); - (exports.length).should.be.eql(1); - (exports[0].length >= 3).should.be.eql(true); - (exports[0][0]).should.be.eql(1); - (exports[0][2]).should.be.eql(""); - (exports[0][1]).should.be.eql(result); - done(); - }); - }); +exports.testSingleItem = function testSingleItem( + name, + input, + result, + query, + modules +) { + it(name, (done) => { + runLoader( + cssLoader, + input, + null, + { + query, + }, + (err, output) => { + if (err) { + return done(err); + } + const exports = getEvaluated(output, modules); + Array.isArray(exports).should.be.eql(true); + exports.length.should.be.eql(1); + (exports[0].length >= 3).should.be.eql(true); + exports[0][0].should.be.eql(1); + exports[0][2].should.be.eql(''); + exports[0][1].should.be.eql(result); + return done(); + } + ); + }); }; diff --git a/test/importTest.js b/test/importTest.js index cd08dda0..6947acd7 100644 --- a/test/importTest.js +++ b/test/importTest.js @@ -1,91 +1,137 @@ -/*globals describe */ +/* globals describe */ -var assert = require('assert'); +const assert = require('assert'); -var helpers = require("./helpers"); -var test = helpers.test; -var testError = helpers.testError; +const { test, testError } = require('./helpers'); -describe("import", function() { - test("import", "@import url(test.css);\n.class { a: b c d; }", [ - [2, ".test{a: b}", ""], - [1, ".class { a: b c d; }", ""] - ], "", { - "./test.css": [[2, ".test{a: b}", ""]] - }); - test("import with trailing whitespace", "@import url(test.css );\n.class { a: b c d; }", [ - [2, ".test{a: b}", ""], - [1, ".class { a: b c d; }", ""] - ], "", { - "./test.css": [[2, ".test{a: b}", ""]] - }); - test("import camelcase", "@IMPORT url(test.css);\n.class { a: b c d; }", [ - [2, ".test{a: b}", ""], - [1, ".class { a: b c d; }", ""] - ], "", { - "./test.css": [[2, ".test{a: b}", ""]] - }); - test("import empty url", "@import url();\n.class { a: b c d; }", [ - [1, "@import url();\n.class { a: b c d; }", ""] - ], ""); - test("import empty url with quotes", "@import url('');\n.class { a: b c d; }", [ - [1, "@import url('');\n.class { a: b c d; }", ""] - ], ""); - test("import with string", "@import \"test.css\";\n.class { a: b c d; }", [ - [2, ".test{a: b}", ""], - [1, ".class { a: b c d; }", ""] - ], "", { - "./test.css": [[2, ".test{a: b}", ""]] - }); - test("import with empty string", "@import \"\";\n.class { a: b c d; }", [ - [1, "@import \"\";\n.class { a: b c d; }", ""] - ], ""); - test("import with string contain spaces", "@import \" \";\n.class { a: b c d; }", [ - [1, "@import \" \";\n.class { a: b c d; }", ""] - ], ""); - test("import with string contain newline", "@import \"\n\";\n.class { a: b c d; }", [ - [1, "@import \"\n\";\n.class { a: b c d; }", ""] - ], ""); - test("import with string contain CRLF", "@import \"\r\n\";\r\n.class { a: b c d; }", [ - [1, "@import \"\r\n\";\r\n.class { a: b c d; }", ""] - ], ""); - test("import with string contain tab", "@import \"\t\";\n.class { a: b c d; }", [ - [1, "@import \"\t\";\n.class { a: b c d; }", ""] - ], ""); - test("import 2", "@import url('test.css');\n.class { a: b c d; }", [ - [2, ".test{a: b}", "screen"], - [1, ".class { a: b c d; }", ""] - ], "", { - "./test.css": [[2, ".test{a: b}", "screen"]] - }); - test("import with media", "@import url('~test/css') screen and print;\n.class { a: b c d; }", [ - [3, ".test{a: b}", "((min-width: 100px)) and (screen and print)"], - [2, ".test{c: d}", "screen and print"], - [1, ".class { a: b c d; }", ""] - ], "", { - "test/css": [ - [3, ".test{a: b}", "(min-width: 100px)"], - [2, ".test{c: d}", ""] - ] - }); - test("import external", "@import url(http://example.com/style.css);\n@import url(\"//example.com/style.css\");", [ - [1, "@import url(http://example.com/style.css);", ""], - [1, "@import url(//example.com/style.css);", ""], - [1, "", ""] - ]); - test("import disabled", "@import url(test.css);\n.class { a: b c d; }", [ - [1, "@import url(test.css);\n.class { a: b c d; }", ""] - ], "?-import"); - test("@import-normalize left untouched", "@import-normalize;", [ - [1, "@import-normalize;", ""] - ]); - testError("@import without url", "@import;", function(err) { - assert.equal(err.message, [ - 'Unexpected format (1:1)', - '', - '> 1 | @import;', - ' | ^', - '', - ].join('\n')) - }) -}) +describe('import', () => { + test( + 'import', + '@import url(test.css);\n.class { a: b c d; }', + [[2, '.test{a: b}', ''], [1, '.class { a: b c d; }', '']], + '', + { + './test.css': [[2, '.test{a: b}', '']], + } + ); + test( + 'import with trailing whitespace', + '@import url(test.css );\n.class { a: b c d; }', + [[2, '.test{a: b}', ''], [1, '.class { a: b c d; }', '']], + '', + { + './test.css': [[2, '.test{a: b}', '']], + } + ); + test( + 'import camelcase', + '@IMPORT url(test.css);\n.class { a: b c d; }', + [[2, '.test{a: b}', ''], [1, '.class { a: b c d; }', '']], + '', + { + './test.css': [[2, '.test{a: b}', '']], + } + ); + test( + 'import empty url', + '@import url();\n.class { a: b c d; }', + [[1, '@import url();\n.class { a: b c d; }', '']], + '' + ); + test( + 'import empty url with quotes', + "@import url('');\n.class { a: b c d; }", + [[1, "@import url('');\n.class { a: b c d; }", '']], + '' + ); + test( + 'import with string', + '@import "test.css";\n.class { a: b c d; }', + [[2, '.test{a: b}', ''], [1, '.class { a: b c d; }', '']], + '', + { + './test.css': [[2, '.test{a: b}', '']], + } + ); + test( + 'import with empty string', + '@import "";\n.class { a: b c d; }', + [[1, '@import "";\n.class { a: b c d; }', '']], + '' + ); + test( + 'import with string contain spaces', + '@import " ";\n.class { a: b c d; }', + [[1, '@import " ";\n.class { a: b c d; }', '']], + '' + ); + test( + 'import with string contain newline', + '@import "\n";\n.class { a: b c d; }', + [[1, '@import "\n";\n.class { a: b c d; }', '']], + '' + ); + test( + 'import with string contain CRLF', + '@import "\r\n";\r\n.class { a: b c d; }', + [[1, '@import "\r\n";\r\n.class { a: b c d; }', '']], + '' + ); + test( + 'import with string contain tab', + '@import "\t";\n.class { a: b c d; }', + [[1, '@import "\t";\n.class { a: b c d; }', '']], + '' + ); + test( + 'import 2', + "@import url('test.css');\n.class { a: b c d; }", + [[2, '.test{a: b}', 'screen'], [1, '.class { a: b c d; }', '']], + '', + { + './test.css': [[2, '.test{a: b}', 'screen']], + } + ); + test( + 'import with media', + "@import url('~test/css') screen and print;\n.class { a: b c d; }", + [ + [3, '.test{a: b}', '((min-width: 100px)) and (screen and print)'], + [2, '.test{c: d}', 'screen and print'], + [1, '.class { a: b c d; }', ''], + ], + '', + { + 'test/css': [ + [3, '.test{a: b}', '(min-width: 100px)'], + [2, '.test{c: d}', ''], + ], + } + ); + test( + 'import external', + '@import url(http://example.com/style.css);\n@import url("//example.com/style.css");', + [ + [1, '@import url(http://example.com/style.css);', ''], + [1, '@import url(//example.com/style.css);', ''], + [1, '', ''], + ] + ); + test( + 'import disabled', + '@import url(test.css);\n.class { a: b c d; }', + [[1, '@import url(test.css);\n.class { a: b c d; }', '']], + '?-import' + ); + test('@import-normalize left untouched', '@import-normalize;', [ + [1, '@import-normalize;', ''], + ]); + testError('@import without url', '@import;', (err) => { + assert.equal( + err.message, + ['Unexpected format (1:1)', '', '> 1 | @import;', ' | ^', ''].join( + '\n' + ) + ); + }); +}); diff --git a/test/localTest.js b/test/localTest.js index 34b16ce3..8e57a6dc 100644 --- a/test/localTest.js +++ b/test/localTest.js @@ -1,212 +1,322 @@ -/*globals describe */ +/* globals describe */ -var test = require("./helpers").test; +const { test } = require('./helpers'); function testLocal(name, input, result, localsResult, query, modules) { - result.locals = localsResult; - test(name, input, result, query, modules); + // eslint-disable-next-line no-param-reassign + result.locals = localsResult; + test(name, input, result, query, modules); } -describe("local", function() { - testLocal("locals-format", ":local(.test) { background: red; }", [ - [1, ".test-2_pBx { background: red; }", ""] - ], { - test: "test-2_pBx" - }, "?localIdentName=[local]-[hash:base64:5]"); - testLocal("locals", ":local(.className) { background: red; }\n:local(#someId) { background: green; }\n" + - ":local(.className .subClass) { color: green; }\n:local(#someId .subClass) { color: blue; }", [ - [1, "._23J0282swY7bwvI2X4fHiV { background: red; }\n#_3vpqN0v_IxlO3TzQjbpB33 { background: green; }\n" + - "._23J0282swY7bwvI2X4fHiV ._1s1VsToXFz17cPAltMg7jz { color: green; }\n#_3vpqN0v_IxlO3TzQjbpB33 ._1s1VsToXFz17cPAltMg7jz { color: blue; }", ""] - ], { - className: "_23J0282swY7bwvI2X4fHiV", - someId: "_3vpqN0v_IxlO3TzQjbpB33", - subClass: "_1s1VsToXFz17cPAltMg7jz" - }); - testLocal("mode switching", ".c1 :local .c2 .c3 :global .c4 :local .c5, .c6 :local .c7 { background: red; }\n.c8 { background: red; }", [ - [1, ".c1 ._c2 ._c3 .c4 ._c5, .c6 ._c7 { background: red; }\n.c8 { background: red; }", ""] - ], { - c2: "_c2", - c3: "_c3", - c5: "_c5", - c7: "_c7" - }, "?localIdentName=_[local]"); - testLocal("comment in local", ":local(.c1/*.c2*/.c3) { background: red; }", [ - [1, "._c1/*.c2*/._c3 { background: red; }", ""] - ], { - c1: "_c1", - c3: "_c3" - }, "?localIdentName=_[local]"); - testLocal("comment in local", ":local(.c1/*.c2*/.c3) { background: red; }", [ - [1, "._c1/*.c2*/._c3 { background: red; }", ""] - ], { - c1: "_c1", - c3: "_c3" - }, "?localIdentName=_[local]"); - testLocal("strings in local", ":local(.c1[data-attr=\".c2)]'\"]:not(.c3):not(.c4)) { background: red; }", [ - [1, "._c1[data-attr=\".c2)]'\"]:not(._c3):not(._c4) { background: red; }", ""] - ], { - c1: "_c1", - c3: "_c3", - c4: "_c4" - }, "?localIdentName=_[local]"); +describe('local', () => { + testLocal( + 'locals-format', + ':local(.test) { background: red; }', + [[1, '.test-2_pBx { background: red; }', '']], + { + test: 'test-2_pBx', + }, + '?localIdentName=[local]-[hash:base64:5]' + ); + testLocal( + 'locals', + ':local(.className) { background: red; }\n:local(#someId) { background: green; }\n' + + ':local(.className .subClass) { color: green; }\n:local(#someId .subClass) { color: blue; }', + [ + [ + 1, + '._23J0282swY7bwvI2X4fHiV { background: red; }\n#_3vpqN0v_IxlO3TzQjbpB33 { background: green; }\n' + + '._23J0282swY7bwvI2X4fHiV ._1s1VsToXFz17cPAltMg7jz { color: green; }\n#_3vpqN0v_IxlO3TzQjbpB33 ._1s1VsToXFz17cPAltMg7jz { color: blue; }', + '', + ], + ], + { + className: '_23J0282swY7bwvI2X4fHiV', + someId: '_3vpqN0v_IxlO3TzQjbpB33', + subClass: '_1s1VsToXFz17cPAltMg7jz', + } + ); + testLocal( + 'mode switching', + '.c1 :local .c2 .c3 :global .c4 :local .c5, .c6 :local .c7 { background: red; }\n.c8 { background: red; }', + [ + [ + 1, + '.c1 ._c2 ._c3 .c4 ._c5, .c6 ._c7 { background: red; }\n.c8 { background: red; }', + '', + ], + ], + { + c2: '_c2', + c3: '_c3', + c5: '_c5', + c7: '_c7', + }, + '?localIdentName=_[local]' + ); + testLocal( + 'comment in local', + ':local(.c1/*.c2*/.c3) { background: red; }', + [[1, '._c1/*.c2*/._c3 { background: red; }', '']], + { + c1: '_c1', + c3: '_c3', + }, + '?localIdentName=_[local]' + ); + testLocal( + 'comment in local', + ':local(.c1/*.c2*/.c3) { background: red; }', + [[1, '._c1/*.c2*/._c3 { background: red; }', '']], + { + c1: '_c1', + c3: '_c3', + }, + '?localIdentName=_[local]' + ); + testLocal( + 'strings in local', + ':local(.c1[data-attr=".c2)]\'"]:not(.c3):not(.c4)) { background: red; }', + [ + [ + 1, + '._c1[data-attr=".c2)]\'"]:not(._c3):not(._c4) { background: red; }', + '', + ], + ], + { + c1: '_c1', + c3: '_c3', + c4: '_c4', + }, + '?localIdentName=_[local]' + ); - testLocal("composes class simple", ":local(.c1) { a: 1; }\n:local(.c2) { composes: c1; b: 1; }", [ - [1, "._c1 { a: 1; }\n._c2 { b: 1; }", ""] - ], { - c1: "_c1", - c2: "_c2 _c1" - }, "?localIdentName=_[local]"); - testLocal("composes class from module", [ - ":local(.c1) { composes: c2 from \"./module\"; b: 1; }", - ":local(.c3) { composes: c1; b: 3; }", - ":local(.c5) { composes: c2 c4 from \"./module\"; b: 5; }" - ].join("\n"), [ - [2, ".test{c: d}", ""], - [1, [ - "._c1 { b: 1; }", - "._c3 { b: 3; }", - "._c5 { b: 5; }" - ].join("\n"), ""] - ], { - c1: "_c1 imported-c2", - c3: "_c3 _c1 imported-c2", - c5: "_c5 imported-c2 imported-c4" - }, "?localIdentName=_[local]", { - "./module": (function() { - var r = [ - [2, ".test{c: d}", ""] - ]; - r.locals = { - c2: "imported-c2", - c4: "imported-c4" - }; - return r; - }()) - }); - testLocal("composes class with hyphen from module", [ - ":local(.c1) { composes: c-2 from \"./module\"; b: 1; }", - ":local(.c3) { composes: c1; b: 3; }", - ":local(.c5) { composes: c-2 c4 from \"./module\"; b: 5; }" - ].join("\n"), [ - [2, ".test{c: d}", ""], - [1, [ - "._c1 { b: 1; }", - "._c3 { b: 3; }", - "._c5 { b: 5; }" - ].join("\n"), ""] - ], { - c1: "_c1 imported-c-2", - c3: "_c3 _c1 imported-c-2", - c5: "_c5 imported-c-2 imported-c4" - }, "?localIdentName=_[local]", { - "./module": (function() { - var r = [ - [2, ".test{c: d}", ""] - ]; - r.locals = { - "c-2": "imported-c-2", - c4: "imported-c4" - }; - return r; - }()) - }); - testLocal("composes class from module with import", [ - "@import url(\"module\");", - ":local(.c1) { composes: c2 c3 from \"./module\"; composes: c4 from \"./module\"; b: 1; }" - ].join("\n"), [ - [2, ".test{c: d}", ""], - [1, "._c1 { b: 1; }", ""] - ], { - c1: "_c1 imported-c2 imported-c3 imported-c4" - }, "?localIdentName=_[local]", { - "./module": (function() { - var r = [ - [2, ".test{c: d}", ""] - ]; - r.locals = { - c2: "imported-c2", - c3: "imported-c3", - c4: "imported-c4" - }; - return r; - }()) - }); - testLocal("module mode", ".className { background: url(./file.png); }\n#someId { background: url('module/file.jpg'); }\n" + - ".className .subClass { font-size: 5.5pt; }\n#someId .subClass { color: blue; }", [ - [1, "._23J0282swY7bwvI2X4fHiV { background: url({./file.png}); }\n#_3vpqN0v_IxlO3TzQjbpB33 { background: url({module/file.jpg}); }\n" + - "._23J0282swY7bwvI2X4fHiV ._1s1VsToXFz17cPAltMg7jz { font-size: 5.5pt; }\n#_3vpqN0v_IxlO3TzQjbpB33 ._1s1VsToXFz17cPAltMg7jz { color: blue; }", ""] - ], { - className: "_23J0282swY7bwvI2X4fHiV", - someId: "_3vpqN0v_IxlO3TzQjbpB33", - subClass: "_1s1VsToXFz17cPAltMg7jz" - }, "?modules"); - testLocal("class name parsing", ".-a0-34a___f { color: red; }", [ - [1, "._3ZMCqVa1XidxdqbX65hZ5D { color: red; }", ""] - ], { - "-a0-34a___f": "_3ZMCqVa1XidxdqbX65hZ5D" - }, "?modules"); - testLocal("imported values in decl", ".className { color: IMPORTED_NAME; }\n" + - ":import(\"./vars.css\") { IMPORTED_NAME: primary-color; }", [ - [1, "._className { color: red; }", ""] - ], { - "className": "_className" - }, "?modules&localIdentName=_[local]", { - "./vars.css": { - locals: { - "primary-color": "red" - } - } - }); - testLocal("issue-109", ".bar-1 { color: red; }", [ - [1, ".file--bar-1--2JvfJ { color: red; }", ""] - ], { - "bar-1": "file--bar-1--2JvfJ" - }, "?modules&importLoaders=1&localIdentName=[name]--[local]--[hash:base64:5]"); - testLocal("path naming", ".bar { color: red; }", [ - [1, ".path-to--file--bar { color: red; }", ""] - ], { - "bar": "path-to--file--bar" - }, { - query: "?modules&localIdentName=[path]-[name]--[local]", - resourcePath: "/root/path/to/file.css", - options: { - context: "/root/" - } - }); - testLocal("path naming with context", ".bar { color: red; }", [ - [1, ".to--file--bar { color: red; }", ""] - ], { - "bar": "to--file--bar" - }, { - query: "?modules&localIdentName=[path]-[name]--[local]&context=/root/path", - resourcePath: "/root/path/to/file.css", - options: { - context: "/root/" - } - }); - testLocal("hash prefix", ".bar { color: red; }", [ - [1, ".bar--58a3b08b9195a6af0de7431eaf3427c7 { color: red; }", ""] - ], { - "bar": "bar--58a3b08b9195a6af0de7431eaf3427c7" - }, "?modules&localIdentName=[local]--[hash]&hashPrefix=x"); - testLocal("prefixes leading digit with underscore", ":local(.test) { background: red; }", [ - [1, "._1test { background: red; }", ""] - ], { - test: "_1test" - }, "?localIdentName=1[local]"); - testLocal("prefixes leading hyphen + digit with underscore", ":local(.test) { background: red; }", [ - [1, "._-1test { background: red; }", ""] - ], { - test: "_-1test" - }, "?localIdentName=-1[local]"); - testLocal("prefixes two leading hyphens with underscore", ":local(.test) { background: red; }", [ - [1, "._--test { background: red; }", ""] - ], { - test: "_--test" - }, "?localIdentName=--[local]"); - testLocal("saves underscore prefix in exported class names", ":export { _test: _test }", [ - [1, "", ""] - ], { - _test: '_test' - }, "?localIdentName=[local]"); + testLocal( + 'composes class simple', + ':local(.c1) { a: 1; }\n:local(.c2) { composes: c1; b: 1; }', + [[1, '._c1 { a: 1; }\n._c2 { b: 1; }', '']], + { + c1: '_c1', + c2: '_c2 _c1', + }, + '?localIdentName=_[local]' + ); + testLocal( + 'composes class from module', + [ + ':local(.c1) { composes: c2 from "./module"; b: 1; }', + ':local(.c3) { composes: c1; b: 3; }', + ':local(.c5) { composes: c2 c4 from "./module"; b: 5; }', + ].join('\n'), + [ + [2, '.test{c: d}', ''], + [ + 1, + ['._c1 { b: 1; }', '._c3 { b: 3; }', '._c5 { b: 5; }'].join('\n'), + '', + ], + ], + { + c1: '_c1 imported-c2', + c3: '_c3 _c1 imported-c2', + c5: '_c5 imported-c2 imported-c4', + }, + '?localIdentName=_[local]', + { + './module': (() => { + const r = [[2, '.test{c: d}', '']]; + r.locals = { + c2: 'imported-c2', + c4: 'imported-c4', + }; + return r; + })(), + } + ); + testLocal( + 'composes class with hyphen from module', + [ + ':local(.c1) { composes: c-2 from "./module"; b: 1; }', + ':local(.c3) { composes: c1; b: 3; }', + ':local(.c5) { composes: c-2 c4 from "./module"; b: 5; }', + ].join('\n'), + [ + [2, '.test{c: d}', ''], + [ + 1, + ['._c1 { b: 1; }', '._c3 { b: 3; }', '._c5 { b: 5; }'].join('\n'), + '', + ], + ], + { + c1: '_c1 imported-c-2', + c3: '_c3 _c1 imported-c-2', + c5: '_c5 imported-c-2 imported-c4', + }, + '?localIdentName=_[local]', + { + './module': (() => { + const r = [[2, '.test{c: d}', '']]; + r.locals = { + 'c-2': 'imported-c-2', + c4: 'imported-c4', + }; + return r; + })(), + } + ); + testLocal( + 'composes class from module with import', + [ + '@import url("module");', + ':local(.c1) { composes: c2 c3 from "./module"; composes: c4 from "./module"; b: 1; }', + ].join('\n'), + [[2, '.test{c: d}', ''], [1, '._c1 { b: 1; }', '']], + { + c1: '_c1 imported-c2 imported-c3 imported-c4', + }, + '?localIdentName=_[local]', + { + './module': (() => { + const r = [[2, '.test{c: d}', '']]; + r.locals = { + c2: 'imported-c2', + c3: 'imported-c3', + c4: 'imported-c4', + }; + return r; + })(), + } + ); + testLocal( + 'module mode', + ".className { background: url(./file.png); }\n#someId { background: url('module/file.jpg'); }\n" + + '.className .subClass { font-size: 5.5pt; }\n#someId .subClass { color: blue; }', + [ + [ + 1, + '._23J0282swY7bwvI2X4fHiV { background: url({./file.png}); }\n#_3vpqN0v_IxlO3TzQjbpB33 { background: url({module/file.jpg}); }\n' + + '._23J0282swY7bwvI2X4fHiV ._1s1VsToXFz17cPAltMg7jz { font-size: 5.5pt; }\n#_3vpqN0v_IxlO3TzQjbpB33 ._1s1VsToXFz17cPAltMg7jz { color: blue; }', + '', + ], + ], + { + className: '_23J0282swY7bwvI2X4fHiV', + someId: '_3vpqN0v_IxlO3TzQjbpB33', + subClass: '_1s1VsToXFz17cPAltMg7jz', + }, + '?modules' + ); + testLocal( + 'class name parsing', + '.-a0-34a___f { color: red; }', + [[1, '._3ZMCqVa1XidxdqbX65hZ5D { color: red; }', '']], + { + '-a0-34a___f': '_3ZMCqVa1XidxdqbX65hZ5D', + }, + '?modules' + ); + testLocal( + 'imported values in decl', + '.className { color: IMPORTED_NAME; }\n' + + ':import("./vars.css") { IMPORTED_NAME: primary-color; }', + [[1, '._className { color: red; }', '']], + { + className: '_className', + }, + '?modules&localIdentName=_[local]', + { + './vars.css': { + locals: { + 'primary-color': 'red', + }, + }, + } + ); + testLocal( + 'issue-109', + '.bar-1 { color: red; }', + [[1, '.file--bar-1--2JvfJ { color: red; }', '']], + { + 'bar-1': 'file--bar-1--2JvfJ', + }, + '?modules&importLoaders=1&localIdentName=[name]--[local]--[hash:base64:5]' + ); + testLocal( + 'path naming', + '.bar { color: red; }', + [[1, '.path-to--file--bar { color: red; }', '']], + { + bar: 'path-to--file--bar', + }, + { + query: '?modules&localIdentName=[path]-[name]--[local]', + resourcePath: '/root/path/to/file.css', + options: { + context: '/root/', + }, + } + ); + testLocal( + 'path naming with context', + '.bar { color: red; }', + [[1, '.to--file--bar { color: red; }', '']], + { + bar: 'to--file--bar', + }, + { + query: + '?modules&localIdentName=[path]-[name]--[local]&context=/root/path', + resourcePath: '/root/path/to/file.css', + options: { + context: '/root/', + }, + } + ); + testLocal( + 'hash prefix', + '.bar { color: red; }', + [[1, '.bar--58a3b08b9195a6af0de7431eaf3427c7 { color: red; }', '']], + { + bar: 'bar--58a3b08b9195a6af0de7431eaf3427c7', + }, + '?modules&localIdentName=[local]--[hash]&hashPrefix=x' + ); + testLocal( + 'prefixes leading digit with underscore', + ':local(.test) { background: red; }', + [[1, '._1test { background: red; }', '']], + { + test: '_1test', + }, + '?localIdentName=1[local]' + ); + testLocal( + 'prefixes leading hyphen + digit with underscore', + ':local(.test) { background: red; }', + [[1, '._-1test { background: red; }', '']], + { + test: '_-1test', + }, + '?localIdentName=-1[local]' + ); + testLocal( + 'prefixes two leading hyphens with underscore', + ':local(.test) { background: red; }', + [[1, '._--test { background: red; }', '']], + { + test: '_--test', + }, + '?localIdentName=--[local]' + ); + testLocal( + 'saves underscore prefix in exported class names', + ':export { _test: _test }', + [[1, '', '']], + { + _test: '_test', + }, + '?localIdentName=[local]' + ); }); diff --git a/test/localsTest.js b/test/localsTest.js index a706c2c8..b3b14401 100644 --- a/test/localsTest.js +++ b/test/localsTest.js @@ -1,59 +1,64 @@ -/*globals describe */ +/* globals describe */ -var testLocals = require("./helpers").testLocals; +const { testLocals } = require('./helpers'); -describe("locals", function() { - testLocals("should return only locals", - ".abc :local(.def) { color: red; } :local .ghi .jkl { color: blue; }", - { - def: "_def", - ghi: "_ghi", - jkl: "_jkl" - }, - "?localIdentName=_[local]" - ); - testLocals("should return only locals with composing", - ":local(.abc) { color: red; } :local(.def) { composes: abc; background: green; }", - { - abc: "_abc", - def: "_def _abc" - }, - "?localIdentName=_[local]" - ); - testLocals("should return only locals with importing", - ":local(.abc) { composes: def from \"./module.css\"; }", - { - abc: "_abc imported_def imported_ghi" - }, - "?localIdentName=_[local]", - { - "./module.css": { - def: "imported_def imported_ghi", - ghi: "imported_ghi" - } - } - ); - testLocals("should return only locals with importing", - ":local(.abc) { composes: def from \"./module1.css\"; composes: def from \"./module2.css\"; }", - { - abc: "_abc imported_def1 imported_ghi1 imported_def2" - }, - "?localIdentName=_[local]", - { - "./module1.css": { - def: "imported_def1 imported_ghi1", - ghi: "imported_ghi1" - }, - "./module2.css": { - def: "imported_def2" - } - } - ); - testLocals("should not fail on processing a url", - ":local(.abc) { background: url(http://example.com/image.jpg); }", - { - abc: "_abc" - }, - "?localIdentName=_[local]" - ); +describe('locals', () => { + testLocals( + 'should return only locals', + '.abc :local(.def) { color: red; } :local .ghi .jkl { color: blue; }', + { + def: '_def', + ghi: '_ghi', + jkl: '_jkl', + }, + '?localIdentName=_[local]' + ); + testLocals( + 'should return only locals with composing', + ':local(.abc) { color: red; } :local(.def) { composes: abc; background: green; }', + { + abc: '_abc', + def: '_def _abc', + }, + '?localIdentName=_[local]' + ); + testLocals( + 'should return only locals with importing', + ':local(.abc) { composes: def from "./module.css"; }', + { + abc: '_abc imported_def imported_ghi', + }, + '?localIdentName=_[local]', + { + './module.css': { + def: 'imported_def imported_ghi', + ghi: 'imported_ghi', + }, + } + ); + testLocals( + 'should return only locals with importing', + ':local(.abc) { composes: def from "./module1.css"; composes: def from "./module2.css"; }', + { + abc: '_abc imported_def1 imported_ghi1 imported_def2', + }, + '?localIdentName=_[local]', + { + './module1.css': { + def: 'imported_def1 imported_ghi1', + ghi: 'imported_ghi1', + }, + './module2.css': { + def: 'imported_def2', + }, + } + ); + testLocals( + 'should not fail on processing a url', + ':local(.abc) { background: url(http://example.com/image.jpg); }', + { + abc: '_abc', + }, + '?localIdentName=_[local]' + ); }); diff --git a/test/moduleTest.js b/test/moduleTest.js index 956f543b..b0916a38 100644 --- a/test/moduleTest.js +++ b/test/moduleTest.js @@ -1,17 +1,24 @@ -/*globals describe */ +/* globals describe */ -var test = require("./helpers").testSingleItem; +const path = require('path'); +const fs = require('fs'); -var path = require("path"); -var fs = require("fs"); -var testCasesPath = path.join(__dirname, "moduleTestCases"); -var testCases = fs.readdirSync(testCasesPath); +const test = require('./helpers').testSingleItem; -describe("module", function() { - testCases.forEach(function(name) { - var source = fs.readFileSync(path.join(testCasesPath, name, "source.css"), "utf-8"); - var expected = fs.readFileSync(path.join(testCasesPath, name, "expected.css"), "utf-8"); +const testCasesPath = path.join(__dirname, 'moduleTestCases'); +const testCases = fs.readdirSync(testCasesPath); - test(name, source, expected, "?modules&sourceMap&localIdentName=_[local]_"); - }); +describe('module', () => { + testCases.forEach((name) => { + const source = fs.readFileSync( + path.join(testCasesPath, name, 'source.css'), + 'utf-8' + ); + const expected = fs.readFileSync( + path.join(testCasesPath, name, 'expected.css'), + 'utf-8' + ); + + test(name, source, expected, '?modules&sourceMap&localIdentName=_[local]_'); + }); }); diff --git a/test/simpleTest.js b/test/simpleTest.js index a42ae808..a0a04d50 100644 --- a/test/simpleTest.js +++ b/test/simpleTest.js @@ -1,48 +1,47 @@ -/*globals describe */ +/* globals describe */ -var assert = require('assert'); -var test = require("./helpers").test; -var testError = require("./helpers").testError; +const assert = require('assert'); -describe("simple", function() { - test("empty", "", [ - [1, "", ""] - ]); - test("simple", ".class { a: b c d; }", [ - [1, ".class { a: b c d; }", ""] - ]); - test("simple2", ".class { a: b c d; }\n.two {}", [ - [1, ".class { a: b c d; }\n.two {}", ""] - ]); - test("escaped selector", ".u-m\\+ { a: b c d; }", [ - [1, ".u-m\\+ { a: b c d; }", ""] - ]); - test("escaped characters (uppercase)", ".class { content: \"\\F10C\" }", [ - [1, ".class { content: \"\\F10C\" }", ""] - ]); - // Need uncomment after resolve https://github.com/css-modules/postcss-modules-local-by-default/issues/108 - /*test("escape characters (lowercase)", ".class { content: \"\\f10C\" }", [ - [1, ".class { content: \"\\f10C\" }", ""] - ]);*/ - // Need uncomment after resolve https://github.com/mathiasbynens/cssesc/issues/10 - /*test("escape characters (two)", ".class { content: \"\\F10C \\F10D\" }", [ - [1, ".class { content: \"\\F10C \\F10D\" }", ""] - ]);*/ - test("charset directive", "@charset \"UTF-8\";\n .class { a: b c d; }", [ - [1, "@charset \"UTF-8\";\n .class { a: b c d; }", ""] - ]); - test("custom variables", ":root {--foo: 1px;\n--bar: 2px;}", [ - [1, ":root {--foo: 1px;\n--bar: 2px;}", ""] +const { test, testError } = require('./helpers'); + +describe('simple', () => { + test('empty', '', [[1, '', '']]); + test('simple', '.class { a: b c d; }', [[1, '.class { a: b c d; }', '']]); + test('simple2', '.class { a: b c d; }\n.two {}', [ + [1, '.class { a: b c d; }\n.two {}', ''], + ]); + test('escaped selector', '.u-m\\+ { a: b c d; }', [ + [1, '.u-m\\+ { a: b c d; }', ''], + ]); + test('escaped characters (uppercase)', '.class { content: "\\F10C" }', [ + [1, '.class { content: "\\F10C" }', ''], + ]); + // Need uncomment after resolve https://github.com/css-modules/postcss-modules-local-by-default/issues/108 + /* test("escape characters (lowercase)", ".class { content: \"\\f10C\" }", [ + [1, ".class { content: \"\\f10C\" }", ""] + ]);*/ + // Need uncomment after resolve https://github.com/mathiasbynens/cssesc/issues/10 + /* test("escape characters (two)", ".class { content: \"\\F10C \\F10D\" }", [ + [1, ".class { content: \"\\F10C \\F10D\" }", ""] + ]);*/ + test('charset directive', '@charset "UTF-8";\n .class { a: b c d; }', [ + [1, '@charset "UTF-8";\n .class { a: b c d; }', ''], + ]); + test('custom variables', ':root {--foo: 1px;\n--bar: 2px;}', [ + [1, ':root {--foo: 1px;\n--bar: 2px;}', ''], ]); - testError("error formatting", ".some {\n invalid css;\n}", function(err) { - assert.equal(err.message, [ - 'Unknown word (2:2)', - '', - ' 1 | .some {', - '> 2 | invalid css;', - ' | ^', - ' 3 | }', - '', - ].join('\n')); - }); + testError('error formatting', '.some {\n invalid css;\n}', (err) => { + assert.equal( + err.message, + [ + 'Unknown word (2:2)', + '', + ' 1 | .some {', + '> 2 | invalid css;', + ' | ^', + ' 3 | }', + '', + ].join('\n') + ); + }); }); diff --git a/test/sourceMapTest.js b/test/sourceMapTest.js index faf7578c..5b5b5d18 100644 --- a/test/sourceMapTest.js +++ b/test/sourceMapTest.js @@ -1,195 +1,291 @@ -/*globals describe */ +/* globals describe */ -var testWithMap = require("./helpers").testWithMap; -var testMap = require("./helpers").testMap; +const { testWithMap, testMap } = require('./helpers'); -describe("source maps", function() { - testWithMap("falsy: null map doesn't cause an error", ".class { a: b c d; }", null, [ - [1, ".class { a: b c d; }", ""] - ]); - testWithMap("falsy: undefined map doesn't cause an error", ".class { a: b c d; }", undefined, [ - [1, ".class { a: b c d; }", ""] - ]); - testWithMap("should don't generate sourceMap when `sourceMap: false` and map exists", - ".class { a: b c d; }", - { - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }, - [ - [1, ".class { a: b c d; }", ""] - ], - { - sourceMap: false - } - ); - testWithMap("should don't generate sourceMap when `sourceMap: true` and map exists", - ".class { a: b c d; }", - { - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }, - [ - [1, ".class { a: b c d; }", "", { - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }] - ], - { - sourceMap: true - } - ); - testWithMap("should don't generate sourceMap when `sourceMap: true` and map exists and string", - ".class { a: b c d; }", - JSON.stringify({ - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }), - [ - [1, ".class { a: b c d; }", "", { - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }] - ], +describe('source maps', () => { + testWithMap( + "falsy: null map doesn't cause an error", + '.class { a: b c d; }', + null, + [[1, '.class { a: b c d; }', '']] + ); + testWithMap( + "falsy: undefined map doesn't cause an error", + '.class { a: b c d; }', + null, + [[1, '.class { a: b c d; }', '']] + ); + testWithMap( + "should don't generate sourceMap when `sourceMap: false` and map exists", + '.class { a: b c d; }', + { + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + [[1, '.class { a: b c d; }', '']], + { + sourceMap: false, + } + ); + testWithMap( + "should don't generate sourceMap when `sourceMap: true` and map exists", + '.class { a: b c d; }', + { + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + [ + [ + 1, + '.class { a: b c d; }', + '', { - sourceMap: true - } - ); - testMap("generate sourceMap (1 loader)", ".class { a: b c d; }", undefined, { - loaders: [{request: "/path/css-loader"}], - resource: "/folder/test.css", - request: "/path/css-loader!/folder/test.css", - query: "?sourceMap" - }, [ - [1, ".class { a: b c d; }", "", { - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }] - ]); - testMap("generate sourceMap (1 loader, relative)", ".class { a: b c d; }", undefined, { - loaders: [{request: "/path/css-loader"}], - resource: "/folder/test.css", - request: "/path/css-loader!/folder/test.css", - query: "?sourceMap" - }, [ - [1, ".class { a: b c d; }", "", { - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }] - ]); - testMap("generate sourceMap (1 loader, data url)", ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\"); }", undefined, { - loaders: [{request: "/path/css-loader"}], - resource: "/folder/test.css", - request: "/path/css-loader!/folder/test.css", - query: "?sourceMap" - }, [ - [1, ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\"); }", "", { - file: 'test.css', - mappings: 'AAAA,SAAS,6WAA6W,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { background-image: url("data:image/svg+xml;charset=utf-8,"); }' ], - version: 3 - }] - ]); - testMap("generate sourceMap (1 loader, encoded data url)", ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%23007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\"); }", undefined, { - loaders: [{request: "/path/css-loader"}], - resource: "/folder/test.css", - request: "/path/css-loader!/folder/test.css", - query: "?sourceMap" - }, [ - [1, ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%23007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\"); }", "", { - file: 'test.css', - mappings: 'AAAA,SAAS,mmBAAmmB,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%23007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E"); }' ], - version: 3 - }] - ]); - testMap("generate sourceMap (2 loaders)", ".class { a: b c d; }", undefined, { - loaders: [{request: "/path/css-loader"}, {request: "/path/sass-loader"}], - resource: "/folder/test.scss", - request: "/path/css-loader!/path/sass-loader!/folder/test.scss", - query: "?sourceMap" - }, [ - [1, ".class { a: b c d; }", "", { - file: 'test.scss', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.scss' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }] - ]); - testMap("generate sourceMap (2 loaders) and map exist", ".class { a: b c d; }", { - file: 'test.scss', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.scss' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }, { - loaders: [{request: "/path/css-loader"}, {request: "/path/sass-loader"}], - resource: "/folder/test.scss", - request: "/path/css-loader!/path/sass-loader!/folder/test.scss", - query: "?sourceMap" - }, [ - [1, ".class { a: b c d; }", "", { - file: 'test.scss', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.scss' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }] - ]); - testMap("don't generate sourceMap (1 loader)", ".class { a: b c d; }", undefined, { - loaders: [{request: "/path/css-loader"}], - resource: "/folder/test.css", - request: "/path/css-loader!/folder/test.css", - query: "?sourceMap=false" - }, [ - [1, ".class { a: b c d; }", ""] - ]); + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + ], + ], + { + sourceMap: true, + } + ); + testWithMap( + "should don't generate sourceMap when `sourceMap: true` and map exists and string", + '.class { a: b c d; }', + JSON.stringify({ + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }), + [ + [ + 1, + '.class { a: b c d; }', + '', + { + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + ], + ], + { + sourceMap: true, + } + ); + testMap( + 'generate sourceMap (1 loader)', + '.class { a: b c d; }', + null, + { + loaders: [{ request: '/path/css-loader' }], + resource: '/folder/test.css', + request: '/path/css-loader!/folder/test.css', + query: '?sourceMap', + }, + [ + [ + 1, + '.class { a: b c d; }', + '', + { + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + ], + ] + ); + testMap( + 'generate sourceMap (1 loader, relative)', + '.class { a: b c d; }', + null, + { + loaders: [{ request: '/path/css-loader' }], + resource: '/folder/test.css', + request: '/path/css-loader!/folder/test.css', + query: '?sourceMap', + }, + [ + [ + 1, + '.class { a: b c d; }', + '', + { + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + ], + ] + ); + testMap( + 'generate sourceMap (1 loader, data url)', + ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\"); }", + null, + { + loaders: [{ request: '/path/css-loader' }], + resource: '/folder/test.css', + request: '/path/css-loader!/folder/test.css', + query: '?sourceMap', + }, + [ + [ + 1, + ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\"); }", + '', + { + file: 'test.css', + mappings: 'AAAA,SAAS,6WAA6W,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: [ + ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\"); }", + ], + version: 3, + }, + ], + ] + ); + testMap( + 'generate sourceMap (1 loader, encoded data url)', + '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%23007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E"); }', + null, + { + loaders: [{ request: '/path/css-loader' }], + resource: '/folder/test.css', + request: '/path/css-loader!/folder/test.css', + query: '?sourceMap', + }, + [ + [ + 1, + '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%23007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E"); }', + '', + { + file: 'test.css', + mappings: 'AAAA,SAAS,mmBAAmmB,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.css'], + sourcesContent: [ + '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%23007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E"); }', + ], + version: 3, + }, + ], + ] + ); + testMap( + 'generate sourceMap (2 loaders)', + '.class { a: b c d; }', + null, + { + loaders: [ + { request: '/path/css-loader' }, + { request: '/path/sass-loader' }, + ], + resource: '/folder/test.scss', + request: '/path/css-loader!/path/sass-loader!/folder/test.scss', + query: '?sourceMap', + }, + [ + [ + 1, + '.class { a: b c d; }', + '', + { + file: 'test.scss', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.scss'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + ], + ] + ); + testMap( + 'generate sourceMap (2 loaders) and map exist', + '.class { a: b c d; }', + { + file: 'test.scss', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.scss'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + { + loaders: [ + { request: '/path/css-loader' }, + { request: '/path/sass-loader' }, + ], + resource: '/folder/test.scss', + request: '/path/css-loader!/path/sass-loader!/folder/test.scss', + query: '?sourceMap', + }, + [ + [ + 1, + '.class { a: b c d; }', + '', + { + file: 'test.scss', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: ['/folder/test.scss'], + sourcesContent: ['.class { a: b c d; }'], + version: 3, + }, + ], + ] + ); + testMap( + "don't generate sourceMap (1 loader)", + '.class { a: b c d; }', + null, + { + loaders: [{ request: '/path/css-loader' }], + resource: '/folder/test.css', + request: '/path/css-loader!/folder/test.css', + query: '?sourceMap=false', + }, + [[1, '.class { a: b c d; }', '']] + ); }); diff --git a/test/urlTest.js b/test/urlTest.js index 7e7ac6c1..cd003c76 100644 --- a/test/urlTest.js +++ b/test/urlTest.js @@ -1,214 +1,520 @@ -/*globals describe */ +/* globals describe */ -var test = require("./helpers").test; +const { test } = require('./helpers'); -describe("url", function() { - test("background img", ".class { background: green url( \"img.png\" ) xyz }", [ - [1, ".class { background: green url({./img.png}) xyz }", ""] - ]); - test("background img 2", ".class { background: green url(~img/png) url(aaa) xyz }", [ - [1, ".class { background: green url({img/png}) url({./aaa}) xyz }", ""] - ]); - test("background img 3", ".class { background: green url( 'img.png' ) xyz }", [ - [1, ".class { background: green url({./img.png}) xyz }", ""] - ]); - test("background img 4", ".class { background: green url( img.png ) xyz }", [ - [1, ".class { background: green url({./img.png}) xyz }", ""] - ]); - test("background img contain space in name", ".class { background: green url( \"img img.png\" ) xyz }", [ - [1, ".class { background: green url(\"{./img img.png}\") xyz }", ""] - ]); - test("background 2 img contain space in name", ".class { background: green url( 'img img.png' ) xyz }", [ - [1, ".class { background: green url(\"{./img img.png}\") xyz }", ""] - ]); - test("background img absolute", ".class { background: green url(/img.png) xyz }", [ - [1, ".class { background: green url(/img.png) xyz }", ""] - ]); - test("background img external", - ".class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }", [ - [1, ".class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }", ""] - ]); - test("background img external data", - ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", [ - [1, ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", ""] - ]); - test("background img external encoded data", - ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\") }", [ - [1, ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\") }", ""] - ]); - test("data url in filter", - ".class { filter: url('data:image/svg+xml;charset=utf-8,#filter'); }", [ - [1, ".class { filter: url('data:image/svg+xml;charset=utf-8,#filter'); }", ""] - ]); - test("encoded data url in filter", - ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", [ - [1, ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", ""] - ]); - test("filter hash", - ".highlight { filter: url(#highlight); }", [ - [1, ".highlight { filter: url(#highlight); }", ""] - ]); - test("filter hash quotation marks", - ".highlight { filter: url('#line-marker'); }", [ - [1, ".highlight { filter: url('#line-marker'); }", ""] - ]); - test("font face", "@font-face { src: url(regular.woff) format('woff'), url(~truetype/regular.ttf) format('truetype') }", [ - [1, "@font-face { src: url({./regular.woff}) format('woff'), url({truetype/regular.ttf}) format('truetype') }", ""] - ]); - test("media query", "@media (min-width: 500px) { body { background: url(image.png); } }", [ - [1, "@media (min-width: 500px) { body { background: url({./image.png}); } }", ""] - ]); - test("url in string", "a { content: \"do not use url(path)\"; } b { content: 'do not \"use\" url(path)'; }", [ - [1, "a { content: \"do not use url(path)\"; } b { content: 'do not \"use\" url(path)'; }", ""] - ]); - test("keyframe background img", "@keyframes anim { background: green url('img.png') xyz }", [ - [1, "@keyframes anim { background: green url({./img.png}) xyz }", ""] - ]); - test("-webkit-image-set", ".a { background-image: -webkit-image-set(url('url1x.png') 1x, url('url2x.png') 2x) }", [ - [1, ".a { background-image: -webkit-image-set(url({./url1x.png}) 1x, url({./url2x.png}) 2x) }", ""] - ]); - test("empty url", ".class { background: green url() xyz }", [ - [1, ".class { background: green url() xyz }", ""] - ]); - test("empty url with quotes", ".class { background: green url('') xyz }", [ - [1, ".class { background: green url('') xyz }", ""] - ]); - test("empty url with spaces and quotes", ".class { background: green url(' ') xyz }", [ - [1, ".class { background: green url('') xyz }", ""] - ]); - test("empty url with newline and quotes", ".class { background: green url('\n') xyz }", [ - [1, ".class { background: green url('') xyz }", ""] - ]); - test("empty url with CRLF and quotes", ".class { background: green url('\r\n') xyz }", [ - [1, ".class { background: green url('') xyz }", ""] - ]); - test("empty url with tab and quotes", ".class { background: green url('\t') xyz }", [ - [1, ".class { background: green url('') xyz }", ""] - ]); - test("external absolute url", ".class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", [ - [1, ".class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", ""] - ]); - test("external schema-less url", ".class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", [ - [1, ".class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", ""] - ]); - - test("module wrapped in spaces", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(module-wrapped) xyz }", ""] - ], "", { './module': "\"module-wrapped\"" }); - test("module with space", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(\"module with space\") xyz }", ""] - ], "", { './module': "module with space" }); - test("module with quote", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(\"module\\\"with\\\"quote\") xyz }", ""] - ], "", { './module': "module\"with\"quote" }); - test("module with quote wrapped", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(\"module\\\"with\\\"quote\\\"wrapped\") xyz }", ""] - ], "", { './module': "\"module\"with\"quote\"wrapped\"" }); - test("module with parens", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(\"module(with-parens)\") xyz }", ""] - ], "", { './module': 'module(with-parens)' }); - test("module with newline", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(\"module\\nwith\\nnewline\") xyz }", ""] - ], "", { './module': "module\nwith\nnewline" }); - test("module from url-loader", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA) xyz }", ""] - ], "", { './module': "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA" }); - test("module from null-loader (empty object from webpack)", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url([object Object]) xyz }", ""] - ], "", { './module': {} }); - test("module is null", ".class { background: green url(module) xyz }", [ - [1, ".class { background: green url(null) xyz }", ""] - ], "", { './module': null }); +describe('url', () => { + test('background img', '.class { background: green url( "img.png" ) xyz }', [ + [1, '.class { background: green url({./img.png}) xyz }', ''], + ]); + test( + 'background img 2', + '.class { background: green url(~img/png) url(aaa) xyz }', + [[1, '.class { background: green url({img/png}) url({./aaa}) xyz }', '']] + ); + test( + 'background img 3', + ".class { background: green url( 'img.png' ) xyz }", + [[1, '.class { background: green url({./img.png}) xyz }', '']] + ); + test('background img 4', '.class { background: green url( img.png ) xyz }', [ + [1, '.class { background: green url({./img.png}) xyz }', ''], + ]); + test( + 'background img contain space in name', + '.class { background: green url( "img img.png" ) xyz }', + [[1, '.class { background: green url("{./img img.png}") xyz }', '']] + ); + test( + 'background 2 img contain space in name', + ".class { background: green url( 'img img.png' ) xyz }", + [[1, '.class { background: green url("{./img img.png}") xyz }', '']] + ); + test( + 'background img absolute', + '.class { background: green url(/img.png) xyz }', + [[1, '.class { background: green url(/img.png) xyz }', '']] + ); + test( + 'background img external', + '.class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }', + [ + [ + 1, + '.class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }', + '', + ], + ] + ); + test( + 'background img external data', + ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", + [ + [ + 1, + ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", + '', + ], + ] + ); + test( + 'background img external encoded data', + '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E") }', + [ + [ + 1, + '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E") }', + '', + ], + ] + ); + test( + 'data url in filter', + '.class { filter: url(\'data:image/svg+xml;charset=utf-8,#filter\'); }', + [ + [ + 1, + '.class { filter: url(\'data:image/svg+xml;charset=utf-8,#filter\'); }', + '', + ], + ] + ); + test( + 'encoded data url in filter', + ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", + [ + [ + 1, + ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", + '', + ], + ] + ); + test('filter hash', '.highlight { filter: url(#highlight); }', [ + [1, '.highlight { filter: url(#highlight); }', ''], + ]); + test( + 'filter hash quotation marks', + ".highlight { filter: url('#line-marker'); }", + [[1, ".highlight { filter: url('#line-marker'); }", '']] + ); + test( + 'font face', + "@font-face { src: url(regular.woff) format('woff'), url(~truetype/regular.ttf) format('truetype') }", + [ + [ + 1, + "@font-face { src: url({./regular.woff}) format('woff'), url({truetype/regular.ttf}) format('truetype') }", + '', + ], + ] + ); + test( + 'media query', + '@media (min-width: 500px) { body { background: url(image.png); } }', + [ + [ + 1, + '@media (min-width: 500px) { body { background: url({./image.png}); } }', + '', + ], + ] + ); + test( + 'url in string', + 'a { content: "do not use url(path)"; } b { content: \'do not "use" url(path)\'; }', + [ + [ + 1, + 'a { content: "do not use url(path)"; } b { content: \'do not "use" url(path)\'; }', + '', + ], + ] + ); + test( + 'keyframe background img', + "@keyframes anim { background: green url('img.png') xyz }", + [[1, '@keyframes anim { background: green url({./img.png}) xyz }', '']] + ); + test( + '-webkit-image-set', + ".a { background-image: -webkit-image-set(url('url1x.png') 1x, url('url2x.png') 2x) }", + [ + [ + 1, + '.a { background-image: -webkit-image-set(url({./url1x.png}) 1x, url({./url2x.png}) 2x) }', + '', + ], + ] + ); + test('empty url', '.class { background: green url() xyz }', [ + [1, '.class { background: green url() xyz }', ''], + ]); + test('empty url with quotes', ".class { background: green url('') xyz }", [ + [1, ".class { background: green url('') xyz }", ''], + ]); + test( + 'empty url with spaces and quotes', + ".class { background: green url(' ') xyz }", + [[1, ".class { background: green url('') xyz }", '']] + ); + test( + 'empty url with newline and quotes', + ".class { background: green url('\n') xyz }", + [[1, ".class { background: green url('') xyz }", '']] + ); + test( + 'empty url with CRLF and quotes', + ".class { background: green url('\r\n') xyz }", + [[1, ".class { background: green url('') xyz }", '']] + ); + test( + 'empty url with tab and quotes', + ".class { background: green url('\t') xyz }", + [[1, ".class { background: green url('') xyz }", '']] + ); + test( + 'external absolute url', + '.class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + [ + [ + 1, + '.class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + '', + ], + ] + ); + test( + 'external schema-less url', + '.class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + [ + [ + 1, + '.class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + '', + ], + ] + ); - test("background img with url", ".class { background: green url( \"img.png\" ) xyz }", [ - [1, ".class { background: green url( \"img.png\" ) xyz }", ""] - ], "?-url"); - test("background img 2 with url", ".class { background: green url(~img/png) url(aaa) xyz }", [ - [1, ".class { background: green url(~img/png) url(aaa) xyz }", ""] - ], "?-url"); - test("background img 3 with url", ".class { background: green url( 'img.png' ) xyz }", [ - [1, ".class { background: green url( 'img.png' ) xyz }", ""] - ], "?-url"); - test("background img 4 with url", ".class { background: green url( img.png ) xyz }", [ - [1, ".class { background: green url( img.png ) xyz }", ""] - ], "?-url"); - test("background img with url contain space in name", ".class { background: green url( \"img img.png\" ) xyz }", [ - [1, ".class { background: green url( \"img img.png\" ) xyz }", ""] - ], "?-url"); - test("background 2 img with url contain space in name", ".class { background: green url( 'img img.png' ) xyz }", [ - [1, ".class { background: green url( 'img img.png' ) xyz }", ""] - ], "?-url"); - test("background img absolute with url", ".class { background: green url(/img.png) xyz }", [ - [1, ".class { background: green url(/img.png) xyz }", ""] - ], "?-url"); - test("background img external with url", - ".class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }", [ - [1, ".class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }", ""] - ], "?-url"); - test("background img external data with url", - ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", [ - [1, ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", ""] - ], "?-url"); - test("background img external encoded data with url", - ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\") }", [ - [1, ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\") }", ""] - ], "?-url"); - test("data url in filter with url", - ".class { filter: url('data:image/svg+xml;charset=utf-8,#filter'); }", [ - [1, ".class { filter: url('data:image/svg+xml;charset=utf-8,#filter'); }", ""] - ], "?-url"); - test("encoded data url in filter with url", - ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", [ - [1, ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", ""] - ], "?-url"); - test("filter hash with url", - ".highlight { filter: url(#highlight); }", [ - [1, ".highlight { filter: url(#highlight); }", ""] - ], "?-url"); - test("filter hash quotation marks with url", - ".highlight { filter: url('#line-marker'); }", [ - [1, ".highlight { filter: url('#line-marker'); }", ""] - ], "?-url"); - test("font face with url", "@font-face { src: url(regular.woff) format('woff'), url(~truetype/regular.ttf) format('truetype') }", [ - [1, "@font-face { src: url(regular.woff) format('woff'), url(~truetype/regular.ttf) format('truetype') }", ""] - ], "?-url"); - test("font face with url", "@font-face { src: url(Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype'), url(~opentype/Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype') }", [ - [1, "@font-face { src: url(Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype'), url(~opentype/Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype') }", ""] - ], "?-url"); - test("font face with url", "@font-face { src: url('Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix') format('embedded-opentype'), url(\"Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix\") format('embedded-opentype') }", [ - [1, "@font-face { src: url('Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix') format('embedded-opentype'), url(\"Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix\") format('embedded-opentype') }", ""] - ], "?-url"); - test("media query with url", "@media (min-width: 500px) { body { background: url(image.png); } }", [ - [1, "@media (min-width: 500px) { body { background: url(image.png); } }", ""] - ], "?-url"); - test("url in string with url", "a { content: \"do not use url(path)\"; } b { content: 'do not \"use\" url(path)'; }", [ - [1, "a { content: \"do not use url(path)\"; } b { content: 'do not \"use\" url(path)'; }", ""] - ], "?-url"); - test("keyframe background img with url", "@keyframes anim { background: green url('img.png') xyz }", [ - [1, "@keyframes anim { background: green url('img.png') xyz }", ""] - ], "?-url"); - test("empty url", ".class { background: green url() xyz }", [ - [1, ".class { background: green url() xyz }", ""] - ], "?-url"); - test("empty url with quotes", ".class { background: green url('') xyz }", [ - [1, ".class { background: green url('') xyz }", ""] - ], "?-url"); - test("empty url with spaces and quotes", ".class { background: green url(' ') xyz }", [ - [1, ".class { background: green url(' ') xyz }", ""] - ], "?-url"); - test("empty url with newline and quotes", ".class { background: green url('\n') xyz }", [ - [1, ".class { background: green url('\n') xyz }", ""] - ], "?-url"); - test("empty url with CRLF and quotes", ".class { background: green url('\r\n') xyz }", [ - [1, ".class { background: green url('\r\n') xyz }", ""] - ], "?-url"); - test("empty url with tab and quotes", ".class { background: green url('\t') xyz }", [ - [1, ".class { background: green url('\t') xyz }", ""] - ], "?-url"); - test("external absolute url", ".class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", [ - [1, ".class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", ""] - ], "?-url"); - test("external schema-less url", ".class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", [ - [1, ".class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }", ""] - ], "?-url"); + test( + 'module wrapped in spaces', + '.class { background: green url(module) xyz }', + [[1, '.class { background: green url(module-wrapped) xyz }', '']], + '', + { './module': '"module-wrapped"' } + ); + test( + 'module with space', + '.class { background: green url(module) xyz }', + [[1, '.class { background: green url("module with space") xyz }', '']], + '', + { './module': 'module with space' } + ); + test( + 'module with quote', + '.class { background: green url(module) xyz }', + [[1, '.class { background: green url("module\\"with\\"quote") xyz }', '']], + '', + { './module': 'module"with"quote' } + ); + test( + 'module with quote wrapped', + '.class { background: green url(module) xyz }', + [ + [ + 1, + '.class { background: green url("module\\"with\\"quote\\"wrapped") xyz }', + '', + ], + ], + '', + { './module': '"module"with"quote"wrapped"' } + ); + test( + 'module with parens', + '.class { background: green url(module) xyz }', + [[1, '.class { background: green url("module(with-parens)") xyz }', '']], + '', + { './module': 'module(with-parens)' } + ); + test( + 'module with newline', + '.class { background: green url(module) xyz }', + [ + [ + 1, + '.class { background: green url("module\\nwith\\nnewline") xyz }', + '', + ], + ], + '', + { './module': 'module\nwith\nnewline' } + ); + test( + 'module from url-loader', + '.class { background: green url(module) xyz }', + [ + [ + 1, + '.class { background: green url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA) xyz }', + '', + ], + ], + '', + { './module': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA' } + ); + test( + 'module from null-loader (empty object from webpack)', + '.class { background: green url(module) xyz }', + [[1, '.class { background: green url([object Object]) xyz }', '']], + '', + { './module': {} } + ); + test( + 'module is null', + '.class { background: green url(module) xyz }', + [[1, '.class { background: green url(null) xyz }', '']], + '', + { './module': null } + ); + + test( + 'background img with url', + '.class { background: green url( "img.png" ) xyz }', + [[1, '.class { background: green url( "img.png" ) xyz }', '']], + '?-url' + ); + test( + 'background img 2 with url', + '.class { background: green url(~img/png) url(aaa) xyz }', + [[1, '.class { background: green url(~img/png) url(aaa) xyz }', '']], + '?-url' + ); + test( + 'background img 3 with url', + ".class { background: green url( 'img.png' ) xyz }", + [[1, ".class { background: green url( 'img.png' ) xyz }", '']], + '?-url' + ); + test( + 'background img 4 with url', + '.class { background: green url( img.png ) xyz }', + [[1, '.class { background: green url( img.png ) xyz }', '']], + '?-url' + ); + test( + 'background img with url contain space in name', + '.class { background: green url( "img img.png" ) xyz }', + [[1, '.class { background: green url( "img img.png" ) xyz }', '']], + '?-url' + ); + test( + 'background 2 img with url contain space in name', + ".class { background: green url( 'img img.png' ) xyz }", + [[1, ".class { background: green url( 'img img.png' ) xyz }", '']], + '?-url' + ); + test( + 'background img absolute with url', + '.class { background: green url(/img.png) xyz }', + [[1, '.class { background: green url(/img.png) xyz }', '']], + '?-url' + ); + test( + 'background img external with url', + '.class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }', + [ + [ + 1, + '.class { background: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz }', + '', + ], + ], + '?-url' + ); + test( + 'background img external data with url', + ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", + [ + [ + 1, + ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\") }", + '', + ], + ], + '?-url' + ); + test( + 'background img external encoded data with url', + '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E") }', + [ + [ + 1, + '.class { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E") }', + '', + ], + ], + '?-url' + ); + test( + 'data url in filter with url', + '.class { filter: url(\'data:image/svg+xml;charset=utf-8,#filter\'); }', + [ + [ + 1, + '.class { filter: url(\'data:image/svg+xml;charset=utf-8,#filter\'); }', + '', + ], + ], + '?-url' + ); + test( + 'encoded data url in filter with url', + ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", + [ + [ + 1, + ".class { filter: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); }", + '', + ], + ], + '?-url' + ); + test( + 'filter hash with url', + '.highlight { filter: url(#highlight); }', + [[1, '.highlight { filter: url(#highlight); }', '']], + '?-url' + ); + test( + 'filter hash quotation marks with url', + ".highlight { filter: url('#line-marker'); }", + [[1, ".highlight { filter: url('#line-marker'); }", '']], + '?-url' + ); + test( + 'font face with url', + "@font-face { src: url(regular.woff) format('woff'), url(~truetype/regular.ttf) format('truetype') }", + [ + [ + 1, + "@font-face { src: url(regular.woff) format('woff'), url(~truetype/regular.ttf) format('truetype') }", + '', + ], + ], + '?-url' + ); + test( + 'font face with url', + "@font-face { src: url(Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype'), url(~opentype/Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype') }", + [ + [ + 1, + "@font-face { src: url(Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype'), url(~opentype/Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix) format('embedded-opentype') }", + '', + ], + ], + '?-url' + ); + test( + 'font face with url', + "@font-face { src: url('Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix') format('embedded-opentype'), url(\"Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix\") format('embedded-opentype') }", + [ + [ + 1, + "@font-face { src: url('Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix') format('embedded-opentype'), url(\"Mark Simonson - Proxima Nova Alt Regular-webfont.eot?#iefix\") format('embedded-opentype') }", + '', + ], + ], + '?-url' + ); + test( + 'media query with url', + '@media (min-width: 500px) { body { background: url(image.png); } }', + [ + [ + 1, + '@media (min-width: 500px) { body { background: url(image.png); } }', + '', + ], + ], + '?-url' + ); + test( + 'url in string with url', + 'a { content: "do not use url(path)"; } b { content: \'do not "use" url(path)\'; }', + [ + [ + 1, + 'a { content: "do not use url(path)"; } b { content: \'do not "use" url(path)\'; }', + '', + ], + ], + '?-url' + ); + test( + 'keyframe background img with url', + "@keyframes anim { background: green url('img.png') xyz }", + [[1, "@keyframes anim { background: green url('img.png') xyz }", '']], + '?-url' + ); + test( + 'empty url', + '.class { background: green url() xyz }', + [[1, '.class { background: green url() xyz }', '']], + '?-url' + ); + test( + 'empty url with quotes', + ".class { background: green url('') xyz }", + [[1, ".class { background: green url('') xyz }", '']], + '?-url' + ); + test( + 'empty url with spaces and quotes', + ".class { background: green url(' ') xyz }", + [[1, ".class { background: green url(' ') xyz }", '']], + '?-url' + ); + test( + 'empty url with newline and quotes', + ".class { background: green url('\n') xyz }", + [[1, ".class { background: green url('\n') xyz }", '']], + '?-url' + ); + test( + 'empty url with CRLF and quotes', + ".class { background: green url('\r\n') xyz }", + [[1, ".class { background: green url('\r\n') xyz }", '']], + '?-url' + ); + test( + 'empty url with tab and quotes', + ".class { background: green url('\t') xyz }", + [[1, ".class { background: green url('\t') xyz }", '']], + '?-url' + ); + test( + 'external absolute url', + '.class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + [ + [ + 1, + '.class { background: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + '', + ], + ], + '?-url' + ); + test( + 'external schema-less url', + '.class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + [ + [ + 1, + '.class { background: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz }', + '', + ], + ], + '?-url' + ); }); diff --git a/test/valuesTest.js b/test/valuesTest.js index 5b77aa54..130520e8 100644 --- a/test/valuesTest.js +++ b/test/valuesTest.js @@ -1,120 +1,135 @@ -/*globals describe */ +/* globals describe */ -var testLocals = require("./helpers").testLocals; -var test = require("./helpers").test; +const { testLocals, test } = require('./helpers'); function testLocal(name, input, result, localsResult, query, modules) { - result.locals = localsResult; - test(name, input, result, query, modules); + // eslint-disable-next-line no-param-reassign + result.locals = localsResult; + test(name, input, result, query, modules); } -describe("values", function() { - testLocals("should export values", - "@value def: red; @value ghi: 1px solid black", - { - def: "red", - ghi: "1px solid black" - }, - "" - ); - testLocals("should export values and locals", - "@value def: red; .ghi { color: def; }", - { - def: "red", - ghi: "_ghi" - }, - "?modules&localIdentName=_[local]" - ); - testLocal("should import values from other module", - "@value def from './file'; .ghi { color: def; }", [ - [ 2, "", "" ], - [ 1, ".ghi { color: red; }", "" ] - ], { - def: "red" - }, "", { - "./file": (function() { - var a = [[2, "", ""]]; - a.locals = { - def: "red" - }; - return a; - })() - } - ); - testLocal("should import values with renaming", - "@value def as aaa from './file1'; @value def as bbb from './file2'; .ghi { background: aaa, bbb, def; }", [ - [ 2, "", "" ], - [ 3, "", "" ], - [ 1, ".ghi { background: red, green, def; }", "" ] - ], { - aaa: "red", - bbb: "green" - }, "", { - "./file1": (function() { - var a = [[2, "", ""]]; - a.locals = { - def: "red" - }; - return a; - })(), - "./file2": (function() { - var a = [[3, "", ""]]; - a.locals = { - def: "green" - }; - return a; - })() - } - ); - testLocal("should import values contain comma", - "@value color from './file1'; @value shadow: 0 0 color,0 0 color; .ghi { box-shadow: shadow; }", [ - [ 2, "", "" ], - [ 1, ".ghi { box-shadow: 0 0 red,0 0 red; }", "" ] - ], { - color: "red", - shadow: "0 0 red,0 0 red" - }, "", { - "./file1": (function() { - var a = [[2, "", ""]]; - a.locals = { - color: "red", - }; - return a; - })() - } - ); - testLocal("should import values contain comma and space before comma", - "@value color from './file1'; @value shadow: 0 0 color ,0 0 color; .ghi { box-shadow: shadow; }", [ - [ 2, "", "" ], - [ 1, ".ghi { box-shadow: 0 0 red ,0 0 red; }", "" ] - ], { - color: "red", - shadow: "0 0 red ,0 0 red" - }, "", { - "./file1": (function() { - var a = [[2, "", ""]]; - a.locals = { - color: "red", - }; - return a; - })() - } - ); - testLocal("should import values contain tralling comma and space after comma", - "@value color from './file1'; @value shadow: 0 0 color, 0 0 color; .ghi { box-shadow: shadow; }", [ - [ 2, "", "" ], - [ 1, ".ghi { box-shadow: 0 0 red, 0 0 red; }", "" ] - ], { - color: "red", - shadow: "0 0 red, 0 0 red" - }, "", { - "./file1": (function() { - var a = [[2, "", ""]]; - a.locals = { - color: "red", - }; - return a; - })() - } - ); +describe('values', () => { + testLocals( + 'should export values', + '@value def: red; @value ghi: 1px solid black', + { + def: 'red', + ghi: '1px solid black', + }, + '' + ); + testLocals( + 'should export values and locals', + '@value def: red; .ghi { color: def; }', + { + def: 'red', + ghi: '_ghi', + }, + '?modules&localIdentName=_[local]' + ); + testLocal( + 'should import values from other module', + "@value def from './file'; .ghi { color: def; }", + [[2, '', ''], [1, '.ghi { color: red; }', '']], + { + def: 'red', + }, + '', + { + './file': (() => { + const a = [[2, '', '']]; + a.locals = { + def: 'red', + }; + return a; + })(), + } + ); + testLocal( + 'should import values with renaming', + "@value def as aaa from './file1'; @value def as bbb from './file2'; .ghi { background: aaa, bbb, def; }", + [ + [2, '', ''], + [3, '', ''], + [1, '.ghi { background: red, green, def; }', ''], + ], + { + aaa: 'red', + bbb: 'green', + }, + '', + { + './file1': (() => { + const a = [[2, '', '']]; + a.locals = { + def: 'red', + }; + return a; + })(), + './file2': (() => { + const a = [[3, '', '']]; + a.locals = { + def: 'green', + }; + return a; + })(), + } + ); + testLocal( + 'should import values contain comma', + "@value color from './file1'; @value shadow: 0 0 color,0 0 color; .ghi { box-shadow: shadow; }", + [[2, '', ''], [1, '.ghi { box-shadow: 0 0 red,0 0 red; }', '']], + { + color: 'red', + shadow: '0 0 red,0 0 red', + }, + '', + { + './file1': (() => { + const a = [[2, '', '']]; + a.locals = { + color: 'red', + }; + return a; + })(), + } + ); + testLocal( + 'should import values contain comma and space before comma', + "@value color from './file1'; @value shadow: 0 0 color ,0 0 color; .ghi { box-shadow: shadow; }", + [[2, '', ''], [1, '.ghi { box-shadow: 0 0 red ,0 0 red; }', '']], + { + color: 'red', + shadow: '0 0 red ,0 0 red', + }, + '', + { + './file1': (() => { + const a = [[2, '', '']]; + a.locals = { + color: 'red', + }; + return a; + })(), + } + ); + testLocal( + 'should import values contain tralling comma and space after comma', + "@value color from './file1'; @value shadow: 0 0 color, 0 0 color; .ghi { box-shadow: shadow; }", + [[2, '', ''], [1, '.ghi { box-shadow: 0 0 red, 0 0 red; }', '']], + { + color: 'red', + shadow: '0 0 red, 0 0 red', + }, + '', + { + './file1': (() => { + const a = [[2, '', '']]; + a.locals = { + color: 'red', + }; + return a; + })(), + } + ); });