├── .gitignore ├── test ├── .eslintrc.json ├── parseString.test.js ├── getHashDigest.test.js ├── getOptions.test.js ├── parseQuery.test.js ├── urlToRequest.test.js ├── interpolateName.test.js └── stringifyRequest.test.js ├── .travis.yml ├── lib ├── getCurrentRequest.js ├── getRemainingRequest.js ├── getOptions.js ├── parseString.js ├── isUrlRequest.js ├── index.js ├── parseQuery.js ├── stringifyRequest.js ├── urlToRequest.js ├── getHashDigest.js └── interpolateName.js ├── .editorconfig ├── CHANGELOG.md ├── package.json ├── LICENSE ├── .eslintrc.json ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | -------------------------------------------------------------------------------- /test/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | } 5 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - "4" 5 | - "6" 6 | - "7" 7 | script: npm run travis 8 | 9 | after_success: cat ./coverage/lcov.info | node_modules/.bin/coveralls --verbose && rm -rf ./coverage 10 | -------------------------------------------------------------------------------- /lib/getCurrentRequest.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function getCurrentRequest(loaderContext) { 4 | if(loaderContext.currentRequest) 5 | return loaderContext.currentRequest; 6 | const request = loaderContext.loaders 7 | .slice(loaderContext.loaderIndex) 8 | .map(obj => obj.request) 9 | .concat([loaderContext.resource]); 10 | return request.join("!"); 11 | } 12 | 13 | module.exports = getCurrentRequest; 14 | -------------------------------------------------------------------------------- /lib/getRemainingRequest.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function getRemainingRequest(loaderContext) { 4 | if(loaderContext.remainingRequest) 5 | return loaderContext.remainingRequest; 6 | const request = loaderContext.loaders 7 | .slice(loaderContext.loaderIndex + 1) 8 | .map(obj => obj.request) 9 | .concat([loaderContext.resource]); 10 | return request.join("!"); 11 | } 12 | 13 | module.exports = getRemainingRequest; 14 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | indent_size = 4 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | max_line_length = 233 10 | 11 | [*.json] 12 | indent_style = space 13 | indent_size = 2 14 | 15 | [*.yml] 16 | indent_style = space 17 | indent_size = 2 18 | 19 | [test/cases/parsing/bom/bomfile.{css,js}] 20 | charset = utf-8-bom 21 | 22 | [*.md] 23 | trim_trailing_whitespace = false 24 | -------------------------------------------------------------------------------- /lib/getOptions.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const parseQuery = require("./parseQuery"); 4 | 5 | function getOptions(loaderContext) { 6 | const query = loaderContext.query; 7 | if(typeof query === "string" && query !== "") { 8 | return parseQuery(loaderContext.query); 9 | } 10 | if(!query || typeof query !== "object") { 11 | // Not object-like queries are not supported. 12 | return null; 13 | } 14 | return query; 15 | } 16 | 17 | module.exports = getOptions; 18 | -------------------------------------------------------------------------------- /lib/parseString.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function parseString(str) { 4 | try { 5 | if(str[0] === "\"") return JSON.parse(str); 6 | if(str[0] === "'" && str.substr(str.length - 1) === "'") { 7 | return parseString( 8 | str 9 | .replace(/\\.|"/g, x => x === "\"" ? "\\\"" : x) 10 | .replace(/^'|'$/g, "\"") 11 | ); 12 | } 13 | return JSON.parse("\"" + str + "\""); 14 | } catch(e) { 15 | return str; 16 | } 17 | } 18 | 19 | module.exports = parseString; 20 | -------------------------------------------------------------------------------- /lib/isUrlRequest.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function isUrlRequest(url, root) { 4 | // An URL is not an request if 5 | // 1. it's a Data Url 6 | // 2. it's an absolute url or and protocol-relative 7 | // 3. it's some kind of url for a template 8 | if(/^data:|^chrome-extension:|^(https?:)?\/\/|^[\{\}\[\]#*;,'§\$%&\(=?`´\^°<>]/.test(url)) return false; 9 | // 4. It's also not an request if root isn't set and it's a root-relative url 10 | if((root === undefined || root === false) && /^\//.test(url)) return false; 11 | return true; 12 | } 13 | 14 | module.exports = isUrlRequest; 15 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | 6 | # [1.1.0](https://github.com/webpack/loader-utils/compare/v1.0.4...v1.1.0) (2017-03-16) 7 | 8 | 9 | ### Features 10 | 11 | * **automatic-release:** Generation of automatic release ([7484d13](https://github.com/webpack/loader-utils/commit/7484d13)) 12 | * **parseQuery:** export parseQuery ([ddf64e4](https://github.com/webpack/loader-utils/commit/ddf64e4)) 13 | -------------------------------------------------------------------------------- /test/parseString.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const assert = require("assert"); 4 | const loaderUtils = require("../"); 5 | 6 | describe("parseString()", () => { 7 | [ 8 | ["test string", "test string"], 9 | [JSON.stringify("!\"§$%&/()=?'*#+,.-;öäü:_test"), "!\"§$%&/()=?'*#+,.-;öäü:_test"], 10 | ["'escaped with single \"'", "escaped with single \""], 11 | ["invalid \"' string", "invalid \"' string"], 12 | ["\'inconsistent start and end\"", "\'inconsistent start and end\""] 13 | ].forEach(test => { 14 | it("should parse " + test[0], () => { 15 | const parsed = loaderUtils.parseString(test[0]); 16 | assert.equal(parsed, test[1]); 17 | }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/getHashDigest.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const assert = require("assert"); 4 | const loaderUtils = require("../"); 5 | 6 | describe("getHashDigest()", () => { 7 | [ 8 | ["test string", "md5", "hex", undefined, "6f8db599de986fab7a21625b7916589c"], 9 | ["test string", "md5", "hex", 4, "6f8d"], 10 | ["test string", "md5", "base64", undefined, "2sm1pVmS8xuGJLCdWpJoRL"], 11 | ["test string", "md5", "base52", undefined, "dJnldHSAutqUacjgfBQGLQx"], 12 | ["test string", "md5", "base26", 6, "bhtsgu"], 13 | ["test string", "sha512", "base64", undefined, "2IS-kbfIPnVflXb9CzgoNESGCkvkb0urMmucPD9z8q6HuYz8RShY1-tzSUpm5-Ivx_u4H1MEzPgAhyhaZ7RKog"], 14 | ["test string", "md5", "hex", undefined, "6f8db599de986fab7a21625b7916589c"] 15 | ].forEach(test => { 16 | it("should getHashDigest " + test[0] + " " + test[1] + " " + test[2] + " " + test[3], () => { 17 | const hashDigest = loaderUtils.getHashDigest(test[0], test[1], test[2], test[3]); 18 | assert.equal(hashDigest, test[4]); 19 | }); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const getOptions = require("./getOptions"); 4 | const parseQuery = require("./parseQuery"); 5 | const stringifyRequest = require("./stringifyRequest"); 6 | const getRemainingRequest = require("./getRemainingRequest"); 7 | const getCurrentRequest = require("./getCurrentRequest"); 8 | const isUrlRequest = require("./isUrlRequest"); 9 | const urlToRequest = require("./urlToRequest"); 10 | const parseString = require("./parseString"); 11 | const getHashDigest = require("./getHashDigest"); 12 | const interpolateName = require("./interpolateName"); 13 | 14 | exports.getOptions = getOptions; 15 | exports.parseQuery = parseQuery; 16 | exports.stringifyRequest = stringifyRequest; 17 | exports.getRemainingRequest = getRemainingRequest; 18 | exports.getCurrentRequest = getCurrentRequest; 19 | exports.isUrlRequest = isUrlRequest; 20 | exports.urlToRequest = urlToRequest; 21 | exports.parseString = parseString; 22 | exports.getHashDigest = getHashDigest; 23 | exports.interpolateName = interpolateName; 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "loader-utils", 3 | "version": "1.1.0", 4 | "author": "Tobias Koppers @sokra", 5 | "description": "utils for webpack loaders", 6 | "dependencies": { 7 | "big.js": "^3.1.3", 8 | "emojis-list": "^2.0.0", 9 | "json5": "^0.5.0" 10 | }, 11 | "scripts": { 12 | "test": "mocha", 13 | "posttest": "npm run lint", 14 | "lint": "eslint lib test", 15 | "travis": "npm run cover -- --report lcovonly", 16 | "cover": "istanbul cover -x *.runtime.js node_modules/mocha/bin/_mocha", 17 | "release": "npm test && standard-version" 18 | }, 19 | "license": "MIT", 20 | "repository": { 21 | "type": "git", 22 | "url": "https://github.com/webpack/loader-utils.git" 23 | }, 24 | "engines": { 25 | "node": ">=4.0.0" 26 | }, 27 | "devDependencies": { 28 | "coveralls": "^2.11.2", 29 | "eslint": "^3.15.0", 30 | "eslint-plugin-node": "^4.0.1", 31 | "istanbul": "^0.3.14", 32 | "mocha": "^1.21.4", 33 | "standard-version": "^4.0.0" 34 | }, 35 | "main": "lib/index.js", 36 | "files": [ 37 | "lib" 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright JS Foundation and other contributors 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | 'Software'), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 17 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 18 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 19 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 20 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /lib/parseQuery.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const JSON5 = require("json5"); 4 | 5 | const specialValues = { 6 | "null": null, 7 | "true": true, 8 | "false": false 9 | }; 10 | 11 | function parseQuery(query) { 12 | if(query.substr(0, 1) !== "?") { 13 | throw new Error("A valid query string passed to parseQuery should begin with '?'"); 14 | } 15 | query = query.substr(1); 16 | if(!query) { 17 | return {}; 18 | } 19 | if(query.substr(0, 1) === "{" && query.substr(-1) === "}") { 20 | return JSON5.parse(query); 21 | } 22 | const queryArgs = query.split(/[,&]/g); 23 | const result = {}; 24 | queryArgs.forEach(arg => { 25 | const idx = arg.indexOf("="); 26 | if(idx >= 0) { 27 | let name = arg.substr(0, idx); 28 | let value = decodeURIComponent(arg.substr(idx + 1)); 29 | if(specialValues.hasOwnProperty(value)) { 30 | value = specialValues[value]; 31 | } 32 | if(name.substr(-2) === "[]") { 33 | name = decodeURIComponent(name.substr(0, name.length - 2)); 34 | if(!Array.isArray(result[name])) 35 | result[name] = []; 36 | result[name].push(value); 37 | } else { 38 | name = decodeURIComponent(name); 39 | result[name] = value; 40 | } 41 | } else { 42 | if(arg.substr(0, 1) === "-") { 43 | result[decodeURIComponent(arg.substr(1))] = false; 44 | } else if(arg.substr(0, 1) === "+") { 45 | result[decodeURIComponent(arg.substr(1))] = true; 46 | } else { 47 | result[decodeURIComponent(arg)] = true; 48 | } 49 | } 50 | }); 51 | return result; 52 | } 53 | 54 | module.exports = parseQuery; 55 | -------------------------------------------------------------------------------- /lib/stringifyRequest.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const path = require("path"); 4 | 5 | const matchRelativePath = /^\.\.?[/\\]/; 6 | 7 | function isAbsolutePath(str) { 8 | return path.posix.isAbsolute(str) || path.win32.isAbsolute(str); 9 | } 10 | 11 | function isRelativePath(str) { 12 | return matchRelativePath.test(str); 13 | } 14 | 15 | function stringifyRequest(loaderContext, request) { 16 | const splitted = request.split("!"); 17 | const context = loaderContext.context || (loaderContext.options && loaderContext.options.context); 18 | return JSON.stringify(splitted.map(part => { 19 | // First, separate singlePath from query, because the query might contain paths again 20 | const splittedPart = part.match(/^(.*?)(\?.*)/); 21 | let singlePath = splittedPart ? splittedPart[1] : part; 22 | const query = splittedPart ? splittedPart[2] : ""; 23 | if(isAbsolutePath(singlePath) && context) { 24 | singlePath = path.relative(context, singlePath); 25 | if(isAbsolutePath(singlePath)) { 26 | // If singlePath still matches an absolute path, singlePath was on a different drive than context. 27 | // In this case, we leave the path platform-specific without replacing any separators. 28 | // @see https://github.com/webpack/loader-utils/pull/14 29 | return singlePath + query; 30 | } 31 | if(isRelativePath(singlePath) === false) { 32 | // Ensure that the relative path starts at least with ./ otherwise it would be a request into the modules directory (like node_modules). 33 | singlePath = "./" + singlePath; 34 | } 35 | } 36 | return singlePath.replace(/\\/g, "/") + query; 37 | }).join("!")); 38 | } 39 | 40 | module.exports = stringifyRequest; 41 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "plugins": ["node"], 4 | "extends": ["eslint:recommended", "plugin:node/recommended"], 5 | "env": { 6 | "node": true 7 | }, 8 | "rules": { 9 | "quotes": ["error", "double"], 10 | "no-undef": "error", 11 | "no-extra-semi": "error", 12 | "semi": "error", 13 | "no-template-curly-in-string": "error", 14 | "no-caller": "error", 15 | "yoda": "error", 16 | "eqeqeq": "error", 17 | "global-require": "off", 18 | "brace-style": "error", 19 | "eol-last": "error", 20 | "indent": ["error", "tab", { "SwitchCase": 1 }], 21 | "no-extra-bind": "warn", 22 | "no-empty": "off", 23 | "no-multiple-empty-lines": "error", 24 | "no-multi-spaces": "error", 25 | "no-process-exit": "warn", 26 | "space-in-parens": "error", 27 | "no-trailing-spaces": "error", 28 | "no-use-before-define": "off", 29 | "no-unused-vars": ["error", {"args": "none"}], 30 | "key-spacing": "error", 31 | "space-infix-ops": "error", 32 | "no-unsafe-negation": "error", 33 | "no-loop-func": "warn", 34 | "space-before-function-paren": ["error", "never"], 35 | "space-before-blocks": "error", 36 | "object-curly-spacing": ["error", "always"], 37 | "keyword-spacing": ["error", { 38 | "after": false, 39 | "overrides": { 40 | "try": {"after": true}, 41 | "else": {"after": true}, 42 | "throw": {"after": true}, 43 | "case": {"after": true}, 44 | "return": {"after": true}, 45 | "finally": {"after": true}, 46 | "do": {"after": true} 47 | } 48 | }], 49 | "no-console": "off", 50 | "valid-jsdoc": "error", 51 | "no-var": "error", 52 | "prefer-const": "error", 53 | "prefer-arrow-callback": "error", 54 | "object-shorthand": "error" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /lib/urlToRequest.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // we can't use path.win32.isAbsolute because it also matches paths starting with a forward slash 4 | const matchNativeWin32Path = /^[A-Z]:[/\\]|^\\\\/i; 5 | 6 | function urlToRequest(url, root) { 7 | // Do not rewrite an empty url 8 | if(url === "") { 9 | return ""; 10 | } 11 | 12 | const moduleRequestRegex = /^[^?]*~/; 13 | let request; 14 | 15 | if(matchNativeWin32Path.test(url)) { 16 | // absolute windows path, keep it 17 | request = url; 18 | } else if(root !== undefined && root !== false && /^\//.test(url)) { 19 | // if root is set and the url is root-relative 20 | switch(typeof root) { 21 | // 1. root is a string: root is prefixed to the url 22 | case "string": 23 | // special case: `~` roots convert to module request 24 | if(moduleRequestRegex.test(root)) { 25 | request = root.replace(/([^~\/])$/, "$1/") + url.slice(1); 26 | } else { 27 | request = root + url; 28 | } 29 | break; 30 | // 2. root is `true`: absolute paths are allowed 31 | // *nix only, windows-style absolute paths are always allowed as they doesn't start with a `/` 32 | case "boolean": 33 | request = url; 34 | break; 35 | default: 36 | throw new Error("Unexpected parameters to loader-utils 'urlToRequest': url = " + url + ", root = " + root + "."); 37 | } 38 | } else if(/^(?:https?:)?\/\//.test(url)) { 39 | // Preserve http and https urls 40 | request = url; 41 | } else if(/^\.\.?\//.test(url)) { 42 | // A relative url stays 43 | request = url; 44 | } else { 45 | // every other url is threaded like a relative url 46 | request = "./" + url; 47 | } 48 | 49 | // A `~` makes the url an module 50 | if(moduleRequestRegex.test(request)) { 51 | request = request.replace(moduleRequestRegex, ""); 52 | } 53 | 54 | return request; 55 | } 56 | 57 | module.exports = urlToRequest; 58 | -------------------------------------------------------------------------------- /lib/getHashDigest.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const baseEncodeTables = { 4 | 26: "abcdefghijklmnopqrstuvwxyz", 5 | 32: "123456789abcdefghjkmnpqrstuvwxyz", // no 0lio 6 | 36: "0123456789abcdefghijklmnopqrstuvwxyz", 7 | 49: "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ", // no lIO 8 | 52: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 9 | 58: "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ", // no 0lIO 10 | 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 11 | 64: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_" 12 | }; 13 | 14 | function encodeBufferToBase(buffer, base) { 15 | const encodeTable = baseEncodeTables[base]; 16 | if(!encodeTable) throw new Error("Unknown encoding base" + base); 17 | 18 | const readLength = buffer.length; 19 | 20 | const Big = require("big.js"); 21 | Big.RM = Big.DP = 0; 22 | let b = new Big(0); 23 | for(let i = readLength - 1; i >= 0; i--) { 24 | b = b.times(256).plus(buffer[i]); 25 | } 26 | 27 | let output = ""; 28 | while(b.gt(0)) { 29 | output = encodeTable[b.mod(base)] + output; 30 | b = b.div(base); 31 | } 32 | 33 | Big.DP = 20; 34 | Big.RM = 1; 35 | 36 | return output; 37 | } 38 | 39 | function getHashDigest(buffer, hashType, digestType, maxLength) { 40 | hashType = hashType || "md5"; 41 | maxLength = maxLength || 9999; 42 | const hash = require("crypto").createHash(hashType); 43 | hash.update(buffer); 44 | if(digestType === "base26" || digestType === "base32" || digestType === "base36" || 45 | digestType === "base49" || digestType === "base52" || digestType === "base58" || 46 | digestType === "base62" || digestType === "base64") { 47 | return encodeBufferToBase(hash.digest(), digestType.substr(4)).substr(0, maxLength); 48 | } else { 49 | return hash.digest(digestType || "hex").substr(0, maxLength); 50 | } 51 | } 52 | 53 | module.exports = getHashDigest; 54 | -------------------------------------------------------------------------------- /test/getOptions.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const assert = require("assert"); 4 | const loaderUtils = require("../lib"); 5 | 6 | describe("getOptions()", () => { 7 | describe("when loaderContext.query is a string with length > 0", () => { 8 | it("should call parseQuery() and return its result", () => { 9 | assert.deepEqual( 10 | loaderUtils.getOptions({ 11 | query: "?something=getOptions_cannot_parse" 12 | }), 13 | { something: "getOptions_cannot_parse" } 14 | ); 15 | }); 16 | }); 17 | describe("when loaderContext.query is an empty string", () => { 18 | it("should return null", () => { 19 | assert.strictEqual( 20 | loaderUtils.getOptions({ 21 | query: "" 22 | }), 23 | null 24 | ); 25 | }); 26 | }); 27 | describe("when loaderContext.query is an object", () => { 28 | it("should just return it", () => { 29 | const query = {}; 30 | assert.strictEqual( 31 | loaderUtils.getOptions({ 32 | query 33 | }), 34 | query 35 | ); 36 | }); 37 | }); 38 | describe("when loaderContext.query is an array", () => { 39 | it("should just return it", () => { 40 | const query = []; 41 | assert.strictEqual( 42 | loaderUtils.getOptions({ 43 | query 44 | }), 45 | query 46 | ); 47 | }); 48 | }); 49 | describe("when loaderContext.query is anything else", () => { 50 | it("should return null", () => { 51 | assert.strictEqual( 52 | loaderUtils.getOptions({ 53 | query: undefined 54 | }), 55 | null 56 | ); 57 | assert.strictEqual( 58 | loaderUtils.getOptions({ 59 | query: null 60 | }), 61 | null 62 | ); 63 | assert.strictEqual( 64 | loaderUtils.getOptions({ 65 | query: 1 66 | }), 67 | null 68 | ); 69 | assert.strictEqual( 70 | loaderUtils.getOptions({ 71 | query: 0 72 | }), 73 | null 74 | ); 75 | }); 76 | }); 77 | }); 78 | -------------------------------------------------------------------------------- /test/parseQuery.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const assert = require("assert"); 4 | const loaderUtils = require("../"); 5 | 6 | describe("parseQuery()", () => { 7 | describe("when passed string is a query string starting with ?", () => { 8 | [{ 9 | it: "should return an empty object by default", 10 | query: "?", 11 | expected: {} 12 | }, 13 | { 14 | it: "should parse query params", 15 | query: "?name=cheesecake&slices=8&delicious&warm=false", 16 | expected: { 17 | delicious: true, 18 | name: "cheesecake", 19 | slices: "8", // numbers are still strings with query params 20 | warm: false 21 | } 22 | }, 23 | { 24 | it: "should parse query params with arrays", 25 | query: "?ingredients[]=flour&ingredients[]=sugar", 26 | expected: { 27 | ingredients: ["flour", "sugar"] 28 | } 29 | }, 30 | { 31 | it: "should parse query params in JSON format", 32 | query: "?" + JSON.stringify({ 33 | delicious: true, 34 | name: "cheesecake", 35 | slices: 8, 36 | warm: false 37 | }), 38 | expected: { 39 | delicious: true, 40 | name: "cheesecake", 41 | slices: 8, 42 | warm: false 43 | } 44 | }, 45 | { 46 | it: "should use decodeURIComponent", 47 | query: "?%3d", 48 | expected: { "=": true } 49 | }, 50 | { 51 | it: "should recognize params starting with + as boolean params with the value true", 52 | query: "?+%3d", 53 | expected: { "=": true } 54 | }, 55 | { 56 | it: "should recognize params starting with - as boolean params with the value false", 57 | query: "?-%3d", 58 | expected: { "=": false } 59 | }, 60 | { 61 | it: "should not confuse regular equal signs and encoded equal signs", 62 | query: "?%3d=%3D", 63 | expected: { "=": "=" } 64 | }].forEach(test => { 65 | it(test.it, () => { 66 | assert.deepEqual( 67 | loaderUtils.parseQuery(test.query), 68 | test.expected 69 | ); 70 | }); 71 | }); 72 | }); 73 | 74 | describe("when passed string is any other string not starting with ?", () => { 75 | it("should throw an error", () => { 76 | assert.throws( 77 | () => loaderUtils.parseQuery("a"), 78 | "A valid query string passed to parseQuery should begin with '?'" 79 | ); 80 | }); 81 | }); 82 | 83 | }); 84 | -------------------------------------------------------------------------------- /test/urlToRequest.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const assert = require("assert"); 4 | const loaderUtils = require("../"); 5 | 6 | function ExpectedError(regex) { 7 | this.regex = regex; 8 | } 9 | ExpectedError.prototype.matches = function(err) { 10 | return this.regex.test(err.message); 11 | }; 12 | 13 | describe("urlToRequest()", () => { 14 | [ 15 | // without root 16 | [["//google.com"], "//google.com", "should handle scheme-agnostic urls"], 17 | [["http://google.com"], "http://google.com", "should handle http urls"], 18 | [["https://google.com"], "https://google.com", "should handle https urls"], 19 | [["path/to/thing"], "./path/to/thing", "should handle implicit relative urls"], 20 | [["./path/to/thing"], "./path/to/thing", "should handle explicit relative urls"], 21 | [["~path/to/thing"], "path/to/thing", "should handle module urls (with ~)"], 22 | [["some/other/stuff/and/then~path/to/thing"], "path/to/thing", "should handle module urls with path prefix"], 23 | [["./some/other/stuff/and/then~path/to/thing"], "path/to/thing", "should handle module urls with relative path prefix"], 24 | // with root (normal path) 25 | [["path/to/thing", "root/dir"], "./path/to/thing", "should do nothing with root if implicit relative url"], 26 | [["./path/to/thing", "root/dir"], "./path/to/thing", "should do nothing with root if explicit relative url"], 27 | [["/path/to/thing", "root/dir"], "root/dir/path/to/thing", "should include root if root-relative url"], 28 | // with root (boolean) 29 | [["/path/to/thing", true], "/path/to/thing", "should allow root-relative to exist as-is if root = `true`"], 30 | // with root (boolean) on Windows 31 | [["C:\\path\\to\\thing"], "C:\\path\\to\\thing", "should handle Windows absolute paths with drive letter"], 32 | [["\\\\?\\UNC\\ComputerName\\path\\to\\thing"], "\\\\?\\UNC\\ComputerName\\path\\to\\thing", "should handle Windows absolute UNC paths"], 33 | // with root (module) 34 | [["/path/to/thing", "~"], "path/to/thing", "should convert to module url if root = ~"], 35 | // with root (module path) 36 | [["/path/to/thing", "~module"], "module/path/to/thing", "should allow module prefixes when root starts with ~"], 37 | [["/path/to/thing", "~module/"], "module/path/to/thing", "should allow module prefixes (with trailing slash) when root starts with ~"], 38 | // error cases 39 | [["/path/to/thing", 1], new ExpectedError(/unexpected parameters/i), "should throw an error on invalid root"], 40 | // difficult cases 41 | [["a:b-not-\\window-path"], "./a:b-not-\\window-path", "should not incorrectly detect windows paths"], 42 | // empty url 43 | [[""], "", "should do nothing if url is empty"] 44 | ].forEach((test) => { 45 | it(test[2], () => { 46 | const expected = test[1]; 47 | try { 48 | const request = loaderUtils.urlToRequest.apply(loaderUtils, test[0]); 49 | assert.equal(request, expected); 50 | } catch(e) { 51 | if(expected instanceof ExpectedError) { 52 | assert.ok(expected.matches(e)); 53 | } else { 54 | assert.ok(false, "should not have thrown an error: " + e.message); 55 | } 56 | } 57 | }); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /lib/interpolateName.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const path = require("path"); 4 | const emojisList = require("emojis-list"); 5 | const getHashDigest = require("./getHashDigest"); 6 | 7 | const emojiRegex = /[\uD800-\uDFFF]./; 8 | const emojiList = emojisList.filter(emoji => emojiRegex.test(emoji)); 9 | const emojiCache = {}; 10 | 11 | function encodeStringToEmoji(content, length) { 12 | if(emojiCache[content]) return emojiCache[content]; 13 | length = length || 1; 14 | const emojis = []; 15 | do { 16 | const index = Math.floor(Math.random() * emojiList.length); 17 | emojis.push(emojiList[index]); 18 | emojiList.splice(index, 1); 19 | } while(--length > 0); 20 | const emojiEncoding = emojis.join(""); 21 | emojiCache[content] = emojiEncoding; 22 | return emojiEncoding; 23 | } 24 | 25 | function interpolateName(loaderContext, name, options) { 26 | let filename; 27 | if(typeof name === "function") { 28 | filename = name(loaderContext.resourcePath); 29 | } else { 30 | filename = name || "[hash].[ext]"; 31 | } 32 | const context = options.context; 33 | const content = options.content; 34 | const regExp = options.regExp; 35 | let ext = "bin"; 36 | let basename = "file"; 37 | let directory = ""; 38 | let folder = ""; 39 | if(loaderContext.resourcePath) { 40 | const parsed = path.parse(loaderContext.resourcePath); 41 | let resourcePath = loaderContext.resourcePath; 42 | 43 | if(parsed.ext) { 44 | ext = parsed.ext.substr(1); 45 | } 46 | if(parsed.dir) { 47 | basename = parsed.name; 48 | resourcePath = parsed.dir + path.sep; 49 | } 50 | if(typeof context !== "undefined") { 51 | directory = path.relative(context, resourcePath + "_").replace(/\\/g, "/").replace(/\.\.(\/)?/g, "_$1"); 52 | directory = directory.substr(0, directory.length - 1); 53 | } else { 54 | directory = resourcePath.replace(/\\/g, "/").replace(/\.\.(\/)?/g, "_$1"); 55 | } 56 | if(directory.length === 1) { 57 | directory = ""; 58 | } else if(directory.length > 1) { 59 | folder = path.basename(directory); 60 | } 61 | } 62 | let url = filename; 63 | if(content) { 64 | // Match hash template 65 | url = url 66 | .replace( 67 | /\[(?:(\w+):)?hash(?::([a-z]+\d*))?(?::(\d+))?\]/ig, 68 | (all, hashType, digestType, maxLength) => getHashDigest(content, hashType, digestType, parseInt(maxLength, 10)) 69 | ) 70 | .replace( 71 | /\[emoji(?::(\d+))?\]/ig, 72 | (all, length) => encodeStringToEmoji(content, length) 73 | ); 74 | } 75 | url = url 76 | .replace(/\[ext\]/ig, () => ext) 77 | .replace(/\[name\]/ig, () => basename) 78 | .replace(/\[path\]/ig, () => directory) 79 | .replace(/\[folder\]/ig, () => folder); 80 | if(regExp && loaderContext.resourcePath) { 81 | const match = loaderContext.resourcePath.match(new RegExp(regExp)); 82 | match && match.forEach((matched, i) => { 83 | url = url.replace( 84 | new RegExp("\\[" + i + "\\]", "ig"), 85 | matched 86 | ); 87 | }); 88 | } 89 | if(typeof loaderContext.options === "object" && typeof loaderContext.options.customInterpolateName === "function") { 90 | url = loaderContext.options.customInterpolateName.call(loaderContext, url, name, options); 91 | } 92 | return url; 93 | } 94 | 95 | module.exports = interpolateName; 96 | -------------------------------------------------------------------------------- /test/interpolateName.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const assert = require("assert"); 4 | const loaderUtils = require("../"); 5 | 6 | const emojiRegex = /[\uD800-\uDFFF]./; 7 | 8 | describe("interpolateName()", () => { 9 | function run(tests) { 10 | tests.forEach((test) => { 11 | const args = test[0]; 12 | const expected = test[1]; 13 | const message = test[2]; 14 | it(message, () => { 15 | const result = loaderUtils.interpolateName.apply(loaderUtils, args); 16 | if(typeof expected === "function") { 17 | expected(result); 18 | } else { 19 | assert.equal(result, expected); 20 | } 21 | }); 22 | }); 23 | } 24 | 25 | [ 26 | ["/app/js/javascript.js", "js/[hash].script.[ext]", "test content", "js/9473fdd0d880a43c21b7778d34872157.script.js"], 27 | ["/app/page.html", "html-[hash:6].html", "test content", "html-9473fd.html"], 28 | ["/app/flash.txt", "[hash]", "test content", "9473fdd0d880a43c21b7778d34872157"], 29 | ["/app/img/image.png", "[sha512:hash:base64:7].[ext]", "test content", "2BKDTjl.png"], 30 | ["/app/dir/file.png", "[path][name].[ext]?[hash]", "test content", "/app/dir/file.png?9473fdd0d880a43c21b7778d34872157"], 31 | ["/vendor/test/images/loading.gif", path => path.replace(/\/?vendor\/?/, ""), "test content", "test/images/loading.gif"], 32 | ["/pathWith.period/filename.js", "js/[name].[ext]", "test content", "js/filename.js"], 33 | ["/pathWith.period/filenameWithoutExt", "js/[name].[ext]", "test content", "js/filenameWithoutExt.bin"] 34 | ].forEach(test => { 35 | it("should interpolate " + test[0] + " " + test[1], () => { 36 | const interpolatedName = loaderUtils.interpolateName({ resourcePath: test[0] }, test[1], { content: test[2] }); 37 | assert.equal(interpolatedName, test[3]); 38 | }); 39 | }); 40 | 41 | run([ 42 | [[{}, "", { content: "test string" }], "6f8db599de986fab7a21625b7916589c.bin", "should interpolate default tokens"], 43 | [[{}, "[hash:base64]", { content: "test string" }], "2sm1pVmS8xuGJLCdWpJoRL", "should interpolate [hash] token with options"], 44 | [[{}, "[unrecognized]", { content: "test string" }], "[unrecognized]", "should not interpolate unrecognized token"], 45 | [ 46 | [{}, "[emoji]", { content: "test" }], 47 | result => { 48 | assert.ok(emojiRegex.test(result), result); 49 | }, 50 | "should interpolate [emoji]" 51 | ], 52 | [ 53 | [{}, "[emoji:3]", { content: "string" }], 54 | result => { 55 | assert.ok(emojiRegex.test(result), result); 56 | assert.ok(result.length, 6); 57 | }, 58 | "should interpolate [emoji:3]" 59 | ], 60 | ]); 61 | 62 | it("should return the same emoji for the same string", () => { 63 | const args = [{}, "[emoji:5]", { content: "same_emoji" }]; 64 | const result1 = loaderUtils.interpolateName.apply(loaderUtils, args); 65 | const result2 = loaderUtils.interpolateName.apply(loaderUtils, args); 66 | assert.equal(result1, result2); 67 | }); 68 | 69 | context("no loader context", () => { 70 | const loaderContext = {}; 71 | run([ 72 | [[loaderContext, "[ext]", {}], "bin", "should interpolate [ext] token"], 73 | [[loaderContext, "[name]", {}], "file", "should interpolate [name] token"], 74 | [[loaderContext, "[path]", {}], "", "should interpolate [path] token"], 75 | [[loaderContext, "[folder]", {}], "", "should interpolate [folder] token"] 76 | ]); 77 | }); 78 | 79 | context("with loader context", () => { 80 | const loaderContext = { resourcePath: "/path/to/file.exe" }; 81 | run([ 82 | [[loaderContext, "[ext]", {}], "exe", "should interpolate [ext] token"], 83 | [[loaderContext, "[name]", {}], "file", "should interpolate [name] token"], 84 | [[loaderContext, "[path]", {}], "/path/to/", "should interpolate [path] token"], 85 | [[loaderContext, "[folder]", {}], "to", "should interpolate [folder] token"] 86 | ]); 87 | }); 88 | 89 | run([ 90 | [[{ 91 | resourcePath: "/xyz", 92 | options: { 93 | customInterpolateName(str, name, options) { 94 | return str + "-" + name + "-" + options.special; 95 | } 96 | } 97 | }, "[name]", { 98 | special: "special" 99 | }], "xyz-[name]-special", "should provide a custom interpolateName function in options"], 100 | ]); 101 | }); 102 | -------------------------------------------------------------------------------- /test/stringifyRequest.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const assert = require("assert"); 4 | const path = require("path"); 5 | const loaderUtils = require("../"); 6 | 7 | const s = JSON.stringify; 8 | 9 | describe("stringifyRequest()", () => { 10 | // We know that query strings that contain paths and question marks can be problematic. 11 | // We must ensure that stringifyRequest is not messing with them 12 | const paramQueryString = "?questionMark?posix=path/to/thing&win=path\\to\\thing"; 13 | const jsonQueryString = "?" + s({ 14 | questionMark: "?", 15 | posix: "path/to/thing", 16 | win: "path\\to\\file" 17 | }); 18 | [ 19 | { test: 1, request: "./a.js", expected: s("./a.js") }, 20 | { test: 2, request: ".\\a.js", expected: s("./a.js") }, 21 | { test: 3, request: "./a/b.js", expected: s("./a/b.js") }, 22 | { test: 4, request: ".\\a\\b.js", expected: s("./a/b.js") }, 23 | { test: 5, request: "module", expected: s("module") }, // without ./ is a request into the modules directory 24 | { test: 6, request: "module/a.js", expected: s("module/a.js") }, 25 | { test: 7, request: "module\\a.js", expected: s("module/a.js") }, 26 | { test: 8, request: "./a.js" + paramQueryString, expected: s("./a.js" + paramQueryString) }, 27 | { test: 9, request: "./a.js" + jsonQueryString, expected: s("./a.js" + jsonQueryString) }, 28 | { test: 10, request: "module" + paramQueryString, expected: s("module" + paramQueryString) }, 29 | { test: 11, request: "module" + jsonQueryString, expected: s("module" + jsonQueryString) }, 30 | { test: 12, os: "posix", context: "/path/to", request: "/path/to/module/a.js", expected: s("./module/a.js") }, 31 | { test: 13, os: "win32", context: "C:\\path\\to\\", request: "C:\\path\\to\\module\\a.js", expected: s("./module/a.js") }, 32 | { test: 14, os: "posix", context: "/path/to/thing", request: "/path/to/module/a.js", expected: s("../module/a.js") }, 33 | { test: 15, os: "win32", context: "C:\\path\\to\\thing", request: "C:\\path\\to\\module\\a.js", expected: s("../module/a.js") }, 34 | { test: 16, os: "win32", context: "\\\\A\\path\\to\\thing", request: "\\\\A\\path\\to\\module\\a.js", expected: s("../module/a.js") }, 35 | // If context and request are on different drives, the path should not be relative 36 | // @see https://github.com/webpack/loader-utils/pull/14 37 | { test: 17, os: "win32", context: "D:\\path\\to\\thing", request: "C:\\path\\to\\module\\a.js", expected: s("C:\\path\\to\\module\\a.js") }, 38 | { test: 18, os: "win32", context: "\\\\A\\path\\to\\thing", request: "\\\\B\\path\\to\\module\\a.js", expected: s("\\\\B\\path\\to\\module\\a.js") }, 39 | { 40 | test: 19, 41 | os: "posix", 42 | context: "/path/to", 43 | request: "/path/to/module/a.js" + paramQueryString, 44 | expected: s("./module/a.js" + paramQueryString) 45 | }, 46 | { 47 | test: 20, 48 | os: "win32", 49 | context: "C:\\path\\to\\", 50 | request: "C:\\path\\to\\module\\a.js" + paramQueryString, 51 | expected: s("./module/a.js" + paramQueryString) 52 | }, 53 | { 54 | test: 21, 55 | request: 56 | ["./a.js", "./b.js", "./c.js"].join("!"), 57 | expected: s( 58 | ["./a.js", "./b.js", "./c.js"].join("!") 59 | ) 60 | }, 61 | { 62 | test: 22, 63 | request: 64 | ["a/b.js", "c/d.js", "e/f.js", "g"].join("!"), 65 | expected: s( 66 | ["a/b.js", "c/d.js", "e/f.js", "g"].join("!") 67 | ) 68 | }, 69 | { 70 | test: 23, 71 | request: 72 | ["a/b.js" + paramQueryString, "c/d.js" + jsonQueryString, "e/f.js"].join("!"), 73 | expected: s( 74 | ["a/b.js" + paramQueryString, "c/d.js" + jsonQueryString, "e/f.js"].join("!") 75 | ) 76 | }, 77 | { 78 | test: 24, 79 | os: "posix", 80 | context: "/path/to", 81 | request: 82 | ["/a/b.js" + paramQueryString, "c/d.js" + jsonQueryString, "/path/to/e/f.js"].join("!"), 83 | expected: s( 84 | ["../../a/b.js" + paramQueryString, "c/d.js" + jsonQueryString, "./e/f.js"].join("!") 85 | ) 86 | }, 87 | { 88 | test: 25, 89 | os: "win32", 90 | context: "C:\\path\\to\\", 91 | request: 92 | ["C:\\a\\b.js" + paramQueryString, "c\\d.js" + jsonQueryString, "C:\\path\\to\\e\\f.js"].join("!"), 93 | expected: s( 94 | ["../../a/b.js" + paramQueryString, "c/d.js" + jsonQueryString, "./e/f.js"].join("!") 95 | ) 96 | } 97 | ].forEach(testCase => { 98 | it(`${ testCase.test }. should stringify request ${ testCase.request } to ${ testCase.expected } inside context ${ testCase.context }`, () => { 99 | const relative = path.relative; 100 | if(testCase.os) { 101 | // monkey patch path.relative in order to make this test work in every OS 102 | path.relative = path[testCase.os].relative; 103 | } 104 | const actual = loaderUtils.stringifyRequest({ context: testCase.context }, testCase.request); 105 | assert.equal(actual, testCase.expected); 106 | path.relative = relative; 107 | }); 108 | }); 109 | }); 110 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # loader-utils 2 | 3 | ## Methods 4 | 5 | ### `getOptions` 6 | 7 | Recommended way to retrieve the options of a loader invocation: 8 | 9 | ```javascript 10 | // inside your loader 11 | const options = loaderUtils.getOptions(this); 12 | ``` 13 | 14 | 1. If `this.query` is a string: 15 | - Tries to parse the query string and returns a new object 16 | - Throws if it's not a valid query string 17 | 2. If `this.query` is object-like, it just returns `this.query` 18 | 3. In any other case, it just returns `null` 19 | 20 | **Please note:** The returned `options` object is *read-only*. It may be re-used across multiple invocations. 21 | If you pass it on to another library, make sure to make a *deep copy* of it: 22 | 23 | ```javascript 24 | const options = Object.assign( 25 | {}, 26 | loaderUtils.getOptions(this), // it is safe to pass null to Object.assign() 27 | defaultOptions 28 | ); 29 | // don't forget nested objects or arrays 30 | options.obj = Object.assign({}, options.obj); 31 | options.arr = options.arr.slice(); 32 | someLibrary(options); 33 | ``` 34 | 35 | [clone](https://www.npmjs.com/package/clone) is a good library to make a deep copy of the options. 36 | 37 | #### Options as query strings 38 | 39 | If the loader options have been passed as loader query string (`loader?some¶ms`), the string is parsed by using [`parseQuery`](#parsequery). 40 | 41 | ### `parseQuery` 42 | 43 | Parses a passed string (e.g. `loaderContext.resourceQuery`) as a query string, and returns an object. 44 | 45 | ``` javascript 46 | const params = loaderUtils.parseQuery(this.resourceQuery); // resource: `file?param1=foo` 47 | if (params.param1 === "foo") { 48 | // do something 49 | } 50 | ``` 51 | 52 | The string is parsed like this: 53 | 54 | ``` text 55 | -> Error 56 | ? -> {} 57 | ?flag -> { flag: true } 58 | ?+flag -> { flag: true } 59 | ?-flag -> { flag: false } 60 | ?xyz=test -> { xyz: "test" } 61 | ?xyz=1 -> { xyz: "1" } // numbers are NOT parsed 62 | ?xyz[]=a -> { xyz: ["a"] } 63 | ?flag1&flag2 -> { flag1: true, flag2: true } 64 | ?+flag1,-flag2 -> { flag1: true, flag2: false } 65 | ?xyz[]=a,xyz[]=b -> { xyz: ["a", "b"] } 66 | ?a%2C%26b=c%2C%26d -> { "a,&b": "c,&d" } 67 | ?{data:{a:1},isJSON5:true} -> { data: { a: 1 }, isJSON5: true } 68 | ``` 69 | 70 | ### `stringifyRequest` 71 | 72 | Turns a request into a string that can be used inside `require()` or `import` while avoiding absolute paths. 73 | Use it instead of `JSON.stringify(...)` if you're generating code inside a loader. 74 | 75 | **Why is this necessary?** Since webpack calculates the hash before module paths are translated into module ids, we must avoid absolute paths to ensure 76 | consistent hashes across different compilations. 77 | 78 | This function: 79 | 80 | - resolves absolute requests into relative requests if the request and the module are on the same hard drive 81 | - replaces `\` with `/` if the request and the module are on the same hard drive 82 | - won't change the path at all if the request and the module are on different hard drives 83 | - applies `JSON.stringify` to the result 84 | 85 | ```javascript 86 | loaderUtils.stringifyRequest(this, "./test.js"); 87 | // "\"./test.js\"" 88 | 89 | loaderUtils.stringifyRequest(this, ".\\test.js"); 90 | // "\"./test.js\"" 91 | 92 | loaderUtils.stringifyRequest(this, "test"); 93 | // "\"test\"" 94 | 95 | loaderUtils.stringifyRequest(this, "test/lib/index.js"); 96 | // "\"test/lib/index.js\"" 97 | 98 | loaderUtils.stringifyRequest(this, "otherLoader?andConfig!test?someConfig"); 99 | // "\"otherLoader?andConfig!test?someConfig\"" 100 | 101 | loaderUtils.stringifyRequest(this, require.resolve("test")); 102 | // "\"../node_modules/some-loader/lib/test.js\"" 103 | 104 | loaderUtils.stringifyRequest(this, "C:\\module\\test.js"); 105 | // "\"../../test.js\"" (on Windows, in case the module and the request are on the same drive) 106 | 107 | loaderUtils.stringifyRequest(this, "C:\\module\\test.js"); 108 | // "\"C:\\module\\test.js\"" (on Windows, in case the module and the request are on different drives) 109 | 110 | loaderUtils.stringifyRequest(this, "\\\\network-drive\\test.js"); 111 | // "\"\\\\network-drive\\\\test.js\"" (on Windows, in case the module and the request are on different drives) 112 | ``` 113 | 114 | ### `urlToRequest` 115 | 116 | Converts some resource URL to a webpack module request. 117 | 118 | ```javascript 119 | const url = "path/to/module.js"; 120 | const request = loaderUtils.urlToRequest(url); // "./path/to/module.js" 121 | ``` 122 | 123 | #### Module URLs 124 | 125 | Any URL containing a `~` will be interpreted as a module request. Anything after the `~` will be considered the request path. 126 | 127 | ```javascript 128 | const url = "~path/to/module.js"; 129 | const request = loaderUtils.urlToRequest(url); // "path/to/module.js" 130 | ``` 131 | 132 | #### Root-relative URLs 133 | 134 | URLs that are root-relative (start with `/`) can be resolved relative to some arbitrary path by using the `root` parameter: 135 | 136 | ```javascript 137 | const url = "/path/to/module.js"; 138 | const root = "./root"; 139 | const request = loaderUtils.urlToRequest(url, root); // "./root/path/to/module.js" 140 | ``` 141 | 142 | To convert a root-relative URL into a module URL, specify a `root` value that starts with `~`: 143 | 144 | ```javascript 145 | const url = "/path/to/module.js"; 146 | const root = "~"; 147 | const request = loaderUtils.urlToRequest(url, root); // "path/to/module.js" 148 | ``` 149 | 150 | ### `interpolateName` 151 | 152 | Interpolates a filename template using multiple placeholders and/or a regular expression. 153 | The template and regular expression are set as query params called `name` and `regExp` on the current loader's context. 154 | 155 | ```javascript 156 | const interpolatedName = loaderUtils.interpolateName(loaderContext, name, options); 157 | ``` 158 | 159 | The following tokens are replaced in the `name` parameter: 160 | 161 | * `[ext]` the extension of the resource 162 | * `[name]` the basename of the resource 163 | * `[path]` the path of the resource relative to the `context` query parameter or option. 164 | * `[folder]` the folder of the resource is in. 165 | * `[emoji]` a random emoji representation of `options.content` 166 | * `[emoji:]` same as above, but with a customizable number of emojis 167 | * `[hash]` the hash of `options.content` (Buffer) (by default it's the hex digest of the md5 hash) 168 | * `[:hash::]` optionally one can configure 169 | * other `hashType`s, i. e. `sha1`, `md5`, `sha256`, `sha512` 170 | * other `digestType`s, i. e. `hex`, `base26`, `base32`, `base36`, `base49`, `base52`, `base58`, `base62`, `base64` 171 | * and `length` the length in chars 172 | * `[N]` the N-th match obtained from matching the current file name against `options.regExp` 173 | 174 | Examples 175 | 176 | ``` javascript 177 | // loaderContext.resourcePath = "/app/js/javascript.js" 178 | loaderUtils.interpolateName(loaderContext, "js/[hash].script.[ext]", { content: ... }); 179 | // => js/9473fdd0d880a43c21b7778d34872157.script.js 180 | 181 | // loaderContext.resourcePath = "/app/page.html" 182 | loaderUtils.interpolateName(loaderContext, "html-[hash:6].html", { content: ... }); 183 | // => html-9473fd.html 184 | 185 | // loaderContext.resourcePath = "/app/flash.txt" 186 | loaderUtils.interpolateName(loaderContext, "[hash]", { content: ... }); 187 | // => c31e9820c001c9c4a86bce33ce43b679 188 | 189 | // loaderContext.resourcePath = "/app/img/image.gif" 190 | loaderUtils.interpolateName(loaderContext, "[emoji]", { content: ... }); 191 | // => 👍 192 | 193 | // loaderContext.resourcePath = "/app/img/image.gif" 194 | loaderUtils.interpolateName(loaderContext, "[emoji:4]", { content: ... }); 195 | // => 🙍🏢📤🐝 196 | 197 | // loaderContext.resourcePath = "/app/img/image.png" 198 | loaderUtils.interpolateName(loaderContext, "[sha512:hash:base64:7].[ext]", { content: ... }); 199 | // => 2BKDTjl.png 200 | // use sha512 hash instead of md5 and with only 7 chars of base64 201 | 202 | // loaderContext.resourcePath = "/app/img/myself.png" 203 | // loaderContext.query.name = 204 | loaderUtils.interpolateName(loaderContext, "picture.png"); 205 | // => picture.png 206 | 207 | // loaderContext.resourcePath = "/app/dir/file.png" 208 | loaderUtils.interpolateName(loaderContext, "[path][name].[ext]?[hash]", { content: ... }); 209 | // => /app/dir/file.png?9473fdd0d880a43c21b7778d34872157 210 | 211 | // loaderContext.resourcePath = "/app/js/page-home.js" 212 | loaderUtils.interpolateName(loaderContext, "script-[1].[ext]", { regExp: "page-(.*)\\.js", content: ... }); 213 | // => script-home.js 214 | ``` 215 | 216 | ### `getHashDigest` 217 | 218 | ``` javascript 219 | const digestString = loaderUtils.getHashDigest(buffer, hashType, digestType, maxLength); 220 | ``` 221 | 222 | * `buffer` the content that should be hashed 223 | * `hashType` one of `sha1`, `md5`, `sha256`, `sha512` or any other node.js supported hash type 224 | * `digestType` one of `hex`, `base26`, `base32`, `base36`, `base49`, `base52`, `base58`, `base62`, `base64` 225 | * `maxLength` the maximum length in chars 226 | 227 | ## License 228 | 229 | MIT (http://www.opensource.org/licenses/mit-license.php) 230 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | JSONStream@^1.0.4: 6 | version "1.3.1" 7 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a" 8 | dependencies: 9 | jsonparse "^1.2.0" 10 | through ">=2.2.7 <3" 11 | 12 | abbrev@1, abbrev@1.0.x: 13 | version "1.0.9" 14 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 15 | 16 | acorn-jsx@^3.0.0: 17 | version "3.0.1" 18 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 19 | dependencies: 20 | acorn "^3.0.4" 21 | 22 | acorn@4.0.4: 23 | version "4.0.4" 24 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" 25 | 26 | acorn@^3.0.4: 27 | version "3.3.0" 28 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 29 | 30 | ajv-keywords@^1.0.0: 31 | version "1.5.1" 32 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 33 | 34 | ajv@^4.7.0: 35 | version "4.11.5" 36 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd" 37 | dependencies: 38 | co "^4.6.0" 39 | json-stable-stringify "^1.0.1" 40 | 41 | align-text@^0.1.1, align-text@^0.1.3: 42 | version "0.1.4" 43 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 44 | dependencies: 45 | kind-of "^3.0.2" 46 | longest "^1.0.1" 47 | repeat-string "^1.5.2" 48 | 49 | amdefine@>=0.0.4: 50 | version "1.0.1" 51 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 52 | 53 | ansi-escapes@^1.1.0: 54 | version "1.4.0" 55 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 56 | 57 | ansi-regex@^2.0.0: 58 | version "2.1.1" 59 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 60 | 61 | ansi-styles@^2.2.1: 62 | version "2.2.1" 63 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 64 | 65 | argparse@^1.0.7: 66 | version "1.0.9" 67 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 68 | dependencies: 69 | sprintf-js "~1.0.2" 70 | 71 | array-find-index@^1.0.1: 72 | version "1.0.2" 73 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 74 | 75 | array-ify@^1.0.0: 76 | version "1.0.0" 77 | resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" 78 | 79 | array-union@^1.0.1: 80 | version "1.0.2" 81 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 82 | dependencies: 83 | array-uniq "^1.0.1" 84 | 85 | array-uniq@^1.0.1: 86 | version "1.0.3" 87 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 88 | 89 | arrify@^1.0.0: 90 | version "1.0.1" 91 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 92 | 93 | asn1@~0.2.3: 94 | version "0.2.3" 95 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 96 | 97 | assert-plus@1.0.0, assert-plus@^1.0.0: 98 | version "1.0.0" 99 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 100 | 101 | assert-plus@^0.2.0: 102 | version "0.2.0" 103 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 104 | 105 | async@1.x, async@^1.4.0: 106 | version "1.5.2" 107 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 108 | 109 | asynckit@^0.4.0: 110 | version "0.4.0" 111 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 112 | 113 | aws-sign2@~0.6.0: 114 | version "0.6.0" 115 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 116 | 117 | aws4@^1.2.1: 118 | version "1.6.0" 119 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 120 | 121 | babel-code-frame@^6.16.0: 122 | version "6.22.0" 123 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 124 | dependencies: 125 | chalk "^1.1.0" 126 | esutils "^2.0.2" 127 | js-tokens "^3.0.0" 128 | 129 | balanced-match@^0.4.1: 130 | version "0.4.2" 131 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 132 | 133 | bcrypt-pbkdf@^1.0.0: 134 | version "1.0.1" 135 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 136 | dependencies: 137 | tweetnacl "^0.14.3" 138 | 139 | big.js@^3.1.3: 140 | version "3.1.3" 141 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" 142 | 143 | boom@2.x.x: 144 | version "2.10.1" 145 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 146 | dependencies: 147 | hoek "2.x.x" 148 | 149 | brace-expansion@^1.0.0: 150 | version "1.1.6" 151 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 152 | dependencies: 153 | balanced-match "^0.4.1" 154 | concat-map "0.0.1" 155 | 156 | buffer-shims@^1.0.0: 157 | version "1.0.0" 158 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 159 | 160 | builtin-modules@^1.0.0: 161 | version "1.1.1" 162 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 163 | 164 | caller-path@^0.1.0: 165 | version "0.1.0" 166 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 167 | dependencies: 168 | callsites "^0.2.0" 169 | 170 | callsites@^0.2.0: 171 | version "0.2.0" 172 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 173 | 174 | camelcase-keys@^2.0.0: 175 | version "2.1.0" 176 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 177 | dependencies: 178 | camelcase "^2.0.0" 179 | map-obj "^1.0.0" 180 | 181 | camelcase@^1.0.2: 182 | version "1.2.1" 183 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 184 | 185 | camelcase@^2.0.0: 186 | version "2.1.1" 187 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 188 | 189 | camelcase@^3.0.0: 190 | version "3.0.0" 191 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 192 | 193 | caseless@~0.11.0: 194 | version "0.11.0" 195 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 196 | 197 | center-align@^0.1.1: 198 | version "0.1.3" 199 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 200 | dependencies: 201 | align-text "^0.1.3" 202 | lazy-cache "^1.0.3" 203 | 204 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 205 | version "1.1.3" 206 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 207 | dependencies: 208 | ansi-styles "^2.2.1" 209 | escape-string-regexp "^1.0.2" 210 | has-ansi "^2.0.0" 211 | strip-ansi "^3.0.0" 212 | supports-color "^2.0.0" 213 | 214 | circular-json@^0.3.1: 215 | version "0.3.1" 216 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 217 | 218 | cli-cursor@^1.0.1: 219 | version "1.0.2" 220 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 221 | dependencies: 222 | restore-cursor "^1.0.1" 223 | 224 | cli-width@^2.0.0: 225 | version "2.1.0" 226 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 227 | 228 | cliui@^2.1.0: 229 | version "2.1.0" 230 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 231 | dependencies: 232 | center-align "^0.1.1" 233 | right-align "^0.1.1" 234 | wordwrap "0.0.2" 235 | 236 | cliui@^3.2.0: 237 | version "3.2.0" 238 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 239 | dependencies: 240 | string-width "^1.0.1" 241 | strip-ansi "^3.0.1" 242 | wrap-ansi "^2.0.0" 243 | 244 | co@^4.6.0: 245 | version "4.6.0" 246 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 247 | 248 | code-point-at@^1.0.0: 249 | version "1.1.0" 250 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 251 | 252 | combined-stream@^1.0.5, combined-stream@~1.0.5: 253 | version "1.0.5" 254 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 255 | dependencies: 256 | delayed-stream "~1.0.0" 257 | 258 | commander@0.6.1: 259 | version "0.6.1" 260 | resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" 261 | 262 | commander@2.3.0: 263 | version "2.3.0" 264 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" 265 | 266 | commander@^2.9.0: 267 | version "2.9.0" 268 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 269 | dependencies: 270 | graceful-readlink ">= 1.0.0" 271 | 272 | compare-func@^1.3.1: 273 | version "1.3.2" 274 | resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" 275 | dependencies: 276 | array-ify "^1.0.0" 277 | dot-prop "^3.0.0" 278 | 279 | concat-map@0.0.1: 280 | version "0.0.1" 281 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 282 | 283 | concat-stream@^1.4.10, concat-stream@^1.4.6: 284 | version "1.6.0" 285 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 286 | dependencies: 287 | inherits "^2.0.3" 288 | readable-stream "^2.2.2" 289 | typedarray "^0.0.6" 290 | 291 | conventional-changelog-angular@^1.3.3: 292 | version "1.3.3" 293 | resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.3.tgz#e7ce807a85dd4750e1b417f766045497511e0726" 294 | dependencies: 295 | compare-func "^1.3.1" 296 | github-url-from-git "^1.4.0" 297 | q "^1.4.1" 298 | 299 | conventional-changelog-atom@^0.1.0: 300 | version "0.1.0" 301 | resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.0.tgz#67a47c66a42b2f8909ef1587c9989ae1de730b92" 302 | dependencies: 303 | q "^1.4.1" 304 | 305 | conventional-changelog-codemirror@^0.1.0: 306 | version "0.1.0" 307 | resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.1.0.tgz#7577a591dbf9b538e7a150a7ee62f65a2872b334" 308 | dependencies: 309 | q "^1.4.1" 310 | 311 | conventional-changelog-core@^1.8.0: 312 | version "1.8.0" 313 | resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.8.0.tgz#977848b416caf15fb09f20b12a62d40ef145b957" 314 | dependencies: 315 | conventional-changelog-writer "^1.1.0" 316 | conventional-commits-parser "^1.0.0" 317 | dateformat "^1.0.12" 318 | get-pkg-repo "^1.0.0" 319 | git-raw-commits "^1.2.0" 320 | git-remote-origin-url "^2.0.0" 321 | git-semver-tags "^1.2.0" 322 | lodash "^4.0.0" 323 | normalize-package-data "^2.3.5" 324 | q "^1.4.1" 325 | read-pkg "^1.1.0" 326 | read-pkg-up "^1.0.1" 327 | through2 "^2.0.0" 328 | 329 | conventional-changelog-ember@^0.2.5: 330 | version "0.2.5" 331 | resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.5.tgz#ce21d5cf83cd5ebe05d23fdf232d8844f4b56a4f" 332 | dependencies: 333 | q "^1.4.1" 334 | 335 | conventional-changelog-eslint@^0.1.0: 336 | version "0.1.0" 337 | resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.1.0.tgz#a52411e999e0501ce500b856b0a643d0330907e2" 338 | dependencies: 339 | q "^1.4.1" 340 | 341 | conventional-changelog-express@^0.1.0: 342 | version "0.1.0" 343 | resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.1.0.tgz#55c6c841c811962036c037bdbd964a54ae310fce" 344 | dependencies: 345 | q "^1.4.1" 346 | 347 | conventional-changelog-jquery@^0.1.0: 348 | version "0.1.0" 349 | resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" 350 | dependencies: 351 | q "^1.4.1" 352 | 353 | conventional-changelog-jscs@^0.1.0: 354 | version "0.1.0" 355 | resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" 356 | dependencies: 357 | q "^1.4.1" 358 | 359 | conventional-changelog-jshint@^0.1.0: 360 | version "0.1.0" 361 | resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.1.0.tgz#00cab8e9a3317487abd94c4d84671342918d2a07" 362 | dependencies: 363 | compare-func "^1.3.1" 364 | q "^1.4.1" 365 | 366 | conventional-changelog-writer@^1.1.0: 367 | version "1.4.1" 368 | resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-1.4.1.tgz#3f4cb4d003ebb56989d30d345893b52a43639c8e" 369 | dependencies: 370 | compare-func "^1.3.1" 371 | conventional-commits-filter "^1.0.0" 372 | dateformat "^1.0.11" 373 | handlebars "^4.0.2" 374 | json-stringify-safe "^5.0.1" 375 | lodash "^4.0.0" 376 | meow "^3.3.0" 377 | semver "^5.0.1" 378 | split "^1.0.0" 379 | through2 "^2.0.0" 380 | 381 | conventional-changelog@^1.1.0: 382 | version "1.1.3" 383 | resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.3.tgz#26283078ac38c094df2af1604b0a46bbc0165c4d" 384 | dependencies: 385 | conventional-changelog-angular "^1.3.3" 386 | conventional-changelog-atom "^0.1.0" 387 | conventional-changelog-codemirror "^0.1.0" 388 | conventional-changelog-core "^1.8.0" 389 | conventional-changelog-ember "^0.2.5" 390 | conventional-changelog-eslint "^0.1.0" 391 | conventional-changelog-express "^0.1.0" 392 | conventional-changelog-jquery "^0.1.0" 393 | conventional-changelog-jscs "^0.1.0" 394 | conventional-changelog-jshint "^0.1.0" 395 | 396 | conventional-commits-filter@^1.0.0: 397 | version "1.0.0" 398 | resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz#6fc2a659372bc3f2339cf9ffff7e1b0344b93039" 399 | dependencies: 400 | is-subset "^0.1.1" 401 | modify-values "^1.0.0" 402 | 403 | conventional-commits-parser@^1.0.0, conventional-commits-parser@^1.0.1: 404 | version "1.3.0" 405 | resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz#e327b53194e1a7ad5dc63479ee9099a52b024865" 406 | dependencies: 407 | JSONStream "^1.0.4" 408 | is-text-path "^1.0.0" 409 | lodash "^4.2.1" 410 | meow "^3.3.0" 411 | split2 "^2.0.0" 412 | through2 "^2.0.0" 413 | trim-off-newlines "^1.0.0" 414 | 415 | conventional-recommended-bump@^0.3.0: 416 | version "0.3.0" 417 | resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-0.3.0.tgz#e839de8f57cbb43445c8b4967401de0644c425d8" 418 | dependencies: 419 | concat-stream "^1.4.10" 420 | conventional-commits-filter "^1.0.0" 421 | conventional-commits-parser "^1.0.1" 422 | git-latest-semver-tag "^1.0.0" 423 | git-raw-commits "^1.0.0" 424 | meow "^3.3.0" 425 | object-assign "^4.0.1" 426 | 427 | core-util-is@~1.0.0: 428 | version "1.0.2" 429 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 430 | 431 | coveralls@^2.11.2: 432 | version "2.12.0" 433 | resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.12.0.tgz#b3d064108e29728385b56e42fc2d119f43e0e517" 434 | dependencies: 435 | js-yaml "3.6.1" 436 | lcov-parse "0.0.10" 437 | log-driver "1.2.5" 438 | minimist "1.2.0" 439 | request "2.79.0" 440 | 441 | cryptiles@2.x.x: 442 | version "2.0.5" 443 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 444 | dependencies: 445 | boom "2.x.x" 446 | 447 | currently-unhandled@^0.4.1: 448 | version "0.4.1" 449 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 450 | dependencies: 451 | array-find-index "^1.0.1" 452 | 453 | d@^0.1.1, d@~0.1.1: 454 | version "0.1.1" 455 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 456 | dependencies: 457 | es5-ext "~0.10.2" 458 | 459 | dargs@^4.0.1: 460 | version "4.1.0" 461 | resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" 462 | dependencies: 463 | number-is-nan "^1.0.0" 464 | 465 | dashdash@^1.12.0: 466 | version "1.14.1" 467 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 468 | dependencies: 469 | assert-plus "^1.0.0" 470 | 471 | dateformat@^1.0.11, dateformat@^1.0.12: 472 | version "1.0.12" 473 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 474 | dependencies: 475 | get-stdin "^4.0.1" 476 | meow "^3.3.0" 477 | 478 | debug@2.0.0: 479 | version "2.0.0" 480 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.0.0.tgz#89bd9df6732b51256bc6705342bba02ed12131ef" 481 | dependencies: 482 | ms "0.6.2" 483 | 484 | debug@^2.1.1: 485 | version "2.6.3" 486 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" 487 | dependencies: 488 | ms "0.7.2" 489 | 490 | decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: 491 | version "1.2.0" 492 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 493 | 494 | deep-is@~0.1.2, deep-is@~0.1.3: 495 | version "0.1.3" 496 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 497 | 498 | del@^2.0.2: 499 | version "2.2.2" 500 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 501 | dependencies: 502 | globby "^5.0.0" 503 | is-path-cwd "^1.0.0" 504 | is-path-in-cwd "^1.0.0" 505 | object-assign "^4.0.1" 506 | pify "^2.0.0" 507 | pinkie-promise "^2.0.0" 508 | rimraf "^2.2.8" 509 | 510 | delayed-stream@~1.0.0: 511 | version "1.0.0" 512 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 513 | 514 | diff@1.0.8: 515 | version "1.0.8" 516 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.0.8.tgz#343276308ec991b7bc82267ed55bc1411f971666" 517 | 518 | doctrine@^1.2.2: 519 | version "1.5.0" 520 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 521 | dependencies: 522 | esutils "^2.0.2" 523 | isarray "^1.0.0" 524 | 525 | dot-prop@^3.0.0: 526 | version "3.0.0" 527 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" 528 | dependencies: 529 | is-obj "^1.0.0" 530 | 531 | ecc-jsbn@~0.1.1: 532 | version "0.1.1" 533 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 534 | dependencies: 535 | jsbn "~0.1.0" 536 | 537 | emojis-list@^2.0.0: 538 | version "2.1.0" 539 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 540 | 541 | error-ex@^1.2.0: 542 | version "1.3.1" 543 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 544 | dependencies: 545 | is-arrayish "^0.2.1" 546 | 547 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 548 | version "0.10.13" 549 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.13.tgz#a390ab717bde1ce3b4cbaeabe23ca8fbddcb06f6" 550 | dependencies: 551 | es6-iterator "2" 552 | es6-symbol "~3.1" 553 | 554 | es6-iterator@2: 555 | version "2.0.0" 556 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 557 | dependencies: 558 | d "^0.1.1" 559 | es5-ext "^0.10.7" 560 | es6-symbol "3" 561 | 562 | es6-map@^0.1.3: 563 | version "0.1.4" 564 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 565 | dependencies: 566 | d "~0.1.1" 567 | es5-ext "~0.10.11" 568 | es6-iterator "2" 569 | es6-set "~0.1.3" 570 | es6-symbol "~3.1.0" 571 | event-emitter "~0.3.4" 572 | 573 | es6-set@~0.1.3: 574 | version "0.1.4" 575 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 576 | dependencies: 577 | d "~0.1.1" 578 | es5-ext "~0.10.11" 579 | es6-iterator "2" 580 | es6-symbol "3" 581 | event-emitter "~0.3.4" 582 | 583 | es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: 584 | version "3.1.0" 585 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 586 | dependencies: 587 | d "~0.1.1" 588 | es5-ext "~0.10.11" 589 | 590 | es6-weak-map@^2.0.1: 591 | version "2.0.1" 592 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 593 | dependencies: 594 | d "^0.1.1" 595 | es5-ext "^0.10.8" 596 | es6-iterator "2" 597 | es6-symbol "3" 598 | 599 | escape-string-regexp@1.0.2: 600 | version "1.0.2" 601 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" 602 | 603 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 604 | version "1.0.5" 605 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 606 | 607 | escodegen@1.7.x: 608 | version "1.7.1" 609 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.7.1.tgz#30ecfcf66ca98dc67cd2fd162abeb6eafa8ce6fc" 610 | dependencies: 611 | esprima "^1.2.2" 612 | estraverse "^1.9.1" 613 | esutils "^2.0.2" 614 | optionator "^0.5.0" 615 | optionalDependencies: 616 | source-map "~0.2.0" 617 | 618 | escope@^3.6.0: 619 | version "3.6.0" 620 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 621 | dependencies: 622 | es6-map "^0.1.3" 623 | es6-weak-map "^2.0.1" 624 | esrecurse "^4.1.0" 625 | estraverse "^4.1.1" 626 | 627 | eslint-plugin-node@^4.0.1: 628 | version "4.2.1" 629 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-4.2.1.tgz#52e8e06595d0be63a25fdc237be5e42b69a46eaa" 630 | dependencies: 631 | ignore "^3.0.11" 632 | minimatch "^3.0.2" 633 | object-assign "^4.0.1" 634 | resolve "^1.1.7" 635 | semver "5.3.0" 636 | 637 | eslint@^3.15.0: 638 | version "3.17.1" 639 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.17.1.tgz#b80ae12d9c406d858406fccda627afce33ea10ea" 640 | dependencies: 641 | babel-code-frame "^6.16.0" 642 | chalk "^1.1.3" 643 | concat-stream "^1.4.6" 644 | debug "^2.1.1" 645 | doctrine "^1.2.2" 646 | escope "^3.6.0" 647 | espree "^3.4.0" 648 | estraverse "^4.2.0" 649 | esutils "^2.0.2" 650 | file-entry-cache "^2.0.0" 651 | glob "^7.0.3" 652 | globals "^9.14.0" 653 | ignore "^3.2.0" 654 | imurmurhash "^0.1.4" 655 | inquirer "^0.12.0" 656 | is-my-json-valid "^2.10.0" 657 | is-resolvable "^1.0.0" 658 | js-yaml "^3.5.1" 659 | json-stable-stringify "^1.0.0" 660 | levn "^0.3.0" 661 | lodash "^4.0.0" 662 | mkdirp "^0.5.0" 663 | natural-compare "^1.4.0" 664 | optionator "^0.8.2" 665 | path-is-inside "^1.0.1" 666 | pluralize "^1.2.1" 667 | progress "^1.1.8" 668 | require-uncached "^1.0.2" 669 | shelljs "^0.7.5" 670 | strip-bom "^3.0.0" 671 | strip-json-comments "~2.0.1" 672 | table "^3.7.8" 673 | text-table "~0.2.0" 674 | user-home "^2.0.0" 675 | 676 | espree@^3.4.0: 677 | version "3.4.0" 678 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d" 679 | dependencies: 680 | acorn "4.0.4" 681 | acorn-jsx "^3.0.0" 682 | 683 | esprima@2.5.x: 684 | version "2.5.0" 685 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.5.0.tgz#f387a46fd344c1b1a39baf8c20bfb43b6d0058cc" 686 | 687 | esprima@^1.2.2: 688 | version "1.2.5" 689 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" 690 | 691 | esprima@^2.6.0: 692 | version "2.7.3" 693 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 694 | 695 | esrecurse@^4.1.0: 696 | version "4.1.0" 697 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 698 | dependencies: 699 | estraverse "~4.1.0" 700 | object-assign "^4.0.1" 701 | 702 | estraverse@^1.9.1: 703 | version "1.9.3" 704 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" 705 | 706 | estraverse@^4.1.1, estraverse@^4.2.0: 707 | version "4.2.0" 708 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 709 | 710 | estraverse@~4.1.0: 711 | version "4.1.1" 712 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 713 | 714 | esutils@^2.0.2: 715 | version "2.0.2" 716 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 717 | 718 | event-emitter@~0.3.4: 719 | version "0.3.4" 720 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 721 | dependencies: 722 | d "~0.1.1" 723 | es5-ext "~0.10.7" 724 | 725 | exit-hook@^1.0.0: 726 | version "1.1.1" 727 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 728 | 729 | extend@~3.0.0: 730 | version "3.0.0" 731 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 732 | 733 | extsprintf@1.0.2: 734 | version "1.0.2" 735 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 736 | 737 | fast-levenshtein@~1.0.0: 738 | version "1.0.7" 739 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" 740 | 741 | fast-levenshtein@~2.0.4: 742 | version "2.0.6" 743 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 744 | 745 | figures@^1.3.5, figures@^1.5.0: 746 | version "1.7.0" 747 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 748 | dependencies: 749 | escape-string-regexp "^1.0.5" 750 | object-assign "^4.1.0" 751 | 752 | file-entry-cache@^2.0.0: 753 | version "2.0.0" 754 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 755 | dependencies: 756 | flat-cache "^1.2.1" 757 | object-assign "^4.0.1" 758 | 759 | fileset@0.2.x: 760 | version "0.2.1" 761 | resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" 762 | dependencies: 763 | glob "5.x" 764 | minimatch "2.x" 765 | 766 | find-up@^1.0.0: 767 | version "1.1.2" 768 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 769 | dependencies: 770 | path-exists "^2.0.0" 771 | pinkie-promise "^2.0.0" 772 | 773 | flat-cache@^1.2.1: 774 | version "1.2.2" 775 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 776 | dependencies: 777 | circular-json "^0.3.1" 778 | del "^2.0.2" 779 | graceful-fs "^4.1.2" 780 | write "^0.2.1" 781 | 782 | forever-agent@~0.6.1: 783 | version "0.6.1" 784 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 785 | 786 | form-data@~2.1.1: 787 | version "2.1.2" 788 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 789 | dependencies: 790 | asynckit "^0.4.0" 791 | combined-stream "^1.0.5" 792 | mime-types "^2.1.12" 793 | 794 | fs-access@^1.0.0: 795 | version "1.0.1" 796 | resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" 797 | dependencies: 798 | null-check "^1.0.0" 799 | 800 | fs.realpath@^1.0.0: 801 | version "1.0.0" 802 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 803 | 804 | generate-function@^2.0.0: 805 | version "2.0.0" 806 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 807 | 808 | generate-object-property@^1.1.0: 809 | version "1.2.0" 810 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 811 | dependencies: 812 | is-property "^1.0.0" 813 | 814 | get-caller-file@^1.0.1: 815 | version "1.0.2" 816 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 817 | 818 | get-pkg-repo@^1.0.0: 819 | version "1.3.0" 820 | resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.3.0.tgz#43c6b4c048b75dd604fc5388edecde557f6335df" 821 | dependencies: 822 | hosted-git-info "^2.1.4" 823 | meow "^3.3.0" 824 | normalize-package-data "^2.3.0" 825 | parse-github-repo-url "^1.3.0" 826 | through2 "^2.0.0" 827 | 828 | get-stdin@^4.0.1: 829 | version "4.0.1" 830 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 831 | 832 | getpass@^0.1.1: 833 | version "0.1.6" 834 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 835 | dependencies: 836 | assert-plus "^1.0.0" 837 | 838 | git-latest-semver-tag@^1.0.0: 839 | version "1.0.2" 840 | resolved "https://registry.yarnpkg.com/git-latest-semver-tag/-/git-latest-semver-tag-1.0.2.tgz#061130cbf4274111cc6be4612b3ff3a6d93e2660" 841 | dependencies: 842 | git-semver-tags "^1.1.2" 843 | meow "^3.3.0" 844 | 845 | git-raw-commits@^1.0.0, git-raw-commits@^1.2.0: 846 | version "1.2.0" 847 | resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.2.0.tgz#0f3a8bfd99ae0f2d8b9224d58892975e9a52d03c" 848 | dependencies: 849 | dargs "^4.0.1" 850 | lodash.template "^4.0.2" 851 | meow "^3.3.0" 852 | split2 "^2.0.0" 853 | through2 "^2.0.0" 854 | 855 | git-remote-origin-url@^2.0.0: 856 | version "2.0.0" 857 | resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" 858 | dependencies: 859 | gitconfiglocal "^1.0.0" 860 | pify "^2.3.0" 861 | 862 | git-semver-tags@^1.1.2, git-semver-tags@^1.2.0: 863 | version "1.2.0" 864 | resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.2.0.tgz#b31fd02c8ab578bd6c9b5cacca5e1c64c1177ac1" 865 | dependencies: 866 | meow "^3.3.0" 867 | semver "^5.0.1" 868 | 869 | gitconfiglocal@^1.0.0: 870 | version "1.0.0" 871 | resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" 872 | dependencies: 873 | ini "^1.3.2" 874 | 875 | github-url-from-git@^1.4.0: 876 | version "1.5.0" 877 | resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" 878 | 879 | glob@3.2.3: 880 | version "3.2.3" 881 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" 882 | dependencies: 883 | graceful-fs "~2.0.0" 884 | inherits "2" 885 | minimatch "~0.2.11" 886 | 887 | glob@5.x: 888 | version "5.0.15" 889 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 890 | dependencies: 891 | inflight "^1.0.4" 892 | inherits "2" 893 | minimatch "2 || 3" 894 | once "^1.3.0" 895 | path-is-absolute "^1.0.0" 896 | 897 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: 898 | version "7.1.1" 899 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 900 | dependencies: 901 | fs.realpath "^1.0.0" 902 | inflight "^1.0.4" 903 | inherits "2" 904 | minimatch "^3.0.2" 905 | once "^1.3.0" 906 | path-is-absolute "^1.0.0" 907 | 908 | globals@^9.14.0: 909 | version "9.16.0" 910 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.16.0.tgz#63e903658171ec2d9f51b1d31de5e2b8dc01fb80" 911 | 912 | globby@^5.0.0: 913 | version "5.0.0" 914 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 915 | dependencies: 916 | array-union "^1.0.1" 917 | arrify "^1.0.0" 918 | glob "^7.0.3" 919 | object-assign "^4.0.1" 920 | pify "^2.0.0" 921 | pinkie-promise "^2.0.0" 922 | 923 | graceful-fs@^4.1.2: 924 | version "4.1.11" 925 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 926 | 927 | graceful-fs@~2.0.0: 928 | version "2.0.3" 929 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" 930 | 931 | "graceful-readlink@>= 1.0.0": 932 | version "1.0.1" 933 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 934 | 935 | growl@1.8.1: 936 | version "1.8.1" 937 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428" 938 | 939 | handlebars@^4.0.1, handlebars@^4.0.2: 940 | version "4.0.6" 941 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" 942 | dependencies: 943 | async "^1.4.0" 944 | optimist "^0.6.1" 945 | source-map "^0.4.4" 946 | optionalDependencies: 947 | uglify-js "^2.6" 948 | 949 | har-validator@~2.0.6: 950 | version "2.0.6" 951 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 952 | dependencies: 953 | chalk "^1.1.1" 954 | commander "^2.9.0" 955 | is-my-json-valid "^2.12.4" 956 | pinkie-promise "^2.0.0" 957 | 958 | has-ansi@^2.0.0: 959 | version "2.0.0" 960 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 961 | dependencies: 962 | ansi-regex "^2.0.0" 963 | 964 | has-flag@^1.0.0: 965 | version "1.0.0" 966 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 967 | 968 | hawk@~3.1.3: 969 | version "3.1.3" 970 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 971 | dependencies: 972 | boom "2.x.x" 973 | cryptiles "2.x.x" 974 | hoek "2.x.x" 975 | sntp "1.x.x" 976 | 977 | hoek@2.x.x: 978 | version "2.16.3" 979 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 980 | 981 | hosted-git-info@^2.1.4: 982 | version "2.2.0" 983 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" 984 | 985 | http-signature@~1.1.0: 986 | version "1.1.1" 987 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 988 | dependencies: 989 | assert-plus "^0.2.0" 990 | jsprim "^1.2.2" 991 | sshpk "^1.7.0" 992 | 993 | ignore@^3.0.11, ignore@^3.2.0: 994 | version "3.2.4" 995 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.4.tgz#4055e03596729a8fabe45a43c100ad5ed815c4e8" 996 | 997 | imurmurhash@^0.1.4: 998 | version "0.1.4" 999 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1000 | 1001 | indent-string@^2.1.0: 1002 | version "2.1.0" 1003 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 1004 | dependencies: 1005 | repeating "^2.0.0" 1006 | 1007 | inflight@^1.0.4: 1008 | version "1.0.6" 1009 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1010 | dependencies: 1011 | once "^1.3.0" 1012 | wrappy "1" 1013 | 1014 | inherits@2, inherits@^2.0.3, inherits@~2.0.1: 1015 | version "2.0.3" 1016 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1017 | 1018 | ini@^1.3.2: 1019 | version "1.3.4" 1020 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1021 | 1022 | inquirer@^0.12.0: 1023 | version "0.12.0" 1024 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 1025 | dependencies: 1026 | ansi-escapes "^1.1.0" 1027 | ansi-regex "^2.0.0" 1028 | chalk "^1.0.0" 1029 | cli-cursor "^1.0.1" 1030 | cli-width "^2.0.0" 1031 | figures "^1.3.5" 1032 | lodash "^4.3.0" 1033 | readline2 "^1.0.1" 1034 | run-async "^0.1.0" 1035 | rx-lite "^3.1.2" 1036 | string-width "^1.0.1" 1037 | strip-ansi "^3.0.0" 1038 | through "^2.3.6" 1039 | 1040 | interpret@^1.0.0: 1041 | version "1.0.1" 1042 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 1043 | 1044 | invert-kv@^1.0.0: 1045 | version "1.0.0" 1046 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1047 | 1048 | is-arrayish@^0.2.1: 1049 | version "0.2.1" 1050 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1051 | 1052 | is-buffer@^1.0.2: 1053 | version "1.1.5" 1054 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1055 | 1056 | is-builtin-module@^1.0.0: 1057 | version "1.0.0" 1058 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1059 | dependencies: 1060 | builtin-modules "^1.0.0" 1061 | 1062 | is-finite@^1.0.0: 1063 | version "1.0.2" 1064 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1065 | dependencies: 1066 | number-is-nan "^1.0.0" 1067 | 1068 | is-fullwidth-code-point@^1.0.0: 1069 | version "1.0.0" 1070 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1071 | dependencies: 1072 | number-is-nan "^1.0.0" 1073 | 1074 | is-fullwidth-code-point@^2.0.0: 1075 | version "2.0.0" 1076 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1077 | 1078 | is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: 1079 | version "2.16.0" 1080 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" 1081 | dependencies: 1082 | generate-function "^2.0.0" 1083 | generate-object-property "^1.1.0" 1084 | jsonpointer "^4.0.0" 1085 | xtend "^4.0.0" 1086 | 1087 | is-obj@^1.0.0: 1088 | version "1.0.1" 1089 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1090 | 1091 | is-path-cwd@^1.0.0: 1092 | version "1.0.0" 1093 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1094 | 1095 | is-path-in-cwd@^1.0.0: 1096 | version "1.0.0" 1097 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1098 | dependencies: 1099 | is-path-inside "^1.0.0" 1100 | 1101 | is-path-inside@^1.0.0: 1102 | version "1.0.0" 1103 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1104 | dependencies: 1105 | path-is-inside "^1.0.1" 1106 | 1107 | is-property@^1.0.0: 1108 | version "1.0.2" 1109 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1110 | 1111 | is-resolvable@^1.0.0: 1112 | version "1.0.0" 1113 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 1114 | dependencies: 1115 | tryit "^1.0.1" 1116 | 1117 | is-subset@^0.1.1: 1118 | version "0.1.1" 1119 | resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" 1120 | 1121 | is-text-path@^1.0.0: 1122 | version "1.0.1" 1123 | resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" 1124 | dependencies: 1125 | text-extensions "^1.0.0" 1126 | 1127 | is-typedarray@~1.0.0: 1128 | version "1.0.0" 1129 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1130 | 1131 | is-utf8@^0.2.0: 1132 | version "0.2.1" 1133 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1134 | 1135 | isarray@^1.0.0, isarray@~1.0.0: 1136 | version "1.0.0" 1137 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1138 | 1139 | isexe@^1.1.1: 1140 | version "1.1.2" 1141 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 1142 | 1143 | isstream@~0.1.2: 1144 | version "0.1.2" 1145 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1146 | 1147 | istanbul@^0.3.14: 1148 | version "0.3.22" 1149 | resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.3.22.tgz#3e164d85021fe19c985d1f0e7ef0c3e22d012eb6" 1150 | dependencies: 1151 | abbrev "1.0.x" 1152 | async "1.x" 1153 | escodegen "1.7.x" 1154 | esprima "2.5.x" 1155 | fileset "0.2.x" 1156 | handlebars "^4.0.1" 1157 | js-yaml "3.x" 1158 | mkdirp "0.5.x" 1159 | nopt "3.x" 1160 | once "1.x" 1161 | resolve "1.1.x" 1162 | supports-color "^3.1.0" 1163 | which "^1.1.1" 1164 | wordwrap "^1.0.0" 1165 | 1166 | jade@0.26.3: 1167 | version "0.26.3" 1168 | resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" 1169 | dependencies: 1170 | commander "0.6.1" 1171 | mkdirp "0.3.0" 1172 | 1173 | jodid25519@^1.0.0: 1174 | version "1.0.2" 1175 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1176 | dependencies: 1177 | jsbn "~0.1.0" 1178 | 1179 | js-tokens@^3.0.0: 1180 | version "3.0.1" 1181 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1182 | 1183 | js-yaml@3.6.1, js-yaml@3.x, js-yaml@^3.5.1: 1184 | version "3.6.1" 1185 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" 1186 | dependencies: 1187 | argparse "^1.0.7" 1188 | esprima "^2.6.0" 1189 | 1190 | jsbn@~0.1.0: 1191 | version "0.1.1" 1192 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1193 | 1194 | json-schema@0.2.3: 1195 | version "0.2.3" 1196 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1197 | 1198 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 1199 | version "1.0.1" 1200 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1201 | dependencies: 1202 | jsonify "~0.0.0" 1203 | 1204 | json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: 1205 | version "5.0.1" 1206 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1207 | 1208 | json5@^0.5.0: 1209 | version "0.5.1" 1210 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1211 | 1212 | jsonify@~0.0.0: 1213 | version "0.0.0" 1214 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1215 | 1216 | jsonparse@^1.2.0: 1217 | version "1.3.0" 1218 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8" 1219 | 1220 | jsonpointer@^4.0.0: 1221 | version "4.0.1" 1222 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 1223 | 1224 | jsprim@^1.2.2: 1225 | version "1.4.0" 1226 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 1227 | dependencies: 1228 | assert-plus "1.0.0" 1229 | extsprintf "1.0.2" 1230 | json-schema "0.2.3" 1231 | verror "1.3.6" 1232 | 1233 | kind-of@^3.0.2: 1234 | version "3.1.0" 1235 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" 1236 | dependencies: 1237 | is-buffer "^1.0.2" 1238 | 1239 | lazy-cache@^1.0.3: 1240 | version "1.0.4" 1241 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1242 | 1243 | lcid@^1.0.0: 1244 | version "1.0.0" 1245 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1246 | dependencies: 1247 | invert-kv "^1.0.0" 1248 | 1249 | lcov-parse@0.0.10: 1250 | version "0.0.10" 1251 | resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" 1252 | 1253 | levn@^0.3.0, levn@~0.3.0: 1254 | version "0.3.0" 1255 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1256 | dependencies: 1257 | prelude-ls "~1.1.2" 1258 | type-check "~0.3.2" 1259 | 1260 | levn@~0.2.5: 1261 | version "0.2.5" 1262 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" 1263 | dependencies: 1264 | prelude-ls "~1.1.0" 1265 | type-check "~0.3.1" 1266 | 1267 | load-json-file@^1.0.0: 1268 | version "1.1.0" 1269 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1270 | dependencies: 1271 | graceful-fs "^4.1.2" 1272 | parse-json "^2.2.0" 1273 | pify "^2.0.0" 1274 | pinkie-promise "^2.0.0" 1275 | strip-bom "^2.0.0" 1276 | 1277 | lodash._reinterpolate@~3.0.0: 1278 | version "3.0.0" 1279 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 1280 | 1281 | lodash.template@^4.0.2: 1282 | version "4.4.0" 1283 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" 1284 | dependencies: 1285 | lodash._reinterpolate "~3.0.0" 1286 | lodash.templatesettings "^4.0.0" 1287 | 1288 | lodash.templatesettings@^4.0.0: 1289 | version "4.1.0" 1290 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" 1291 | dependencies: 1292 | lodash._reinterpolate "~3.0.0" 1293 | 1294 | lodash@^4.0.0, lodash@^4.2.1, lodash@^4.3.0: 1295 | version "4.17.4" 1296 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1297 | 1298 | log-driver@1.2.5: 1299 | version "1.2.5" 1300 | resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" 1301 | 1302 | longest@^1.0.1: 1303 | version "1.0.1" 1304 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1305 | 1306 | loud-rejection@^1.0.0: 1307 | version "1.6.0" 1308 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1309 | dependencies: 1310 | currently-unhandled "^0.4.1" 1311 | signal-exit "^3.0.0" 1312 | 1313 | lru-cache@2: 1314 | version "2.7.3" 1315 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 1316 | 1317 | map-obj@^1.0.0, map-obj@^1.0.1: 1318 | version "1.0.1" 1319 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1320 | 1321 | meow@^3.3.0: 1322 | version "3.7.0" 1323 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1324 | dependencies: 1325 | camelcase-keys "^2.0.0" 1326 | decamelize "^1.1.2" 1327 | loud-rejection "^1.0.0" 1328 | map-obj "^1.0.1" 1329 | minimist "^1.1.3" 1330 | normalize-package-data "^2.3.4" 1331 | object-assign "^4.0.1" 1332 | read-pkg-up "^1.0.1" 1333 | redent "^1.0.0" 1334 | trim-newlines "^1.0.0" 1335 | 1336 | mime-db@~1.26.0: 1337 | version "1.26.0" 1338 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" 1339 | 1340 | mime-types@^2.1.12, mime-types@~2.1.7: 1341 | version "2.1.14" 1342 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" 1343 | dependencies: 1344 | mime-db "~1.26.0" 1345 | 1346 | "minimatch@2 || 3", minimatch@^3.0.2: 1347 | version "3.0.3" 1348 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1349 | dependencies: 1350 | brace-expansion "^1.0.0" 1351 | 1352 | minimatch@2.x: 1353 | version "2.0.10" 1354 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" 1355 | dependencies: 1356 | brace-expansion "^1.0.0" 1357 | 1358 | minimatch@~0.2.11: 1359 | version "0.2.14" 1360 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" 1361 | dependencies: 1362 | lru-cache "2" 1363 | sigmund "~1.0.0" 1364 | 1365 | minimist@0.0.8, minimist@~0.0.1: 1366 | version "0.0.8" 1367 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1368 | 1369 | minimist@1.2.0, minimist@^1.1.3: 1370 | version "1.2.0" 1371 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1372 | 1373 | mkdirp@0.3.0: 1374 | version "0.3.0" 1375 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" 1376 | 1377 | mkdirp@0.5.0: 1378 | version "0.5.0" 1379 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" 1380 | dependencies: 1381 | minimist "0.0.8" 1382 | 1383 | mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: 1384 | version "0.5.1" 1385 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1386 | dependencies: 1387 | minimist "0.0.8" 1388 | 1389 | mocha@^1.21.4: 1390 | version "1.21.5" 1391 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-1.21.5.tgz#7c58b09174df976e434a23b1e8d639873fc529e9" 1392 | dependencies: 1393 | commander "2.3.0" 1394 | debug "2.0.0" 1395 | diff "1.0.8" 1396 | escape-string-regexp "1.0.2" 1397 | glob "3.2.3" 1398 | growl "1.8.1" 1399 | jade "0.26.3" 1400 | mkdirp "0.5.0" 1401 | 1402 | modify-values@^1.0.0: 1403 | version "1.0.0" 1404 | resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" 1405 | 1406 | ms@0.6.2: 1407 | version "0.6.2" 1408 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c" 1409 | 1410 | ms@0.7.2: 1411 | version "0.7.2" 1412 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 1413 | 1414 | mute-stream@0.0.5: 1415 | version "0.0.5" 1416 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 1417 | 1418 | natural-compare@^1.4.0: 1419 | version "1.4.0" 1420 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1421 | 1422 | nopt@3.x: 1423 | version "3.0.6" 1424 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1425 | dependencies: 1426 | abbrev "1" 1427 | 1428 | normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: 1429 | version "2.3.6" 1430 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff" 1431 | dependencies: 1432 | hosted-git-info "^2.1.4" 1433 | is-builtin-module "^1.0.0" 1434 | semver "2 || 3 || 4 || 5" 1435 | validate-npm-package-license "^3.0.1" 1436 | 1437 | null-check@^1.0.0: 1438 | version "1.0.0" 1439 | resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" 1440 | 1441 | number-is-nan@^1.0.0: 1442 | version "1.0.1" 1443 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1444 | 1445 | oauth-sign@~0.8.1: 1446 | version "0.8.2" 1447 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1448 | 1449 | object-assign@^4.0.1, object-assign@^4.1.0: 1450 | version "4.1.1" 1451 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1452 | 1453 | once@1.x, once@^1.3.0: 1454 | version "1.4.0" 1455 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1456 | dependencies: 1457 | wrappy "1" 1458 | 1459 | onetime@^1.0.0: 1460 | version "1.1.0" 1461 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 1462 | 1463 | optimist@^0.6.1: 1464 | version "0.6.1" 1465 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1466 | dependencies: 1467 | minimist "~0.0.1" 1468 | wordwrap "~0.0.2" 1469 | 1470 | optionator@^0.5.0: 1471 | version "0.5.0" 1472 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.5.0.tgz#b75a8995a2d417df25b6e4e3862f50aa88651368" 1473 | dependencies: 1474 | deep-is "~0.1.2" 1475 | fast-levenshtein "~1.0.0" 1476 | levn "~0.2.5" 1477 | prelude-ls "~1.1.1" 1478 | type-check "~0.3.1" 1479 | wordwrap "~0.0.2" 1480 | 1481 | optionator@^0.8.2: 1482 | version "0.8.2" 1483 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1484 | dependencies: 1485 | deep-is "~0.1.3" 1486 | fast-levenshtein "~2.0.4" 1487 | levn "~0.3.0" 1488 | prelude-ls "~1.1.2" 1489 | type-check "~0.3.2" 1490 | wordwrap "~1.0.0" 1491 | 1492 | os-homedir@^1.0.0: 1493 | version "1.0.2" 1494 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1495 | 1496 | os-locale@^1.4.0: 1497 | version "1.4.0" 1498 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1499 | dependencies: 1500 | lcid "^1.0.0" 1501 | 1502 | parse-github-repo-url@^1.3.0: 1503 | version "1.4.0" 1504 | resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.0.tgz#286c53e2c9962e0641649ee3ac9508fca4dd959c" 1505 | 1506 | parse-json@^2.2.0: 1507 | version "2.2.0" 1508 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1509 | dependencies: 1510 | error-ex "^1.2.0" 1511 | 1512 | path-exists@^2.0.0: 1513 | version "2.1.0" 1514 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1515 | dependencies: 1516 | pinkie-promise "^2.0.0" 1517 | 1518 | path-is-absolute@^1.0.0: 1519 | version "1.0.1" 1520 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1521 | 1522 | path-is-inside@^1.0.1: 1523 | version "1.0.2" 1524 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1525 | 1526 | path-parse@^1.0.5: 1527 | version "1.0.5" 1528 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1529 | 1530 | path-type@^1.0.0: 1531 | version "1.1.0" 1532 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1533 | dependencies: 1534 | graceful-fs "^4.1.2" 1535 | pify "^2.0.0" 1536 | pinkie-promise "^2.0.0" 1537 | 1538 | pify@^2.0.0, pify@^2.3.0: 1539 | version "2.3.0" 1540 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1541 | 1542 | pinkie-promise@^2.0.0: 1543 | version "2.0.1" 1544 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1545 | dependencies: 1546 | pinkie "^2.0.0" 1547 | 1548 | pinkie@^2.0.0: 1549 | version "2.0.4" 1550 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1551 | 1552 | pluralize@^1.2.1: 1553 | version "1.2.1" 1554 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 1555 | 1556 | prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: 1557 | version "1.1.2" 1558 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1559 | 1560 | process-nextick-args@~1.0.6: 1561 | version "1.0.7" 1562 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1563 | 1564 | progress@^1.1.8: 1565 | version "1.1.8" 1566 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 1567 | 1568 | punycode@^1.4.1: 1569 | version "1.4.1" 1570 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1571 | 1572 | q@^1.4.1: 1573 | version "1.4.1" 1574 | resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" 1575 | 1576 | qs@~6.3.0: 1577 | version "6.3.2" 1578 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" 1579 | 1580 | read-pkg-up@^1.0.1: 1581 | version "1.0.1" 1582 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1583 | dependencies: 1584 | find-up "^1.0.0" 1585 | read-pkg "^1.0.0" 1586 | 1587 | read-pkg@^1.0.0, read-pkg@^1.1.0: 1588 | version "1.1.0" 1589 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1590 | dependencies: 1591 | load-json-file "^1.0.0" 1592 | normalize-package-data "^2.3.2" 1593 | path-type "^1.0.0" 1594 | 1595 | readable-stream@^2.1.5, readable-stream@^2.2.2: 1596 | version "2.2.5" 1597 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.5.tgz#a0b187304e05bab01a4ce2b4cc9c607d5aa1d606" 1598 | dependencies: 1599 | buffer-shims "^1.0.0" 1600 | core-util-is "~1.0.0" 1601 | inherits "~2.0.1" 1602 | isarray "~1.0.0" 1603 | process-nextick-args "~1.0.6" 1604 | string_decoder "~0.10.x" 1605 | util-deprecate "~1.0.1" 1606 | 1607 | readline2@^1.0.1: 1608 | version "1.0.1" 1609 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 1610 | dependencies: 1611 | code-point-at "^1.0.0" 1612 | is-fullwidth-code-point "^1.0.0" 1613 | mute-stream "0.0.5" 1614 | 1615 | rechoir@^0.6.2: 1616 | version "0.6.2" 1617 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 1618 | dependencies: 1619 | resolve "^1.1.6" 1620 | 1621 | redent@^1.0.0: 1622 | version "1.0.0" 1623 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1624 | dependencies: 1625 | indent-string "^2.1.0" 1626 | strip-indent "^1.0.1" 1627 | 1628 | repeat-string@^1.5.2: 1629 | version "1.6.1" 1630 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1631 | 1632 | repeating@^2.0.0: 1633 | version "2.0.1" 1634 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1635 | dependencies: 1636 | is-finite "^1.0.0" 1637 | 1638 | request@2.79.0: 1639 | version "2.79.0" 1640 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 1641 | dependencies: 1642 | aws-sign2 "~0.6.0" 1643 | aws4 "^1.2.1" 1644 | caseless "~0.11.0" 1645 | combined-stream "~1.0.5" 1646 | extend "~3.0.0" 1647 | forever-agent "~0.6.1" 1648 | form-data "~2.1.1" 1649 | har-validator "~2.0.6" 1650 | hawk "~3.1.3" 1651 | http-signature "~1.1.0" 1652 | is-typedarray "~1.0.0" 1653 | isstream "~0.1.2" 1654 | json-stringify-safe "~5.0.1" 1655 | mime-types "~2.1.7" 1656 | oauth-sign "~0.8.1" 1657 | qs "~6.3.0" 1658 | stringstream "~0.0.4" 1659 | tough-cookie "~2.3.0" 1660 | tunnel-agent "~0.4.1" 1661 | uuid "^3.0.0" 1662 | 1663 | require-directory@^2.1.1: 1664 | version "2.1.1" 1665 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1666 | 1667 | require-main-filename@^1.0.1: 1668 | version "1.0.1" 1669 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1670 | 1671 | require-uncached@^1.0.2: 1672 | version "1.0.3" 1673 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1674 | dependencies: 1675 | caller-path "^0.1.0" 1676 | resolve-from "^1.0.0" 1677 | 1678 | resolve-from@^1.0.0: 1679 | version "1.0.1" 1680 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1681 | 1682 | resolve@1.1.x: 1683 | version "1.1.7" 1684 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 1685 | 1686 | resolve@^1.1.6, resolve@^1.1.7: 1687 | version "1.3.2" 1688 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" 1689 | dependencies: 1690 | path-parse "^1.0.5" 1691 | 1692 | restore-cursor@^1.0.1: 1693 | version "1.0.1" 1694 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 1695 | dependencies: 1696 | exit-hook "^1.0.0" 1697 | onetime "^1.0.0" 1698 | 1699 | right-align@^0.1.1: 1700 | version "0.1.3" 1701 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1702 | dependencies: 1703 | align-text "^0.1.1" 1704 | 1705 | rimraf@^2.2.8: 1706 | version "2.6.1" 1707 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1708 | dependencies: 1709 | glob "^7.0.5" 1710 | 1711 | run-async@^0.1.0: 1712 | version "0.1.0" 1713 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 1714 | dependencies: 1715 | once "^1.3.0" 1716 | 1717 | rx-lite@^3.1.2: 1718 | version "3.1.2" 1719 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 1720 | 1721 | "semver@2 || 3 || 4 || 5", semver@5.3.0, semver@^5.0.1, semver@^5.1.0: 1722 | version "5.3.0" 1723 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1724 | 1725 | set-blocking@^2.0.0: 1726 | version "2.0.0" 1727 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1728 | 1729 | shelljs@^0.7.5: 1730 | version "0.7.7" 1731 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" 1732 | dependencies: 1733 | glob "^7.0.0" 1734 | interpret "^1.0.0" 1735 | rechoir "^0.6.2" 1736 | 1737 | sigmund@~1.0.0: 1738 | version "1.0.1" 1739 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 1740 | 1741 | signal-exit@^3.0.0: 1742 | version "3.0.2" 1743 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1744 | 1745 | slice-ansi@0.0.4: 1746 | version "0.0.4" 1747 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1748 | 1749 | sntp@1.x.x: 1750 | version "1.0.9" 1751 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1752 | dependencies: 1753 | hoek "2.x.x" 1754 | 1755 | source-map@^0.4.4: 1756 | version "0.4.4" 1757 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1758 | dependencies: 1759 | amdefine ">=0.0.4" 1760 | 1761 | source-map@~0.2.0: 1762 | version "0.2.0" 1763 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" 1764 | dependencies: 1765 | amdefine ">=0.0.4" 1766 | 1767 | source-map@~0.5.1: 1768 | version "0.5.6" 1769 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1770 | 1771 | spdx-correct@~1.0.0: 1772 | version "1.0.2" 1773 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1774 | dependencies: 1775 | spdx-license-ids "^1.0.2" 1776 | 1777 | spdx-expression-parse@~1.0.0: 1778 | version "1.0.4" 1779 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1780 | 1781 | spdx-license-ids@^1.0.2: 1782 | version "1.2.2" 1783 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1784 | 1785 | split2@^2.0.0: 1786 | version "2.1.1" 1787 | resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" 1788 | dependencies: 1789 | through2 "^2.0.2" 1790 | 1791 | split@^1.0.0: 1792 | version "1.0.0" 1793 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 1794 | dependencies: 1795 | through "2" 1796 | 1797 | sprintf-js@~1.0.2: 1798 | version "1.0.3" 1799 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1800 | 1801 | sshpk@^1.7.0: 1802 | version "1.11.0" 1803 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77" 1804 | dependencies: 1805 | asn1 "~0.2.3" 1806 | assert-plus "^1.0.0" 1807 | dashdash "^1.12.0" 1808 | getpass "^0.1.1" 1809 | optionalDependencies: 1810 | bcrypt-pbkdf "^1.0.0" 1811 | ecc-jsbn "~0.1.1" 1812 | jodid25519 "^1.0.0" 1813 | jsbn "~0.1.0" 1814 | tweetnacl "~0.14.0" 1815 | 1816 | standard-version@^4.0.0: 1817 | version "4.0.0" 1818 | resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-4.0.0.tgz#e578cefd43ab7b02944bd7569525052eac1b9787" 1819 | dependencies: 1820 | chalk "^1.1.3" 1821 | conventional-changelog "^1.1.0" 1822 | conventional-recommended-bump "^0.3.0" 1823 | figures "^1.5.0" 1824 | fs-access "^1.0.0" 1825 | object-assign "^4.1.0" 1826 | semver "^5.1.0" 1827 | yargs "^6.0.0" 1828 | 1829 | string-width@^1.0.1, string-width@^1.0.2: 1830 | version "1.0.2" 1831 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1832 | dependencies: 1833 | code-point-at "^1.0.0" 1834 | is-fullwidth-code-point "^1.0.0" 1835 | strip-ansi "^3.0.0" 1836 | 1837 | string-width@^2.0.0: 1838 | version "2.0.0" 1839 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1840 | dependencies: 1841 | is-fullwidth-code-point "^2.0.0" 1842 | strip-ansi "^3.0.0" 1843 | 1844 | string_decoder@~0.10.x: 1845 | version "0.10.31" 1846 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1847 | 1848 | stringstream@~0.0.4: 1849 | version "0.0.5" 1850 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1851 | 1852 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1853 | version "3.0.1" 1854 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1855 | dependencies: 1856 | ansi-regex "^2.0.0" 1857 | 1858 | strip-bom@^2.0.0: 1859 | version "2.0.0" 1860 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1861 | dependencies: 1862 | is-utf8 "^0.2.0" 1863 | 1864 | strip-bom@^3.0.0: 1865 | version "3.0.0" 1866 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1867 | 1868 | strip-indent@^1.0.1: 1869 | version "1.0.1" 1870 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1871 | dependencies: 1872 | get-stdin "^4.0.1" 1873 | 1874 | strip-json-comments@~2.0.1: 1875 | version "2.0.1" 1876 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1877 | 1878 | supports-color@^2.0.0: 1879 | version "2.0.0" 1880 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1881 | 1882 | supports-color@^3.1.0: 1883 | version "3.2.3" 1884 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 1885 | dependencies: 1886 | has-flag "^1.0.0" 1887 | 1888 | table@^3.7.8: 1889 | version "3.8.3" 1890 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 1891 | dependencies: 1892 | ajv "^4.7.0" 1893 | ajv-keywords "^1.0.0" 1894 | chalk "^1.1.1" 1895 | lodash "^4.0.0" 1896 | slice-ansi "0.0.4" 1897 | string-width "^2.0.0" 1898 | 1899 | text-extensions@^1.0.0: 1900 | version "1.4.0" 1901 | resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9" 1902 | 1903 | text-table@~0.2.0: 1904 | version "0.2.0" 1905 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1906 | 1907 | through2@^2.0.0, through2@^2.0.2: 1908 | version "2.0.3" 1909 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1910 | dependencies: 1911 | readable-stream "^2.1.5" 1912 | xtend "~4.0.1" 1913 | 1914 | through@2, "through@>=2.2.7 <3", through@^2.3.6: 1915 | version "2.3.8" 1916 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1917 | 1918 | tough-cookie@~2.3.0: 1919 | version "2.3.2" 1920 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1921 | dependencies: 1922 | punycode "^1.4.1" 1923 | 1924 | trim-newlines@^1.0.0: 1925 | version "1.0.0" 1926 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1927 | 1928 | trim-off-newlines@^1.0.0: 1929 | version "1.0.1" 1930 | resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" 1931 | 1932 | tryit@^1.0.1: 1933 | version "1.0.3" 1934 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 1935 | 1936 | tunnel-agent@~0.4.1: 1937 | version "0.4.3" 1938 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1939 | 1940 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1941 | version "0.14.5" 1942 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1943 | 1944 | type-check@~0.3.1, type-check@~0.3.2: 1945 | version "0.3.2" 1946 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1947 | dependencies: 1948 | prelude-ls "~1.1.2" 1949 | 1950 | typedarray@^0.0.6: 1951 | version "0.0.6" 1952 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1953 | 1954 | uglify-js@^2.6: 1955 | version "2.8.12" 1956 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.12.tgz#8a50f5d482243650b7108f6080aa3a6afe2a6c55" 1957 | dependencies: 1958 | source-map "~0.5.1" 1959 | uglify-to-browserify "~1.0.0" 1960 | yargs "~3.10.0" 1961 | 1962 | uglify-to-browserify@~1.0.0: 1963 | version "1.0.2" 1964 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1965 | 1966 | user-home@^2.0.0: 1967 | version "2.0.0" 1968 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 1969 | dependencies: 1970 | os-homedir "^1.0.0" 1971 | 1972 | util-deprecate@~1.0.1: 1973 | version "1.0.2" 1974 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1975 | 1976 | uuid@^3.0.0: 1977 | version "3.0.1" 1978 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1979 | 1980 | validate-npm-package-license@^3.0.1: 1981 | version "3.0.1" 1982 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1983 | dependencies: 1984 | spdx-correct "~1.0.0" 1985 | spdx-expression-parse "~1.0.0" 1986 | 1987 | verror@1.3.6: 1988 | version "1.3.6" 1989 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1990 | dependencies: 1991 | extsprintf "1.0.2" 1992 | 1993 | which-module@^1.0.0: 1994 | version "1.0.0" 1995 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 1996 | 1997 | which@^1.1.1: 1998 | version "1.2.12" 1999 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 2000 | dependencies: 2001 | isexe "^1.1.1" 2002 | 2003 | window-size@0.1.0: 2004 | version "0.1.0" 2005 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 2006 | 2007 | wordwrap@0.0.2: 2008 | version "0.0.2" 2009 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 2010 | 2011 | wordwrap@^1.0.0, wordwrap@~1.0.0: 2012 | version "1.0.0" 2013 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2014 | 2015 | wordwrap@~0.0.2: 2016 | version "0.0.3" 2017 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2018 | 2019 | wrap-ansi@^2.0.0: 2020 | version "2.1.0" 2021 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2022 | dependencies: 2023 | string-width "^1.0.1" 2024 | strip-ansi "^3.0.1" 2025 | 2026 | wrappy@1: 2027 | version "1.0.2" 2028 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2029 | 2030 | write@^0.2.1: 2031 | version "0.2.1" 2032 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 2033 | dependencies: 2034 | mkdirp "^0.5.1" 2035 | 2036 | xtend@^4.0.0, xtend@~4.0.1: 2037 | version "4.0.1" 2038 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2039 | 2040 | y18n@^3.2.1: 2041 | version "3.2.1" 2042 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2043 | 2044 | yargs-parser@^4.2.0: 2045 | version "4.2.1" 2046 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" 2047 | dependencies: 2048 | camelcase "^3.0.0" 2049 | 2050 | yargs@^6.0.0: 2051 | version "6.6.0" 2052 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" 2053 | dependencies: 2054 | camelcase "^3.0.0" 2055 | cliui "^3.2.0" 2056 | decamelize "^1.1.1" 2057 | get-caller-file "^1.0.1" 2058 | os-locale "^1.4.0" 2059 | read-pkg-up "^1.0.1" 2060 | require-directory "^2.1.1" 2061 | require-main-filename "^1.0.1" 2062 | set-blocking "^2.0.0" 2063 | string-width "^1.0.2" 2064 | which-module "^1.0.0" 2065 | y18n "^3.2.1" 2066 | yargs-parser "^4.2.0" 2067 | 2068 | yargs@~3.10.0: 2069 | version "3.10.0" 2070 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 2071 | dependencies: 2072 | camelcase "^1.0.2" 2073 | cliui "^2.1.0" 2074 | decamelize "^1.0.0" 2075 | window-size "0.1.0" 2076 | --------------------------------------------------------------------------------