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;
+ })(),
+ }
+ );
});